pytest的Fixture使用
Pytest测试框架最强大的功能除了丰富的第三方插件外,还有就是它的Fixture和共享Fixture的conftest.py
Fixture一点需要考虑的是初始化与清理,也就是说在一个完整的测试用例中,都必须都得有初始化与清理的部分,这样才是一个完整的测试用例的。Fixture可以很轻松的来解决这部分,还有一点需要说的是Fixture的函数也可以和返回值整合起来,如添加书籍成功后,把数据ID返回来,下面就以查看书籍为案例,那么查看书籍前提是需要添加书籍,这样可以查看,最后把添加的书籍删除,这样一个测试用例执行完成后才符合它的完整流程
使用fixture装饰器来实现部分用例的前后置
@pytest.fixture(scope="",params="",autouse="",ids="",name="")
scope:标记的作用域。function(默认)、class、module、package
params:参数化
autouse:True自动执行,默认是False
ids:当使用params参数化时,给每一个值设置一个变量名,意义不大
name:给标记的方法取一个别名
1、scope,默认是 function,针对函数执行前后置方法 (指定某个测试用例添加前后置)
scope = "function"
import pytest
@pytest.fixture(scope='function')
def test_fixture():
print("\n前置方法,可以实现部分及全部用例的后置")
yield
print("\n后置方法,可以实现部分及全部用例的后置")
class Test_01:
def test_001(self, test_fixture): # 函数以test_开头
a = 1
assert a == 1
def test_002(self):
b = 2
assert b == 2
- 生成前后置
2、scope = "class",针对测试类执行前后置方法 (指定某个测试用例添加前后置)
import pytest
@pytest.fixture(scope='class')
def test_fixture():
print("\n前置方法,可以实现部分及全部用例的后置")
yield
print("\n后置方法,可以实现部分及全部用例的后置")
class Test_01:
def test_001(self, test_fixture): # 函数以test_开头
a = 1
print("test_01 - test_001")
assert a == 1
def test_002(self):
b = 2
print("test_01 - test_002")
assert b == 2
class Test_02:
def test_001(self): # 函数以test_开头
c = 3
print("test_02 - test_001")
assert c == 3
def test_002(self):
d = 4
print("test_02 - test_002")
assert d == 4
执行 Test01 测试类的第一个测试方法时,触发 test_fixture 方法,在整个测试类执行完毕后,执行后置方法
如果 test_fixture 方法放置在 test_002 中,则在执行 test_002 方法触发 test_fixture 方法,在整个测试类执行完毕后,执行后置方法
import pytest
@pytest.fixture(scope='class')
def test_fixture():
print("\n前置方法,可以实现部分及全部用例的后置")
yield
print("\n后置方法,可以实现部分及全部用例的后置")
class Test_01:
def test_001(self): # 函数以test_开头
a = 1
print("test_01 - test_001")
assert a == 1
def test_002(self, test_fixture):
b = 2
print("test_01 - test_002")
assert b == 2
def test_003(self):
b = 3
print("test_01 - test_003")
assert b == 3
3、autouse自动使用:,给当前文件下的所有测试类内的测试方法添加前后置
scope="function", autouse=True
import pytest
@pytest.fixture(scope='function', autouse=True)
def test_fixture():
print("\n前置方法,可以实现部分及全部用例的后置")
yield
print("\n后置方法,可以实现部分及全部用例的后置")
class Test_01:
def test_001(self, test_fixture): # 函数以test_开头
a = 1
assert a == 1
def test_002(self):
b = 2
assert b == 2
class Test_02:
def test_001(self): # 函数以test_开头
c = 3
assert c == 3
def test_002(self):
d = 4
assert d == 4
- 所有方法都加上前后置
4、scope="class", autouse=True,给当前文件下的所有测试类添加前后置
scope="function", autouse=True
import pytest
@pytest.fixture(scope='class', autouse=True)
def test_fixture():
print("\n前置方法,可以实现部分及全部用例的后置")
yield
print("\n后置方法,可以实现部分及全部用例的后置")
class Test_01:
def test_001(self): # 函数以test_开头
a = 1
print("test_01 - test_001")
assert a == 1
def test_002(self):
b = 2
print("test_01 - test_002")
assert b == 2
class Test_02:
def test_001(self): # 函数以test_开头
c = 3
print("test_02 - test_001")
assert c == 3
def test_002(self):
d = 4
print("test_02 - test_002")
assert d == 4
params,用例可以使用提前准备的参数(需要在每个测试方法继承才能实现)
scope="class" 时,每次执行测试类,触发获取一个值,每个值均触发一次执行测试类
scope="function" 时,每次执行测试类,触发获取一个值,每个值均触发一次执行测试类
import pytest
@pytest.fixture(scope="class", autouse=True, params=['成龙','甄子丹'])
def my_fixture(request):
print("\n前置方法,可以实现部分及全部用例的后置")
yield request.param
print("\n后置方法,可以实现部分及全部用例的后置")
class Test_01:
def test_001(self, my_fixture): # 函数以test_开头
a = 1
print("test_01 - test_001 " + my_fixture)
assert a == 1
def test_002(self, my_fixture):
b = 2
print("test_01 - test_002 " + my_fixture)
assert b == 2
class Test_02:
def test_001(self): # 函数以test_开头
c = 3
print("test_02 - test_001 ")
assert c == 3
def test_002(self):
d = 4
print("test_02 - test_002 ")
assert d == 4
想要获取 params 中的值,需要在测试方法中继承 my_fixture 才能使用,因此使用 scope="class", autouse=True 意义不大,在实际应用中,scope、autouse不设置即可
import pytest
@pytest.fixture(params=['成龙','甄子丹'])
def my_fixture(request):
print("\n前置方法,可以实现部分及全部用例的后置")
yield request.param
print("\n后置方法,可以实现部分及全部用例的后置")
class Test_01:
def test_001(self, my_fixture): # 函数以test_开头
a = 1
print("test_01 - test_001 " + my_fixture)
assert a == 1
def test_002(self):
b = 2
print("test_01 - test_002 ")
assert b == 2
class Test_02:
def test_001(self): # 函数以test_开头
c = 3
print("test_02 - test_001 ")
assert c == 3
def test_002(self):
d = 4
print("test_02 - test_002 ")
assert d == 4
name:取别名
通过别名去给测试方法继承
import pytest
@pytest.fixture(params=['成龙','甄子丹'], name="test_01_class")
def my_fixture(request):
print("\n前置方法,可以实现部分及全部用例的后置")
yield request.param
print("\n后置方法,可以实现部分及全部用例的后置")
class Test_01:
def test_001(self, test_01_class): # 函数以test_开头
a = 1
print("test_01 - test_001 " + test_01_class)
assert a == 1
def test_002(self, test_01_class):
b = 2
print("test_01 - test_002 " + test_01_class)
assert b == 2
class Test_02:
def test_001(self): # 函数以test_开头
c = 3
print("test_02 - test_001 ")
assert c == 3
def test_002(self):
d = 4
print("test_02 - test_002 ")
assert d == 4
通过conftest.py和@pytest.fixture()结合使用实现全局的前置应用
conftest.py文件是单独存放的一个夹具配置文件,名称不能更改。
用处可以在不同的py文件中使用同一个fixture函数。
原则上conftest.py需要和运行的用例放到同一层。并且不需要做任何的imprt导入的操作
上层的 conftest.py 定义的@pytest.fixture() 可以在子级目录的测试类使用
参考文档:https://www.cnblogs.com/blog-123/p/14893903.html
conftest.py:
# conftest.py
import pytest
def read_data():
return ['sql111','sql222']
@pytest.fixture(params=read_data(), name="wufantest")
def execute_sql(request):
print('\n执行sql')
yield request.param
print('\n关闭数据库连接')
test_conftest用例类:
import pytest
class Test04:
def test_01(self,wufantest):
print('测试百里守约'+wufantest)
def test_02(self):
print('测试娜可露露')
def test_03(self):
print('测试蔡文姬')