pytest使用教程(二)
1、fixture
1.1、源码详解
fixture(scope=‘function’,params=None,autouse=False,ids=None,name=None):
scope:可以控制fixture的作用范围,四个级别:“function”(默认),“class”,“module”,“session”
params:一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它。
autouse:是否自动使用,默认为False,
ids:配合params使用,指定每批参数的id号
name:fixture的名称,若为定义,函数名即为fixture名称
1.2、fixture的作用范围
fixture里面有个scope参数可以控制fixture的作用范围:session>module>class>function
-function:每一个函数或方法都会调用(默认为function)
-class:每一个类调用一次,一个类中可以有多个方法
-module:每一个.py文件调用一次,该文件内又有多个function和class
-session:是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module
案例列举
下面展示一些案例,便于理解文字。
案例1—基础
import pytest
@pytest.fixture()
def kk():
#yield之前的部分相当于unittest的setup**方法,即执行用例 “前” 需要完成的事
print("这里是 kk fixture")
yield
#yield之前的部分相当于unittest的teardown**方法,即执行用例 “后” 需要完成的事,(个人认为常用于释放资源)
print(" 这里 end kk fixture")
def test_KKKKK(kk):
print("function KKKKKKK")
print("这里的a是传过来的")
案例2—name参数和scope参数
import pytest
@pytest.fixture(name="b", scope="module")
def kk():
print("这里是 kk fixture")
yield
print(" 这里 end kk fixture")
def test_KKKKK(b):
print("function KKKKKKK")
print("这里的a是传过来的")
案例3—合集
import pytest
@pytest.fixture(name="b", scope="module")
def kk():
print("这里是 kk fixture")
yield
print(" 这里 end kk fixture")
@pytest.fixture(name= "a", scope="function", params=["测试", "从一而终"], ids=["P1", "p2"])
def ka(request):
print("start a fixture")
print(request.param)
yield 2
print("end a fixture ~= teardown")
#此处让它执行两个fixture
def test_KKKKK(a,b):
print("function KKKKKKK")
print("这里的a是传过来的", a)
2、conftest.py与fixture强关联
2.1、conftest使用的注意点:
1、conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件
2、不需要import导入 conftest.py,pytest用例会自动识别该文件
3、conftest.py配置脚本名称是固定的,不能改名称
4、conftest.py文件不能被其他文件导入
5、跨.py文件调用,即与conftest.py同目录下的测试用例文件都可以访问conftest文件(与第一点同理)
6、可有多个conftest.py
个人理解:一个文件夹A中放了一个conftest.py,conftest相当于一个容器,里面放了很多不同的fixture,文件夹A下的测试用例文件test_A.py、test_B.py等都可以使用该conftest。
这样做的好处就是:共享,conftest中有些scope为session或者moudle的fixture只需执行一次,而不需要每个用例中都执行一次
基础的文件结构如下:
(FYI:可以根据需要再不同的目录层级配置conftest.py)