pytest——04 pytest.mark.xxx

目录

 

使用 @pytest.mark.xxx 标记测试用例

注册、管理 mark 标记

注册 mark 标记:

规范使用 mark 标记

使用Marks标记测试用例

 @pytest.mark.skip

@pytest.mark.skipif  指定条件下跳过

跳过文件或目录

自定义测试集

跳过缺少的导入依赖关系

@pytest.mark.xfail

@pytest.mark.parametrize

1. @pytest.mark.parametrize("参数名",列表数据)

2.参数化集合标记的使用

3. pytest.mark.parametrize 结合fixture使用

@pytest.mark.run(order=1)(需安装pytest-rodering)

@pytest.mark.dependency()(pytest-dependency插件需下载)

 @pytest.make.timeout(60)(需安装pytest-timeout)


使用 @pytest.mark.xxx 标记测试用例


可以标记测试方法、测试类,标记名可以自定义,最好起有意义的名字;
同一测试类/方法可同时拥有多个标记;

# test_login_logout.py
 
import pytest
 
 
@pytest.mark.login
class TestLogin:
    """登陆功能测试类"""
 
    @pytest.mark.smoke
    @pytest.mark.success
    def test_login_sucess(self):
        """登陆成功"""
 
        # 实现登陆逻辑
        pass
 
    @pytest.mark.failed
    def test_login_failed(self):
        """登陆失败"""
 
        # 实现登陆逻辑
        pass
 
 
@pytest.mark.logout
class TestLogout:
    """登出功能测试类"""
 
    @pytest.mark.smoke
    @pytest.mark.success
    def test_logout_sucess(self):
        """登出成功"""
 
        # 实现登出功能
        pass
 
    @pytest.mark.failed
    def test_logout_failed(self):
        """登出失败"""
 
        # 实现登出功能
        pass
运行标记的用例:
使用 -m 参数运行标记的测试用例;
-m 参数支持 and、or 、not 等表达式;
# 运行登陆功能的用例
pytest.main(['-m login'])
# 运行登出功能的用例
pytest.main(['-m logout'])
# 运行功能成功的用例
pytest.main(['-m success'])
# 运行功能失败的用例
pytest.main(['-m failed'])
# 运行登陆功能但是不运行登陆失败的测试用例
pytest.main(['-m login and not failed'])
# 运行登出功能但是不运行登出成功的测试用例
pytest.main(['-m logout and not success'])
# 运行登陆和登出的用例
pytest.main(['-m login or logout'])

注册、管理 mark 标记


当使用 -m 参数执行 mark 标记的用例时,pytest 会发出告警信息 “PytestUnknownMarkWarning: Unknown pytest.mark.login - is this a typo? ”,告诉你这是一个 pytest 未知的一个标记!为了消除告警,我们需要在 pytest 的配置文件中注册 mark 标记!

注册 mark 标记:

注册方式:

1、单个标签:

在conftest.py添加如下代码:

def pytest_configure(config):
  # demo是标签名
  config.addinivalue_line("markers", "demo:示例运行") 

2、多个标签:

在conftest.py添加如下代码:

def pytest_configure(config):
  marker_list = ["testdemo", "demo", "smoke"] # 标签名集合
  for markers in marker_list:
    config.addinivalue_line("markers", markers)

3、添加pytest.ini 配置文件(在你项目的任意一个文件下,新建一个file,文件命名为pytest.ini)

[pytest]
markers=
  smoke:this is a smoke tag
  demo:demo
  testdemo:testdemo

首先在项目根目录创建一个文件 pytest.ini ,这个是 pytest 的配置文件
然后在 pytest.ini 文件的 markers 中写入你的 mark 标记, 冒号 “:” 前面是标记名称,后面是 mark 标记的说明,可以是空字符串;
注意:pytest.ini 文件中只能使用纯英文字符,绝对不能使用中文的字符(尤其是冒号和空格)

规范使用 mark 标记


注册完 mark 标记之后 pytest 便不会再告警,但是有时手残容易写错 mark 名,导致 pytest 找不到用例,一时想不开很难debug,尤其是团队协作时很容易出现类似问题,所以我们需要 “addopts = --strict” 参数来严格规范 mark 标记的使用!

