安全联盟可信网站认证,网站开发人员职位晋升空间,内蒙古城乡建设网站,怎样做推广营销目录#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结#xff08;尾部小惊喜#xff09; 前言
什么是固件
Fixt… 目录导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结尾部小惊喜 前言
什么是固件
Fixture 翻译成中文即是固件的意思。 它其实就是一些函数会在执行测试方法/测试函数之前或之后加载运行它们常见的如接口用例在请求接口前数据库的初始连接和请求之后关闭数据库的操作。
pytest 中提供了功能更加丰富的Fixture用于实现setup、teardown功能。
定义方式
使用pytest.fixture()进行定义简单示例如下
import pytestpytest.fixture()
def before():print(连接数据库)调用方式
调用单个fixture函数 方式一使用fixture函数名作为参数
import pytestpytest.fixture()
def before():print(连接数据库)# 调用before
def test_01(before):print(执行test_01)方式二使用 pytest.mark.usefixtures(‘fixture函数名’)装饰器
import pytestpytest.fixture()
def before():print(连接数据库)# 调用before
pytest.mark.usefixtures(before)
def test_01():print(执行test_01)方式三使用autouse参数自动执行fixture函数
import pytest# fixture函数定义的时候使用autouse参数作用域范围内的测试用例会自动调用该fixture函数
pytest.fixture(autouseTrue)
def before():print(连接数据库)# 自动调用before
def test_01():print(执行test_01)三种方式调用后的结果都如下 我们可以看到先执行了fixture函数再执行测试函数。 1、调用多个fixture函数
import pytestpytest.fixture()
def before():print(连接数据库)pytest.fixture()
def before_s():print(初始化数据)def test_01(before, before_s):print(执行test_01)调用多个 fixture 函数时由前至后依次执行所以test_01()调用时先执行before再执行before_s。
2、对fixture函数重命名 定义fixture函数时可以利用name参数进行重命名方便用于调用示例如下
import pytestpytest.fixture(namedb)
def connect_order_db():print(连接数据库)def test_01(db):print(执行test_01)使用fixture传递测试数据
在执行完fixture函数后有时需要将该fixture中得到到某些数据传递给测试函数/测试方法用于后续的执行。 fixture中提供普通传递和参数化传递两种数据传递方式。
1、普通传递 示例如下
import pytestpytest.fixture()
def before():print(连接数据库)return 连接成功def test_01(before):print(执行test_01)assert before 连接成功注意如果自定义的fixture函数有返回值需要使用上面说的方式一调用才能获取fixture函数的返回值并传入测试函数中方式二就无法获取返回值。
2、参数化传递 对fixture函数进行参数化时需要使用参数params并且需要传入参数request简单示例如下
import pytesttest_params [1, 2, 0]
pytest.fixture(paramstest_params)
def before(request):result request.paramreturn resultdef test_02(before):print(执行test_02)assert beforeif __name__ __main__:pytest.main()执行结果 可以看到因为所调用的fixture函数进行了参数化虽然只有一个测试函数但执行了3次。
conftest.py
上面我们举的例子都是把fixture函数放在测试用例模块里面但如果很多测试模块需要引用同一个fixture函数怎么办这是时候就需要把它放在命名为conftest的模块里这样同级或以下目录中的测试用例便能调用这些自定义的fixture函数。
例如有如下目录
├─testcase
│ │
│ ├─test_module_01
│ │ test_case_1.py
│ │ test_case_2.py
│ │
│ ├─test_module_02
│ │ test_case_3.pytest_module_01 中的test_case_1.py与test_case_2.py都需要调用同一个 fixture 函数那么我们只需要在 test_module_01 中新建conftest.py并编写这个fixture函数即可示例如下
├─testcase
│ │
│ ├─test_module_01
│ │ conftest.py
│ │ test_case_1.py
│ │ test_case_2.py
│ │
│ ├─test_module_02
│ │ test_case_3.pyconftest.py:
import pytestpytest.fixture(autouseTrue)
def before():print(连接数据库)test_case_1.py
def test_01():print(执行test_01)test_case_2.py
def test_02():print(执行test_02)这样执行这两个模块的测试用例时会自动先去调用conftest.py中的before()函数。
假设 test_module_02 中的 test_case_3.py 也需要调用这个before()函数那么这个时候我们就需要在上一层即 testcase 中新建conftest.py并编写这个before()函数才能在 test_case_3.py 中调用如下
├─testcase
│ │ conftest.py
│ │
│ ├─test_module_01
│ │ conftest.py
│ │ test_case_1.py
│ │ test_case_2.py
│ │
│ ├─test_module_02
│ │ test_case_3.pyconftest.py只作用于同级或以下目录中的测试模块且需要注意当以下层级中存在了另一个conftest.py那么以下层级将由另一个conftest.py文件接管。
作用域
pytest 的 fixture 作用域分session、module、class、function四个级别。在定义 fixture 函数的时候通过scope参数指定作用范围默认为function。
session每次会话执行一次 module每个测试模块执行一次 class每个测试类执行一次 function每个测试方法执行一次
注意对于单独定义的测试函数class、function 都会起作用可以从下列示例中看出来。
测试目录结构如下
├─apiAutoTest
│ │ run.py
│ │
│ ├─testcase
│ │ │ conftest.py
│ │ │
│ │ ├─test_module_02
│ │ │ │ conftest.py
│ │ │ │ test_case_3.py
│ │ │ │ test_case_4.py其中conftest.py代码如下
import pytestpytest.fixture(scopesession, autouseTrue)
def session_fixture():print(这是一个作用于session的fixture)pytest.fixture(scopemodule, autouseTrue)
def module_fixture():print(这是一个作用于module的fixture)pytest.fixture(scopeclass, autouseTrue)
def class_fixture():print(这是一个作用于class的fixture)pytest.fixture(scopefunction, autouseTrue)
def function_fixture():print(这是一个作用于function的fixture)test_case_3.py代码如下
import pytestclass TestOrder:def test_a(self):print(test_a)def test_b(self):print(test_b)def test_c():print(test_c)test_case_4.py代码如下
def test_e():print(test_e)run.py代码如下
import pytestif __name__ __main__:pytest.main([-s])运行run.py结果如下
collected 4 itemstestcase\test_module_02\test_case_3.py
这是一个作用于session的fixture
这是一个作用于module的fixture
这是一个作用于class的fixture
这是一个作用于function的fixture
test_a
.这是一个作用于function的fixture
test_b
.这是一个作用于class的fixture
这是一个作用于function的fixture
test_c
.
testcase\test_module_02\test_case_4.py
这是一个作用于module的fixture
这是一个作用于class的fixture
这是一个作用于function的fixture
test_e
. 4 passed in 0.04s 从结果可以看出来
作用于session的fixture函数只在所有测试用例执行之前调用了一次 作用于module的fixture函数在每个测试模块执行之前调用了一次 作用于class的fixture函数在每个测试类执行之前调用了一次 作用于function的fixture函数在每个测试方法/测试函数执行之前调用了一次
注意在定义的测试函数如test_c()、test_e()执行之前也会调用scopeclass的fixture函数。
与 unittest 框架比较pytest 中的Fixture更加丰富可扩展性更高。 Fixture还有很多更加优雅的用法用于自动化测试项目中。
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图
一、Python编程入门到精通 二、接口自动化项目实战 三、Web自动化项目实战 四、App自动化项目实战 五、一线大厂简历 六、测试开发DevOps体系 七、常用自动化测试工具 八、JMeter性能测试 九、总结尾部小惊喜
每一次跌倒都是为了更高的飞翔每一次挫折都是为了更坚强的成长。不惧困难不畏艰险勇往直前追逐梦想。坚持奋斗超越自己终将引领辉煌的人生之巅
不管前方有多少艰险和困难只要心中燃着梦想的火焰就有无限的力量去闯荡。勇往直前坚持不懈唯有奋斗才能书写出属于自己的辉煌篇章
愿你的内心燃起坚定的火焰迎接挑战超越极限。不论前路多坎坷披荆斩棘只有拼搏奋斗才能创造出属于自己的辉煌人生。相信自己永远不言放弃