pytest(2) mark功能

这篇博客介绍了如何在Python测试框架pytest中使用标记(mark)来标识测试用例,并通过命令行参数筛选执行特定标签的测试。通过在测试函数或类上应用`@pytest.mark.标签名`,可以方便地组织和选择要运行的测试。当遇到pytest无法识别自定义标签时,需要在pytest.ini配置文件中注册这些标记。文章还展示了如何结合逻辑运算符筛选具有多个标签的测试用例。

1\ 标记测试用例

pytest.mark.标签名

可以用来标记单条测试函数,或者测试类

# 文件名 test_mark.py

import pytest


@pytest.mark.mark_class  # 标记测试类,将标记类中的每一个测试函数
class Test_mark:
    
    def test_case_1(self):
        print("case_1,mark_class")
    
    @pytest.mark.mark_func  # 拥有两个标签 mark_class,mark_func
    def test_case_2(self):
        print("caes_2,mark_class,mark_func")

2\ 根据标签执行测试用例  在命令行输入pytest -m 标签名

在命令行,切换到test_mark.py所在的文件夹,test_mark.py是上面的代码所在文件

输入pytest -m mark_calss  执行有class_class标签的用例

 

 报错了 Unknown pytest.mark.mark_class - is this a typo?

需要注册

在test_mark.py的根目录baidu下,创建pytest.ini文件

 在pytest.ini文件输入以下代码

 addopts = --strict-markers 严格匹配标签名称

markers= ^^^^^ 就是自定义的标签 

[pytest]
addopts = --strict-markers
markers =
    mark_class: marks tests as mark_class (deselect with '-m "not slow"')
    mark_func:marks tests as mark_class

然后就可以运行了,

mark_calss 运行了测试类中的两个标签

 mark_func 只用写一个标签,收集两个用例,执行一个用例

还可以和逻辑运行符筛选用例

pytest -m mark_calss and not mark_func 运行 有mark_calss 但是没有mark_func的用例,标签表达式有双引号,单引号不能识别

 

 

 

pytest 中,`mark` 功能是一种非常灵活的机制,用于给测试用例或测试类添加元数据标签,从而实现对测试用例的选择性执行、分类管理等功能。以下是几种常见的使用方式: ### 1. 标记单个测试函数 可以使用 `@pytest.mark.自定义名称` 的方式为某个测试函数添加标记。例如,使用 `@pytest.mark.web` 来标识该测试属于 Web 测试模块: ```python import pytest @pytest.mark.web def test_web(): assert "web" in "web test!" ``` 这种方式适用于需要单独标记某些测试函数的场景[^4]。 --- ### 2. 标记整个测试类 如果希望一个测试类中的所有测试方法都具有相同的标记,可以在类中定义 `pytestmark` 属性,并为其赋值为对应的 `pytest.mark.自定义名称`。例如,以下代码将 `TestApp` 类中的所有测试方法标记为 `app`: ```python import pytest @pytest.mark.app class TestApp: def test_h5(self): assert 'h5' in "h5, test" def test_wx(self): assert 'wx' in 'wx ,hello' ``` 如果需要为测试类添加多个标记,可以将多个 `pytest.mark.自定义名称` 组合成一个列表赋值给 `pytestmark`: ```python import pytest @pytest.mark.order @pytest.mark.smoke class TestOrder: def test_order(self): print("下单") def test_pay(self): print("支付") ``` 这种写法允许同时应用多个标记,便于更精细地筛选和管理测试用例[^3]。 --- ### 3. 使用命令行参数筛选标记 pytest 提供了 `-m` 参数,可以根据标记筛选并执行特定的测试用例。例如,以下命令仅运行标记为 `web` 的测试: ```bash pytest -v -m web ``` 如果要运行多个标记的测试用例,可以通过逻辑运算符组合标记表达式。例如,以下命令运行标记为 `order` 或 `smoke` 的测试: ```bash pytest -v -m "order or smoke" ``` 此外,也可以通过 `not` 排除某些标记,例如排除所有标记为 `slow` 的测试: ```bash pytest -v -m "not slow" ``` 这种筛选方式非常适合快速定位和执行特定类型的测试用例[^1]。 --- ### 4. 标记测试用例为预期失败 在某些情况下,测试用例可能因为已知问题而预期失败。可以使用 `@pytest.mark.xfail` 装饰器标记测试用例为预期失败: ```python import pytest @pytest.mark.xfail def test_expected_failure(): assert False ``` 如果希望在测试过程中动态决定是否标记为预期失败,可以在测试函数内部调用 `pytest.xfail()` 函数: ```python import pytest def test_function(): if not valid_config(): pytest.xfail("failing configuration (but should work)") ``` 这种机制可以帮助开发者在测试执行前明确哪些失败是预期行为,避免误报错误[^2]。 --- ### 5. 自定义标记 pytest 允许用户自定义标记,但为了确保标记的可用性,建议在 `pytest.ini` 文件中预先声明这些标记。例如,在 `pytest.ini` 中添加以下内容以声明 `web` 和 `app` 标记: ```ini [pytest] markers = web: Mark a test as a web-related test. app: Mark a test as an app-related test. ``` 声明标记后,pytest 将不会在运行时发出关于未注册标记的警告信息。这有助于提高测试脚本的可维护性和清晰度。 --- ### 总结 通过上述方法,可以灵活地使用 `mark` 功能来组织和管理 pytest 测试用例。无论是标记单个测试函数、整个测试类,还是筛选执行特定标记的测试,`mark` 都提供了强大的支持。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值