pytest 测试常用功能

1. pytest基础功能

命名规则

文件名以test_*.py文件和*_test.py
以test_开头的函数
以Test开头的类, 注意:类不能包含__init__构造函数
以test_开头的方法
所有的包pakege必须要有__init__.py文件

常用命令

pytest  --help  # 查看帮助

cmd执行pytest用例有三种方法

pytest	 或   py.test   或   python -m pytest

setup和teardown实现

  • 模块级(setup_module/teardown_module)开始于模块始末,全局的
  • 函数级(setup_function/teardown_function)只对函数用例生效(不在类中)
  • 类级(setup_class/teardown_class)只在类中前后运行一次(在类中)
  • 方法级(setup_method/teardown_method)开始于方法始末(在类中)
  • 类里面的(setup/teardown)运行在调用方法的前后
  • @pytest.fixture 装饰器实现, 通过scope 参数指定作用范围

用例执行:

pytest folderpath			# 执行该文件夹内所有测试文件用例
pytest test_demo.py 		#执行当前文件test_demo内所有用例
pytest test_demo.py::TestClass		#执行当前类 TestClass 内所有用例
pytest test_demo.py::TestClass::test_01		# 执行类中名为test_01 的用例

重复执行

pytest-repeat 安装 pip install pytest-repeat

使用--count命令行选项指定要运行测试用例和测试次数, 不带该参数默认执行一次

pytest test_demo.py -s --count=5

--repeat-scope类似于pytest fixture的scope参数,--repeat-scope也可以设置参数: session , moduleclass或者function(默认值)

  • function(默认)范围针对每个用例重复执行,再执行下一个用例
  • class 以class为用例集合单位,重复执行class里面的用例,再执行下一个
  • module 以模块为单位,重复执行模块里面的用例,再执行下一个
  • session 重复整个测试会话,即所有收集的测试执行一次,然后所有这些测试再次执行等等

使用--repeat-scope=session重复执行整个会话用例

pytest test_demo.py -s --count=5 --repeat-scope=session

如果要在代码中标记要重复多次的测试,可以使用@pytest.mark.repeat(count)装饰器 count 为重复执行的次数

fixture

text fixtures的目的是为测试的重复执行提供一个可靠的固定基线。 pytest fixture比经典的xUnit setUp/tearDown方法有着显着的改进:

  • fixtures具有明确的名称,在测试用例/类/模块或整个项目中通过声明使用的fixtures名称来使用。
  • fixtures以模块化方式实现,因为每个fixture名称都会触发调用fixture函数,该fixture函数本身可以使用其它的fixtures。
  • 从简单的单元测试到复杂的函数测试,fixtures的管理允许根据配置和组件选项对fixtures和测试用例进行参数化,或者在测试用例/类/模块或整个测试会话范围内重复使用该fixture。

此外,pytest继续支持经典的xUnit风格的setup方法。 你可以根据需要混合使用两种样式,逐步从经典样式移动到新样式。 你也可以从现有的unittest.TestCase样式或基于nose的项目开始。

scope参数的可选值包括:function(函数),class(类),module(模块),package(包)及 session(会话)。

fixture 执行顺序

@pytest.fixture(scope="session")
def s1():pass@pytest.fixture(scope="module")
def m1():pass@pytest.fixture
def f1(tmpdir):pass@pytest.fixture
def f2():passdef test_foo(f1,m1,f2,s1):...

test_foo中fixtures将按以下顺序执行:

  1. s1:是最高范围的fixture(会话级)
  2. m1:是第二高的fixture(模块级)
  3. tmpdir:是一个函数级的fixture,f1依赖它,因此它需要在f1前调用
  4. f1:是test_foo参数列表中第一个函数范围的fixture。
  5. f2:是test_foo参数列表中最后一个函数范围的fixture。

yield和addfinalizer

如果在设置代码期间(yield关键字之前)发生异常,则不会调用teardown代码(在yield之后)。 执行teardown代码的另一种选择是利用请求上下文对象的addfinalizer方法来注册teardown函数。

yieldaddfinalizer方法在测试结束后调用它们的代码时的工作方式类似,但addfinalizer相比yield有两个主要区别:

  1. 使用addfinalizer可以注册多个teardown函数。
  2. 无论fixture中setup代码是否引发异常,都将始终调用teardown代码。 即使其中一个资源无法创建/获取,也可以正确关闭fixture函数创建的所有资源

