深入了解 Pytest Markers:提升测试用例的组织和控制能力

​从这篇开始,逐一解决fixture是啥?mark是啥?参数request是啥?钩子函数是啥?parametrize参数化是啥?这些问题。本片先介绍一下mark是啥?以及如何使用

Markers有啥用?
当使用 Pytest 运行测试时,可以通过标记(Markers)来为测试函数或类添加自定义的元数据。标记可以用于对测试进行分类、过滤和定制化。

查看所有Markers

pytest --markers
  • 1

常用的内置标记

内置标记(Built-in Markers): Pytest 提供了一些内置的标记,用于常见的测试场景。一些常用的内置标记包括:

@pytest.mark.skip: 标记该测试为跳过;

@pytest.mark.parametrize: 标记该测试使用参数化,可以为测试函数指定多组参数;

@pytest.mark.xfail: 标记该测试为预期失败;

@pytest.mark.skipif: 根据条件动态地跳过某个测试。

@pytest.mark.timeout:为测试用例设置运行超时时间。

@pytest.mark.skip
可以设置一个可选参数reason,表明跳过的原因

import pytest
​
@pytest.mark.skip()
def test_01():pass

未增加跳过原因,输出内容为

test_demo.py::test_01 SKIPPED (unconditional skip)                       [100%]
Skipped: unconditional skip

我们增加跳过原因,看看输出结果

import pytest
​
@pytest.mark.skip(reason='skip reason')
def test_01():pass

 

执行输出结果如下

test_demo.py::test_01 SKIPPED (skip reason) [100%] Skipped: skip reason

可以看到会直接显示具体原因。

pytest.skip方法

这里我们顺带提一下这个方法。可以在测试执行期间强制跳过

def test_01():pytest.skip(reason="skip reason")

另外,还可以为其设置一个布尔型的参数allow_module_level(默认为False),表明是否允许在模块中调用这种方法,如果置为True,则跳过模块中剩余的部分,也就是说其值为True时这个模块中所有测试方法都被跳过。

import sys
import pytest
​
if not sys.platform.startswith("darwin"):pytest.skip("如果不是mac,跳过",allow_module_level = True)

注意:如果是在用例中设置allow_module_level为True,并不会跳过模块中剩余的用例

@pytest.mark.skipif

带条件的跳过执行:满足条件就跳过,不满足条件就不跳过

import pytest
​
env = 'iOS'
​
@pytest.mark.skipif('env == "iOS"', reason="iOS不支持")
def test_01():pass

当然也可以使用多条标记

import pytest
import sys
​
env = 'iOS1'
​
​
@pytest.mark.skipif('env == "iOS"', reason="iOS不支持")
@pytest.mark.skipif(sys.version_info<(3,12), reason="3.12以下版本不支持")
def test_01():pass

可以看到第一个条件不满足,我电脑的版本为3.8,第二个条件满足,最终case跳过。

注意:当一个用例指定了多个skipif条件时,只需满足其中一个,就可以跳过这个用例的执行。

当然也可以在一个文件中定义所有的条件,需要时引入即可

import pytest
import sys
​
version = pytest.mark.skipif(sys.version_info<(3,12), reason="3.12以下版本不支持")
​
@version
def test_01():pass

这里不存在pytest.skipif()方法

@pytest.mark.xfail

表示期望这个用例执行失败。用例会正常执行,只是失败时不再显示堆栈信息,最终的结果有两个:用例执行失败(XFAIL:符合预期的失败)、用例执行成功(XPASS:不符合预期的成功)。也就是说执行成功反倒不正确了。

import pytest
​
@pytest.mark.xfail(reason = '预期失败')
def test_01():assert 1 == 2

运行结果

test_demo.py::test_01 XFAIL (预期失败)                                   [100%]
@pytest.mark.xfail(reason = '预期失败')def test_01():
>       assert 1 == 2
E       assert 1 == 2
​
test_demo.py:5: AssertionError

如果断言改成1 != 2,该用例会执行成功,本来标记该功能有bug,但是断言成功了,说明断言或者功能有问题,此时会标记为XPASS

当然也可以增加条件

import pytest
import sys
​
@pytest.mark.xfail(sys.version_info<(3,12), reason = '预期失败')
def test_01():assert 1 != 2

如果我们想要将XPASS标记的记为失败,可以使用strict参数

strict为关键字参数,默认值为False。当strict=False时,如果用例执行失败,则结果标记为XFAIL,表示符合预期的失败。如果用例执行成功,则结果标记为XPASS,表示不符合预期的成功。当strict=True时,如果用例执行成功,则结果将标记为FAILED,而不再标记为XPASS。

也可以直接在pytest.ini文件中配置

