pytest 框架-第一集:初识
一、标记(mark)功能
1. 创建标记
ini
#创建标记
markers =smoke:冒烟用例users:用户模块order:订单模块
- 解释:在
pytest.ini
配置文件中,使用markers
关键字来定义自定义的标记。这里定义了smoke
(代表冒烟用例)、users
(代表用户模块相关用例)、order
(代表订单模块相关用例) 。这些标记后续可用于给测试用例分类打标签,方便在运行测试时筛选执行特定类别的:- 使用
@pytest.mark.<标记名>
装饰器来给测试函数打标记。test_login
函数被打上了users
标记,表示它属于用户模块相关的测试用例 ;test_register
函数被打上了order
标记,表示它属于订单模块相关的测试用例。 - 这里测试函数定义中出现的
self
参数,如果是在测试类中的方法,self
是合理的,表示类实例本身;如果是普通测试函数,不应该有self
参数。
- 使用
3. 在 pytest.ini 中加入运行时参数
ini
#配置常用运行参数
addopts = -vs -m "users or order"
- 解释:在
pytest.ini
配置文件的addopts
配置项中,-vs
是 pytest 的运行选项,-v
表示显示详细的测试结果信息,-s
表示捕获标准输出(即允许测试函数中的print
语句正常输出内容 ) ;-m
选项用于根据标记表达式筛选测试用例执行,这里的表达式"users or order"
表示运行被标记为users
或者order
的测试用例。
二、运行参数
这是 pytest 测试框架中常用运行参数及选项的说明:
运行参数
-vs
:是-v
和-s
两个参数的组合。-v
:表示输出详细信息,运行测试时会显示每个测试用例的详细执行结果,包括测试用例的名称、执行状态(通过 / 失败)等更多信息,方便了解测试全貌。-s
:用于在测试运行时显示调试信息,允许测试函数中的print
语句正常输出内容,方便在测试过程中打印一些调试信息来辅助排查问题。
--html=./reports/r.html
:用于生成 HTML 格式的测试报告,指定报告生成的路径和文件名。运行测试后,会在./reports
目录下生成名为r.html
的报告文件,通过浏览器打开可直观查看测试结果统计、用例执行情况等信息 。-n=2
:开启多线程运行测试用例,这里n
指定线程数为 2 ,能利用多核 CPU 资源加速测试执行,提升测试效率。--reruns=2
:设置失败用例重跑机制,当测试用例执行失败时,会自动重新运行指定次数(这里是 2 次 ) 。有些测试用例可能因环境等偶然因素失败,重跑可减少误判。
其他
-x
:只要有一个测试用例失败,就立即停止运行后续测试用例。在测试集较大,且希望尽快定位到首个失败点时很有用,避免不必要的测试执行。--maxfail=2
:设定允许失败的用例数量上限,当失败的测试用例达到指定数量(这里是 2 个 ) ,就停止运行剩余测试用例。可用于快速判断测试集整体质量,当失败用例过多时及时终止。-k
:根据测试用例名称中的字符串来筛选并运行测试用例。比如-k "login"
,会运行名称中包含login
字符串的测试用例,方便精准选择特定测试用例运行,提高测试针对性。- -m : 运行对应标记的测试用例
三、Pytest 中控制测试用例执行顺序
在 Pytest 中,测试用例默认按照从上到下的顺序执行。但通过使用@pytest.mark.run(order=X)
装饰器可以改变测试用例的执行顺序 ,其中X
是一个整数,整数越小,该测试用例越先执行。
python
@pytest.mark.run(order=1)
def test_add_user(self):print("增加用户")
@pytest.mark.run(order=1)
:这是一个装饰器,用于指定test_add_user
这个测试用例的执行顺序。这里order=1
表示它会在其他未指定顺序或者指定顺序值比 1 大的测试用例之前执行。
补充示例
假设有另一个测试用例:
@pytest.mark.run(order=2)
def test_delete_user(self):print("删除用户")
四、pytest跳过测试用例
无条件跳过和有条件
五、Pytest 测试用例的前后置
def setup_class(self):print("每个类之前的操作:每个类只执行一次")def teardown_class(self):print("每个类之后的操作:每个类只执行一次")def setup_method(self):print("每个用例之前的操作:每个用例执行一次")def teardown_method(self):print("每个用例之后的操作:每个用例执行一次")
六、部分前后置 Fixture 固件(一般用这个),和代码的耦合性更低。
- 语法:
@pytest.fixture(scope="作用域",autouse="自动/手动",params="参数化",ids="参数化时参数别名",name="固件别名")
- scope 的值(作用域):
- function: 函数
- class: 类
- module: 模块,py 文件
- session: 回话,所有用例
- autouse 是否自动执行:
- True:自动调用
- False:手动调用
ids: 参数化时参数别名
name: 固件别名,简化固件名
注意:一旦有了别名,那么固件名则失效了,只能用别名
七、基础路径设置
- 在 pytest.ini 中加入 base_url,就相当于创建了一个固件
# 基础路径
base_url = "http://192.168.0.100base_url = "
2.在用例中手动去调用这个固件
def test_login(self,exe_sql,base_url):print("登陆测试用例")print(exe_sql,base_url)
七、Fixture 固件一般会结合 conftest.py 文件使用
- conftest.py 文件名是固定的,是 fixture 的容器,专门用于放 fixture。
- 使用 conftest.py 文件中的 fixture 固件,不需要导包,直接用即可。
- 一个 conftest.py 中可以有多个 fixture 固件。
- conftest.py 文件也可以有多个,手动是谁先调用谁先执行,自动是外层的 conftest.py 的优先级比内层的 conftest.py 的优先级高。