fixture的用途
pytest fixture 与setup,teardown功能一样,但比之更加灵活,完全可以代替setup,teardown
1.做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture来实现
2.测试用例的前置条件可以使用fixture实现
3.支持经典的xunit fixture ,像unittest使用的setup和teardown
4.fixture可以实现unittest不能实现的功能,比如unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是fixture却可以解决这个问题。
fixture的定义
fixture通过@pytest.fixture()装饰器装饰一个函数,那么这个函数就是一个fixture
import pytest
@pytest.fixture()
def login():
print('登陆方法')
yield #激活fixture teardown方法
print('teardown')
# 测试用例之前,先执行login方法
def test_case1(login):
print('case1')
def test_case2():
print('case2')
def test_case3():
print('case3')
运行结果如下:
test_login.py::test_case2
test_login.py::test_case3
============================== 3 passed in 0.02s ===============================
Process finished with exit code 0
登陆方法
PASSED [ 33%]case1
teardown
PASSED [ 66%]case2
PASSED [100%]case3
fixture源码详解
fixture(scope='function',params=None,autouse=False,ids=None,name=None):
scope:有四个级别参数"function"(默认),“class”,“module”,“session”。
**params:**一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它。
**autouse:**如果True,则为所有测试激活fixture func可以看到它。如果为False则显示需要参考来激活fixture。
**ids:**每个字符串id的列表,每个字符串对应于params这样他们就是测试ID的一部分。如果没有提供ID它们将从params自动生成。
name:fixture的名称。这默认为装饰函数的名称。如果fixture在定义它的统一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽,解决这个问题的一种方法时将装饰函数命。
fixture的作用范围(scope)
fixture里面有个scope参数可以控制fixture的作用范围:session > module > class > function
- function 每一个函数或方法都会调用,默认为function
- class 每一个类调用一次,一个类可以有多个方法
- module,每一个.py文件调用一次,该文件内又有多个function和class
- session 是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module
1、scope='function’
import pytest
@pytest.fixture() #默认为scope='function'
def login():
print('登陆方法')
yield ['username','passwd'] #激活fixture teardown方法
print('teardown')
# 测试用例之前,先执行login方法
def test_case1(login):
print(f'case1 login={login}')
def test_case2(login):
print('case2')
def test_case3(login):
print('case3')
运行结果如下:
============================= test session starts ==============================
platform darwin -- Python 3.6.4, pytest-6.0.2