在 pytest.ini 文件中添加参数 “addopts = --strict”;
注意要另起一行,不要在 markers 中添加;
添加该参数后,当使用未注册的 mark 标记时,pytest会直接报错:“ 'xxx' not found in `markers` configuration option ”,不执行测试任务;
注意:pytest.ini 配置文件不支持注释,不支持注释,不支持注释...

使用Marks标记测试用例

通过使用pytest.mark你可以轻松地在测试用例上设置元数据。例如, 一些常用的内置标记:

  • @pytest.mark.skip - 始终跳过该测试用例
  • @pytest.mark.skipif - 遇到特定情况跳过该测试用例
  • @pytest.mark.xfail - 遇到特定情况,产生一个“期望失败”输出
  • @pytest.mark.parametrize - 在同一个测试用例上运行多次调用(译者注: 参数化数据驱动)
  • 标记和分类用例:@pytest.mark.levell
  • 标记用例执行顺序:@pytest.mark.run(order=1)(需安装pytest-rodering)
  • 标记使用指定Fixtures(测试准备及清理方法):@pyest.mark.usefixtures()
  • 标记超时时间:@pytest.make.timeout(60)(需安装pytest-timeout)

        或命令$pytest --timeout=60

  • 标记失败重跑次数:@pytest.mark.flaky(reruns=3,reruns_delay=1)reruns=3:测试用例失败重跑3次,reruns_delay=1:用例失败则延迟1秒后重跑(需安装pytest-rerunfailurse)

最多失败重跑5次 & 如果失败则延迟1秒后重跑(可以不传)
        或命令$pytest --reruns 5 --reruns-delay 1

注意:
标记只对测试用例有效,对fixtures方法无效。

 @pytest.mark.skip

跳过测试用例的最简单方法是使用skip装饰器标记它,可以传递一个可选的原因reason参数(str,跳过测试函数的原因):

@pytest.mark.skip(reason="目前没办法测试该用例")
def test_the_unknown():
    ...

 

或者,也可以在测试执行或setup期间,通过调用pytest.skip(reason)函数强制跳过该用例

def test_function():
    if not valid_config():
        pytest.skip("不支持该配置")

当在导入时间内无法评估跳过条件时,这种在用例跳过的方法非常有用。

也可以在模块级别跳过整个模块:pytest.skip(reason,allow_module_level=True)

import sys
import pytest

if not sys.platform.startswith("win"):
    pytest.skip("跳过只支持Windows平台的用意",allow_module_level=True)

(使用此方法跳过整个模块时会抛出Skipped异常,如果在脚本下方使用pytest.main()执行,会执行不到。此时应使用命令行pytest命令执行。)

@pytest.mark.skipif  指定条件下跳过

参数:

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pytest.mark.parametrize是pytest框架中的一个装饰器,用于参数化测试用例。它可以将不同的参数传递给同一个测试函数,以便多次运行测试用例。在引用\[1\]和引用\[2\]中,示例展示了如何使用pytest.mark.parametrize来传递单个变量的参数,其中引用\[1\]使用元组作为参数,引用\[2\]使用列表作为参数。而在引用\[3\]中,展示了如何结合yaml数据使用pytest.mark.parametrize。首先,通过read_yaml函数将yaml文件中的数据读取出来,并将其转换为列表形式。然后,将这个列表作为参数传递给pytest.mark.parametrize装饰器,从而实现参数化测试用例。在这个示例中,参数名为"data",并且测试函数test_add_case4可以通过"data"来访问每个测试数据中的具体值。这样,pytest框架会根据参数化的设置,多次运行测试函数,每次传递不同的参数值。 #### 引用[.reference_title] - *1* *2* [4.pytest parametrize()参数化](https://blog.csdn.net/lzmlc0109/article/details/125719941)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [@pytest.mark.parametrize用法(yaml和fixture结合使用)](https://blog.csdn.net/qq_42870572/article/details/128149867)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值