用例等级

@allure.severity装饰器按严重性级别来标记case 如 @allure.severity("normal")

执行指定测试用例 --allure-severities blocker

BLOCKER = 'blocker'  阻塞缺陷

CRITICAL = 'critical'  严重缺陷

NORMAL = 'normal'   一般缺陷

MINOR = 'minor'   次要缺陷

TRIVIAL = 'trivial'   轻微缺陷

用例标记

@pytest.mark 使用pytest.mark你可以轻松地在测试用例上设置元数据。 如 @pytest.mark.A A即用例的标记

常用的内置标记:

  • skip - 始终跳过该测试用例
  • skipif - 遇到特定情况跳过该测试用例
  • xfail - 遇到特定情况,产生一个“期望失败”输出
  • parametrize - 在同一个测试用例上运行多次调用( 参数化数据驱动)

当使用--strict命令行参数时,未在pytest.ini文件中注册的任何标记都将引发异常

选择指定标记用例执行

`

pytest  -m A
pytest -m "A and B"
pytest -m "(A and B) or C"

pytest.ini

1.pytest.ini的放置位置:一般放在项目工程的根目录(即当前项目的顶级文件夹下)

2.pytest.ini的作用:指定pytest的运行方式(在cmd输入pytest后,会读取pytest.ini中的配置信息,按指定的方式去运行)

3.cmd下使用 pytest -h 命令查看pytest.ini的设置选项

在 pytest.ini 中可以添加adopt参数,可以更改默认命令行选项,这个当在cmd输入一堆指令去执行用例时,可以用该参数代替

[pytest]
markers =A: this is weibo pageB: toutiao pageC: xinlang page
# 命令行参数
addopts = -v --reruns=1 --count=2 --html=reports.html --self-contained-html -n=auto

-v 指定的函数节点id

如果想指定运行某个.py模块下,类里面的一个用例,如:TestClass里面test_method用例 每个test_开头(或_test结尾)的用例,函数(或方法)的名称就是用例的节点id,指定节点id运行用-v 参数

-k 匹配用例名称

可以使用-k命令行选项指定在匹配用例名称的表达式

-k "test_func_01 or test_func_02"	# 使用or, 用例必须全名 
-k "02"
-k "func"
-k "not 02"

输出捕获

--capture=no 实时输出log信息

在测试执行期间,程序中的标准输出/标准错误输出都会被捕获到。 如果测试或setup方法执行失败时,会在报错追溯信息中查看到程序中的标准输出及标准错误输出。(可以通过--show-capture命令行选项配置是否捕获程序中的标准输出/标准错误输出)。

此外,stdin被设置为“null”对象,测试运行过程中无法从中读取数据,因为在运行自动化测试时很少需要等待交互式输入。

捕获默认是通过拦截对低优先级文件描述符的写入来完成的。 这允许捕获简单print语句的输出以及测试启动的子进程的输出。

pytest可以通过两种方式捕获输出:

  • 文件描述符(FD)级别捕获(默认):将捕获进入操作系统文件描述符1和2的所有写入。
  • sys级别捕获:仅捕获Python文件sys.stdoutsys.stderr。 不执行对文件描述符的写入捕获。
pytest -s            # 禁止捕获所有输出
pytest --capture=sys # 使用in-mem文件代替sys.stdout/stderr with 
pytest --capture=fd  # 同时将filedescriptors 1和2指向临时文件

doc 测试

doctest从字面意思上看,那就是文档测试。doctest是python里面自带的一个模块,它实际上是单元测试的一种。 官方解释:doctest 模块会搜索那些看起来像交互式会话的 Python 代码片段,然后尝试执行并验证结果

doctest测试用例可以放在两个地方

  • 函数或者方法下的注释里面
  • 模块的开头

doctest内容也可以和代码抽离开,单独用一个.txt文件(默认)保存

默认情况下,Pytest按照python doctest模块标准test*.txt模式进行匹配。也可以通过使用--doctest-glob命令更改匹配模式,--doctest-glob可以在命令行中多次使用, 如

pytest --doctest-glob='*.rst'

用例skip

pytest.mark.skip可以标记无法在某些平台上运行的测试功能,或者希望失败的测试功能

跳过测试函数的最简单方法是使用跳过装饰器标记它

@pytest.mark.skip(reason="no way of currently testing this")

有条件跳过用例

@pytest.mark.skipif(3 < 4)

测试报告

pytest可以生成junit格式的xml报告,在命令行中加入--junit-xml=path 参数就可以了。path为待生成xml文件路径

生成xml

pytest --junit-xml=report.xml

生成 html

pytest --html=report.html

2. 测试常用pytest插件

失败重试

在做测试的时候我们通常会遇到网络波动,这事我们需要做失败重试机制,确认失败后才进行失败告警或者在报告中体现

在pytest中,我们通常会使用安装pytest-rerunfailures来进行失败重试

pip install -U pytest-rerunfailures

在命令行中增加 –reruns NUM,NUM为失败重试的最大次数

pytest test_se.py --reruns 3

重复运行

pip install pytest-repeat

在执行命令中添加–count=NUM NUM为每条用例需要执行的次数

pytest test_se.py --count=3

并行运行

pip install pytest-xdist

pytest-xdist插件的 -n numprocesses 选项可以指定运行测试的处理器进程数,-n auto选项可以自动侦测系统里的CPU数码

pytest -n 3 test_test.py
pytest -n auto test_test.py

设定执行顺序

pip install pytest-ordering

根据order参数从小到大执行

@pytest.mark.run(order=2)
def test_order1():print ("first test")assert True
@pytest.mark.run(order=1)
def test_order2():print ("second test")assert True

测试时间限制

在正常时间下,pytest是没有测试时间限制的,但有时候需要控制测试用例执行执行,可以使用pytest-timeout。

pip install pytest-timeout

在命令行中添加 –timeout=X,X为该条命令执行的总时间限制,单位秒

pytest --timeout=3.5 test_xxx.py

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

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

相关文章

【重温设计模式】备忘录模式及其Java示例

备忘录模式的概述 在软件设计的世界中&#xff0c;备忘录模式是一种行为设计模式&#xff0c;它的主要作用是保存对象的当前状态&#xff0c;以便在将来的某个时间点&#xff0c;可以将对象恢复到这个保存的状态。这种模式的命名源于生活中的备忘录&#xff0c;我们常常用它来…

俄罗斯方块h5源码

上传源码至服务器和空间即可使用&#xff0c;源码无后门&#xff0c;就一天html文件&#xff0c;一个两个css文件以及一个js文件 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88897605 更多资源下载&#xff1a;关注我。

148个Chatgpt关键词汇总-有爱AI实战教程(二)

演示站点&#xff1a; https://ai.uaai.cn 技能模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 导读&#xff1a;在使用 ChatGPT 时&#xff0c;当你给的指令越精确&#xff0c;它的回答会越到位&#xff0c;举例来说&#xff0c;假如你要请它帮忙写文案&#xff0c;如…

devops-Maven【部署及配置】

1、准备maven工具包&#xff0c;Maven官网下载Maven的安装包 Maven – Download Apache Maven Index of /maven (apache.org) 选择后缀是.bin.tar.gz的文件下载&#xff0c;此处下载的版本是3.9.6。 2、安装maven的目录下&#xff0c;建一个Maven路径&#xff0c;然后把压缩…

JAVA虚拟机实战篇之内存调优[5](诊断和解决问题-两种方式总结)

文章目录 版权声明诊断和解决问题 - 两种方案在线定位问题步骤在线定位问题 – btrace 总结内存溢出&内存泄漏内存溢出原因解决内存泄漏方法 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程序员或相关权…

springboot项目docker分层构建

一、需求场景 在使用dockerfile构建springboot项目时&#xff0c;速度较慢&#xff0c;用时比较长&#xff0c;为了加快构建docker镜像的速度&#xff0c;采用分层构建的方式 二、构建配置 1、pom.xml配置 <properties><project.build.sourceEncoding>UTF-8<…

探索数据可视化:Matplotlib 基础指南

图形绘制 import numpy as np import pandas as pd import matplotlib.pyplot as pltx np.linspace(0,2 * np.pi,100)# 说明&#xff1a;正弦波。x&#xff1a;NumPy数组 # 所有的数据&#xff0c;进行正弦计算 y np.sin(x)plt.plot(x,y)# 指定x轴范围 plt.xlim(-1,10) # 指…

Python的requests库发送HTTPS请求时,SSL证书验证的流程

建立连接&#xff1a;当你使用requests库发送HTTPS请求时&#xff0c;它会尝试与目标服务器建立安全的SSL连接。 获取服务器SSL证书&#xff1a;服务器会将自己的SSL证书发送给客户端&#xff08;即你的请求&#xff09;。 验证证书&#xff1a;requests库会验证服务器返回的…

746. 使用最小花费爬楼梯 (Swift版本)

题目 给你一个整数数组 cost&#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 限制条件 2…

【嵌入式】揭秘嵌入式产品启动奥秘:从硬件上电到应用全速运行的精彩旅程

1. 概述 嵌入式产品的启动过程是一个复杂而有序的过程&#xff0c;涉及硬件初始化、引导加载程序&#xff08;bootloader&#xff09;的执行、操作系统的加载和初始化以及用户应用程序的启动等多个阶段。下面&#xff0c;我们将以常见的ARM芯片、U-Boot作为bootloader、Linux作…

智能合约语言(eDSL)—— proc_macro实现合约init函数

我们通过属性宏来实现合约的init函数&#xff0c;call函数其实和init是类似的&#xff1b; GitHub - XuHugo/xwasm 构建属性宏&#xff0c;要在cargo.toml里面设置一些参数&#xff0c;这是必须的。一般来说&#xff0c;过程宏必须是一个库&#xff0c;或者作为工程的子库&…

向爬虫而生---Redis 探究篇8<保障缓存和持久化数据一致性的研究与实现(初) `探索篇`>

前言: 随着我们的生活越来越数字化,我们对数据的依赖变得无所不在。无论是在购物网站上浏览商品、在社交媒体上与朋友互动,还是在工作中处理大量的业务数据,数据都成了我们生活的重要组成部分。 当我们使用应用程序或网站时,我们希望能够获得快速、即时的响应。这就是缓存出…

Rust基础教程

Rust基础教程 Rust简介安装RustRust rustup第一个Rust应用Rust项目管理工具Cargo使用RustRover开发Rust应用使用VSCode开发Rust应用Cargo项目结构分析Rust关键字和标识符Rust命名规范Rust注释Rust变量Rust不可变变量Rust可变变量Rust常量Rust常量和不可变变量的区别Rust隐藏变…

基于 HBase Phoenix 构建实时数仓(3)—— Phoenix 安装

目录 一、主机规划 二、Phoenix 安装 1. 解压、配置环境 2. 将 phoenix-server-hbase-2.5-5.1.3.jar 文件复制到 HBase 的 lib 目录中 3. 重启 HBase 集群 4. 安装验证 &#xff08;1&#xff09;连接 HBase &#xff08;2&#xff09;视图映射 &#xff08;3&#xf…

thingsboard如何自定义udp-transport

0、参考netty实现udp的文章 https://github.com/narkhedesam/Netty-Simple-UDP-TCP-server-client/blob/master/netty-udp/src/com/sam/netty_udp/server/MessageDecoder.java 调试工具使用的是:卓岚TCP&UDP调试工具 1、在common\transport下面创建udp模块,仿照mqtt的创…

Linux配置.bashrc文件导致各种命令(vim、sudo)失效。

Linux配置.bashrc文件导致各种命令&#xff08;vim、sudo&#xff09;失效。 起因是 nvcc-V一直报错&#xff1a;-bash&#xff1a;nvcc&#xff1a; command not found 踩坑记录&#xff1a;上网一查说是没有配置cuda的环境变量。于是去修改了bashrc文件&#xff0c;在最下面…

一次生产环境上的dockerd启动失败原因分析

今夜原计划对 生产环境 上的 SDN 组件进行一次紧急扩容操作的&#xff0c;但业务基础环境中的 Docker-Engine 启动不起来了、原定计划也就无法继续进行了。 尽管查清了基础业务环境中的故障原因&#xff0c;但金主DD说今天先不干了&#xff0c;那就整理整理思路写篇流水账吧 。…

【漏洞复现】帮管客 CRM jiliyu SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

ubuntu下vscode+STM32CubeMX+openocd+stlinkv2搭建STM32开发调试下载环境

1、换源 清华源 # 默认注释了源码镜像以提高 apt update 速度&#xff0c;如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restr…

nginx-排查一次大文件无法正常下载问题

目录 问题现象&报错信息 问题现象以及分析 nginx报错信息 问题解决 方法1&#xff1a;配置proxy_max_temp_file_size 方法2&#xff1a;关闭proxy_buffering 参考文档 问题现象&报错信息 问题现象以及分析 文件正常从后端服务器直接下载时&#xff0c;一切正常…