[pytest]
xfail_strict = true
  • 1
  • 2

如果想要将标记为XFAIL的用例不再执行,包含run参数。run为关键字参数,默认值为True。当run=False时,pytest不会再执行测试用例,而直接将结果标记为XFAIL。

import pytest
​
@pytest.mark.xfail(reason = '预期失败', run=False)
def test_01():assert 1 == 2

执行发现,会带[NOTRUN]

raises为关键字参数,默认值为None。可以指定为一个异常类或者多个异常类的元组,表明我们期望用例上报指定的异常。pytest.mark.xfail()也可以接收一个raises参数,用来判断用例是否因为一个具体的异常而导致失败

xfail标记如何失效
通过–runxfail参数让xfail标记失效。通过命令行选项pytest --runxfail让xfail标记失效,使这些用例变成正常执行的用例,仿佛没有被标记过一样。同样,pytest.xfail()方法也将失效。

@pytest.mark.parametrize
参数化内容比较多,准备专门写一篇来介绍。

自定义标记
标记用例,在命令行通过-m运行指定标记的用例

test_demo.py

import pytest
​
@pytest.mark.p0
def test_01():assert 1 != 2
​
​
@pytest.mark.p1
def test_02():assert 1 != 2

运行所有:pytest -v test_demo.py

运行p0:pytest -v -m ‘p0’ test_demo.py

运行p0/p1:pytest -v -m ‘p0 and p1’ test_demo.py

执行后,会发现有警告信息PytestUnknownMarkWarning,你可以忽略。想要解决的话,也可以在配置文件中配置自定义的标记,配置后警告信息会消失。

pytest.ini

[pytest]
markers =p0: 冒烟p1: 功能

再次执行,会发现已经没有警告信息了。

当然也可以像这样反向运行,运行不是p0的测试用例:pytest -v -m ‘not p0’ test_demo.py

自定义标记可以通过 pytest_configure(config)钩子 函数在配置阶段添加。下面是一个自定义标记的例子:

def pytest_configure(config):config.addinivalue_line('markers','repeat(n): run the given test function `n` times.')
​

在上面的例子中,我们定义了一个自定义标记 repeat,并将其添加到 pytest_configure() 函数中。然后,我们可以在测试函数上使用 @pytest.mark.repeat 标记来标记需要重复执行的测试用例。

通过使用标记,我们可以更灵活地控制测试的行为,并根据需要对不同类型的测试进行分类、过滤和定制化处理。

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/630555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ZooKeeper 实战(五) Curator实现分布式锁

文章目录 ZooKeeper 实战(五) Curator实现分布式锁1.简介1.1.分布式锁概念1.2.Curator 分布式锁的实现方式1.3.分布式锁接口 2.准备工作3.分布式可重入锁3.1.锁对象3.2.非重入式抢占锁测试代码输出日志 3.3.重入式抢占锁测试代码输出日志 4.分布式非可重入锁4.1.锁对象4.2.重入…

SAP PI之Rest adapter

一&#xff0c;简介 REST风格接口是以http为传输协议&#xff0c;以xml或json或text为有效负载。下图展示了REST到XI再返回的一个过程&#xff0c;一个REST接口包含的信息有&#xff1a;服务URL、URL中带的参数、http方法(post/get/put等)、http头部、body部分的有效载荷。而X…

Sentinel限流、熔断

1、限流 单个服务节点限流 sentinel 提供了两种不同的隔离机制&#xff1a;信号量隔离和线程池隔离&#xff0c;它们的主要区别如下&#xff1a; 信号量隔离&#xff08;Semaphore Isolation&#xff09;&#xff1a; 原理&#xff1a;信号量隔离基于计数器&#xff08;或称令…

域名群站开源系统分享开源域名授权系统

一、需要自己安装PHP和MYSQL服务器环境。 二、务必设置伪静态规则&#xff0c;否则将无法访问文章栏目页面。 三、启用伪静态功能&#xff0c;请在站点设置中选择使用thinkphp的伪静态规则。 四、在域名的根目录下找到”data/config.php”文件&#xff0c;填入数据库的账号和…

配置zabbix监控平台

目录 内容纯手敲&#xff0c;难免有误&#xff0c;若发现请私信我。 配置zabbix监控平台 一、进入官网 ​编辑​ 二、配置zabbix-server&#xff08;服务端&#xff09; 1.下载zabbix的yum源 2.安装Zabbix服务器、前端、代理 3.安装Zabbix前端 4.编辑文件/etc/yum.rep…

openssl3.2 - quic服务的运行

