【pytest-6】fixture之conftest实现setup
前言
前面一篇文章详细介绍了setup和teardown的在测试前后可以加一些操作,但是这个是针对整个脚本全局生效的,
设想有以下场景:用例1需要登录,用例2不需要登录,用例3需要登录...这种就无法使用setup和teardown实现
fixture可以让我们自定义测试用例的前置
fixture的优点
- 命名方式灵活,不局限于setup和teardown这几个命名
- conftest.py配置里可以实现数据共享,不需要import就能自动找到fixture
- scope="module"可以实现多个.py跨文件共享前置
- scopr="session"可以实现多个.py跨文件使用一个session来完成多个用例
fixture参数列表
@pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)
'''
使用装饰器标记fixture的功能
可以使用此装饰器(带或不带参数)来定义fixture功能。 fixture功能的名称可以在以后使用
引用它会在运行测试之前调用它:test模块或类可以使用pytest.mark.usefixtures(fixturename标记。
测试功能可以直接使用fixture名称作为输入参数,在这种情况下,夹具实例从fixture返回功能将被注入。
'''
def initFixture():
print("fixture初始化的参数列表")
参数列表解析:
- args scope:scope 有四个级别参数 "function" (默认), "class", "module" or "session". session的作用域:是整个测试会话,即开始执行pytest到结束测试
- args params:可选的参数列表,它将导致fixture函数和所有测试的调用使用它
- args autouse:如果为True,则为所有测试激活fixture func,如果为false(默认)则显示fixture需要参考来激活fixture
- args ids:字符串ID的列表,每个id对应于参数,因此他们是测试id的一部分,如果没有提供id,他们将从params自动生成。
- argd name:fixture的名称。 这默认为装饰函数的名称。 如果fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽; 解决这个问题的一种 方法是将装饰函数命名 “fixture_ <fixturename>”然后使用”@ pytest.fixture(name ='<fixturename>')“”。
注意:Fixtures可以选择使用 yield 语句为测试函数提供它们的值,而不是 return 。 在这种情况下, yield 语句之后的代码块作为拆卸代码执行,而不管测试结果如何。fixture功能必须只产生一次
conftest.py配置
场景1:如果多个.py文件都需要调用这个登录,不能把登录写到用例里面,就直接弄一个配置文件,单独管理一些前置的操作,pytest里面有默认的读取conftest.py里面的配置
conftest.py配置要注意以下点:
conftest.py配置脚本名称是固定的,不能该名称
conftest.py与运行的用例要在同一个package下,且有__init__.py文件
不需要import导入conftest.py,pytest用例会自动查找
示例代码:
conftest.py
#encoding:utf-8 #@Time:2020/11/30 13:54 #@Author:sunny import pytest @pytest.fixture() def login(): print("我是登录")
test_fixt1.py
#encoding:utf-8 #@Time:2020/11/29 14:24 #@Author:sunny import pytest def test_1(login): print("用例1:登录之后的其他操作") def test_2():#不传login print("用例2:不需要登录的其他操作") def test_3(login): print("用例3:登录之后的其他操作") if __name__ == '__main__': pytest.main(['-s','test_fixt1.py'])
test_fixt2.py
#encoding:utf-8 #@Time:2020/11/30 14:03 #@Author:sunny import pytest def test_4(login): print("用例1:登录之后的其他操作") def test_5():#不传login print("用例2:不需要登录的其他操作") if __name__ == '__main__': pytest.main(['-s','test_fixt2.py'])
3.单独运行test_fix1.py和test_fix2.py都能调用到login()方法,这样就能实现一些公共的操作可以单独拿出来了
fixture参数传入(scope="function")
场景2:用例1需要登录,用例2不需要,用例3需要。
test_fixt.py
#encoding:utf-8 #@Time:2020/11/29 14:24 #@Author:sunny import pytest @pytest.fixture() def login(): print("我是登录") def test_1(login): print("用例1:登录之后的其他操作")
def test_2():#不传login print("用例2:不需要登录的其他操作")
def test_3(login): print("用例3:登录之后的其他操作")
if __name__ == '__main__': pytest.main(['-s','test_fixt.py'])
运行结果:
Testing started at 21:33 ... ============================= test session starts ============================= collected 3 items test_fixt.py 我是登录 .用例1:登录之后的其他操作 .用例2:不需要登录的其他操作 我是登录 .用例3:登录之后的其他操作 [100%] ========================== 3 passed in 0.03 seconds =========================== Process finished with exit code 0
如果pytest.fixture()里面没有参数,默认是function,针对的是函数有效。
善于跌倒仍喜爱奔跑~