本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/30137
Fixture特点及优势
- 命令灵活:对于setup,teardown,可以不起这两个名字
- 数据共享:在conftest.py配置里写方法可以实现数据共享,不需要import导入。可以跨文件共享
- scope的层次及神奇的yield组合相当于各种setup和teardown
- 实现参数化
Fixture在自动化中的基本用法
- 场景
1、测试用例执行时,有的用例需要登陆才能执行,有些用例不需要登陆。
2、setup和teardown无法满足的场景,fixture可以,默认scope(范围)function - 步骤
1、导入pytest
2、在登陆的函数上面加@pytest.fixture()
3、在要使用的测试方法中传入(登陆函数名称),就先登陆
4、不传入的就不登陆直接执行测试方法
Fixture在自动化中的应用-作用域
取值 | 范围 | 说明 |
function | 函数级 | 每一个函数或方法都会调用 |
class | 类级别 | 每个测试类只运行一次 |
module | 模块级 | 每一个.py文件调用一次 |
package | 包级 | 每一个python包只调用一次(暂不支持) |
session | 会话级 | 每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法 |
Fixture在自动化中的应用-yield关键字
- 场景
你已经可以将测试方法[前要执行的或依赖的]解决了 - 解决
通过在fixture函数中加入yield关键字,yield是调用第一次返回结果,第二次执行它下面的语句返回 - 步骤
在@pytest.fixture(scope = module)
在登陆的方法中加yield,之后加销毁清除的步骤
Fixture在自动化中的应用-数据共享
- 场景
与其他测试工程师合作一起开发时,公共的模块要在不同文件中,要在大家都能访问到的地方 - 解决
使用conftest.py
这个文件进行数据共享,并且他可以放在不同位置起者不同的范围共享作用 - 前提
1、conftest文件名是不能换的
2、放在项目下是全局的数据共享的地方 - 执行
1、系统执行到参数login时,先从本模块中查找是否有这个名字的变量
2、之后再在conftest.py
中找是否有这个名字的变量 - 步骤
将登陆模块带@pytest.fixture
写在conftest.py
文件中
Fixture在自动化中的应用-自动应用
- 场景
1、不想原测试方法有任何改动,或者全部都自动实现自动应用
2、没特例,也都不需要返回值时可以选择自动应用 - 解决
使用fixture中参数autouse=True实现 - 步骤:
在方法上面加@pytest.fixture(autouse=True)
Fixture在自动化中的应用-参数化
- 场景
测试离不开数据,为了数据灵活,一般数据都是通过参数传的 - 解决
fixture通过固定参数request传递 - 步骤
1、在fixture中增加@pytest.fixture(params=[1,2,3,‘linda’])
2、在方法参数写request,方法体里面使用request.param接收参数
Fixture的用法总结
- 模拟setup,teardown(一个用例可以引用多个fixture)
- yield的用法
- 作用域(session,module,类级别,方法级别)
- 自动执行(autouse参数)
- conftest.py用法,一般会把fixture写在conftest.py文件中(这个文件名字是固定的,不能改)
- 实现参数化