目录
fixture是pytest框架里做前置后置的功能,可以用于将测试前后进行预备、清理工作的代码处理机制。
fixture和setup/teardown对比有以下优势:
- fixture命名更加灵活,局限性比较小
- conftest.py配置里可以实现数据共享,可以方便管理、修改和查看fixture函数,并且不需要import就能自动找到一些配置
一、fixture用法:
fixture的作用范围(运行顺序): session>module>class>function
-
@pytest.fixture(scope='function', autouse=True)
,每一个函数或方法都会调用,autouse表示默认所有的方法都会调用。@pytest.fixture() # 默认scope是function def func(): print("我是前置步骤") def test_fixture1(func): print("我是方法1") def test_fixture2(): # 默认不会调用fixture print("我是方法2")
-
@pytest.fixture(scope=‘class’)
,每一个类调用一次@pytest.fixture(scope="class", autouse=True) #autouse如果没写的话,类是不会调用前置步骤 def func(self): print("我是前置步骤") class TestdClassFixture: def test_fixture1(self): print("我是方法1") def test_fixture2(self): print("我是方法2")
-
@pytest.fixture(scope=‘module’)
,每一个.py文件调用一次, 即使有多个方法和类也只会执行一次前置步骤。@pytest.fixture(scope="module", autouse=True) #autouse如果没写的话,是不会调用前置步骤 def func(self): print("我是前置步骤") def test_demo(): print("test") class TestdClassFixture: def test_fixture1(self): print("我是方法1") def test_fixture2(self): print("我是方法2")
-
@pytest.fixture(scope='session')
,多个文件调用一次,.py文件就是module,具体例子结合conftest.py进行配置,详看下面的内容。
二、conftest.py
conftest.py是pytest提供的一个重要的功能,可以把一些通用的方法下载conftest里方便使用和维护,类似工具类,使用时要注意以下要求:
- conftest.py的命名是固定写法不可以更改。
- 使用conftest.py里的方法无需导入。
- conftest的函数作用于当前文件夹以及下属的文件夹。
结合fixture进行使用步骤如下:
-
先创建一个conftest.py 文件写入fixture方法。
import pytest @pytest.fixture(scope="session") def test_session(): print("我是session级别的fixture") @pytest.fixture(scope="function") def test_func1() print("我是func级别的fixture")
-
在用例里使用conftest的方法
def test_fixture1(test_func1, test_session): # 写入要调用的方法名
print("我是方法1")
def test_fixture2(): # 默认不会调用fixture
print("我是方法2")
三、pytest 使用conftest返回的数据
实际工作中可能会用到一些前置步骤(数据库)返回的数据,操作如下:
-
在conftest.py里加一个返回数据的方法
def get_params(): json={"username": "username", "password": "password"} return json
-
在用例里使用conftest返回的参数:
def test_login(get_params): # 写入方法名 r = requests.post("/login/", json=get_params)
四、使用yield做后置处理
yield关键字会在用例和前置步骤完成之后进行迭代。
@pytest.fixture(scope="function", autouse=True)
def func():
print("我是前置步骤")
yield
print("我是后置步骤")
五、usefixture的用法
usefixture也是可以用来做前置步骤,不同的是不能接收返回值,调用的时候也不能直接传入方法里,需要用@pytest.mark.userfixtures(“use_fixture”)进行调用,显示上会更加直观。
用法:1. 在conftest.py加入fixture方法
@pytest.fixture(scope="function")
def user_fixture1():
print("我是一个userfixture1")
@pytest.fixture(scope="function")
def user_fixture2():
print("我是一个userfixture2")
2.在用例里调用
@pytest.mark.userfixtures("use_fixture1")
@pytest.mark.userfixtures("use_fixture2")
def test_usefixture():
print("这里使用了usefixture")
六、fixture中的params和ids
@pytest.fixture(params=["text1", "text2"], ids=["case1", "case2"])
def params_fixture(request):
return request.param # request和param为关键字,不能更改
def test_params(params_fixture): # 会根据params执行两条用例并带上ids的标识
print(params_fixture)