文章目录 openssl3.2 - quic服务的运行概述笔记运行openssl编译好的quic服务程序todo - 如果自己编译quic服务工程补充 - 超过30秒不连接uqic服务会退出END openssl3.2 - quic服务的运行 概述 在看 官方 guide目录下的工程. 都是客户端程序, 其中有quic客户端, 需要运行quic服…

【算法Hot100系列】旋转图像

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

软件测试|python如何去除文件后缀名?

简介 在Python中&#xff0c;我们常常需要操作文件&#xff0c;包括文件的读取、写入、重命名等操作。在文件操作中&#xff0c;我们经常会遇到需要去除文件后缀的问题。那么&#xff0c;Python如何去除文件后缀呢&#xff1f;本文我们将介绍如何使用Python来去除文件后缀。 …

大模型学习与实践笔记(六)

一、finetune 简介 两种微调模式&#xff1a;增量预训练 与指令跟随 1.增量预训练 2.指令微调 二、LoRA 与 QLoRA 介绍 三、XTuner 介绍 四、低显存玩转LLM的方法

Linux网络之PXE高效批量装机、Kickstart全自动化安装

一. PXE网络装机简介和相关知识 1. 常见的三种系统安装方式和相关文件 ① 三种系统安装方式 u启动安装&#xff1a;在U盘中下载相关的安装系统及镜像文件&#xff0c;u盘插机安装 光驱安装&#xff1a;将带有所需系统的光盘放进电脑服务器中&#xff0c;按照官方引导装机 …

春节假期出游一些很实用的手机技巧!这样玩,就很哇塞~

随着春节的脚步越来越近&#xff0c;无论是准备出游还是回家&#xff0c;你蠢蠢欲动的心是否已经拦不住了&#xff1f;华为 nova 12系列这些很哇塞的玩法你必须知道&#xff01;这个新年让你旅行出圈有秘籍&#xff01; 出发前智慧播报航班信息不错过。智慧播报的功能就很实…

AI大模型学习笔记之二:什么是 AI 大模型的训练和推理?

在人工智能&#xff08;AI&#xff09;的领域中&#xff0c;我们经常听到训练&#xff08;Training) 和 推理&#xff08;Inference) 这两个词汇&#xff0c;它们是构建强大 AI 模型的关键步骤。我们通过类比人类的学习过程来理解这两个概念&#xff0c;可以更加自然而生动地理…

Servlet中访问网页常遇到的问题

网页出现404 出现这一种情况是浏览器访问的资源不存在 第一种情况通常是路径出错请检查你的路径是否一致 第二种情况确认你的webapp是否被正确加载 smart tomcat由于只加载一个webapp 如果加载失败 就会直接启动失败 拷贝war方式到Tomcat要加载多个webapp如果失败只有日志 查…

软件测试|sqlalchemy relationship

简介 SQLAlchemy是一个流行的Python ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它允许我们以面向对象的方式管理数据库。在SQLAlchemy中&#xff0c;relationship是一个重要的功能&#xff0c;用于建立表之间的关系。在本文中&#xff0c;我们将详细探讨relation…

AutoRuns下载安装使用教程(图文教程)超详细

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 AutoRuns 是微软提供的一款「启动项管理」工具&#xff0c;可以检查开机自动加载的所有程…

UI设计中插画赏析和产品色彩分析

插画赏析&#xff1a; 1. 插画是设计的原创性和艺术性的基础 无论是印刷品、品牌设计还是UI界面&#xff0c;更加风格化的插画能够将不同的风格和创意加入其中&#xff0c;在激烈的竞争中更容易因此脱颖而出。留下用户才有转化。 2. 插画是视觉触发器&#xff0c;瞬间传达大量…

国产阿里的Copilot能提效30%吗?

国产阿里的Copilot能提效30%吗&#xff1f; Copilot简介 GitHub 和 OpenAI 共同打造的一款编程神器–Copilot&#xff0c; 这是一款立足于人工智能技术的编程助手。在此基础上&#xff0c;借助于 GitHub 庞大的代码库和来自全球的开源社区帮助&#xff0c;搭配 OpenAI 在自然…

cookie和session的工作过程和作用:弥补http无状态的不足

cookie是客户端浏览器保存服务端数据的一种机制。当通过浏览器去访问服务端时&#xff0c;服务端可以把状态数据以key-value的形式写入到cookie中&#xff0c;存储到浏览器。浏览器下次去服务服务端时&#xff0c;就可以把这些状态数据携带给服务器端&#xff0c;服务器端可以根…

【centos7系统】Redis-6.2.2版本集群搭建

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 前redis最新版本已经是6.2.4&#xff0c;在集群搭建上和redis3.x、redis4.x区别很大。redis5以后&#xff0c;就不需要安装ruby了…

腾讯云主机优惠价格表(2024新版报价)

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…