【pytest中同一个用例多次执行生成一个测试报告的方法】

为了实现主函数执行一次,而指定的测试函数(如 test_img)执行 10 次,你可以通过以下两种方式进行控制:

方法一:在 pytest 中使用 @pytest.mark.parametrize

使用 pytestparametrize 装饰器可以实现让某个测试函数运行多次。下面是一个示例,如何修改 test_img 函数使其执行 10 次:

import pytest# 使用 parametrize 装饰器执行10次测试
@pytest.mark.parametrize("run", range(10))  # 运行10次
def test_img(run):screenshot_path = "resources/base3.png"base_image_path = "resources/base1.png"boolean = check_image_similarity(screenshot_path, base_image_path, threshold=0.5)assert boolean, "两张图片不一样"

在这个例子中,pytest.mark.parametrize("run", range(10)) 会让 test_img 被执行 10 次。

方法二:在主函数中控制循环

如果你想在主函数中控制每个测试函数的执行次数,可以通过在 pytest.main() 中使用循环来执行。修改主函数如下:

if __name__ == "__main__":count = 1while True:print(f"这是第{count}轮次蓝牙、WiFi、热点、dvr压测")report_dir = "report"os.makedirs(report_dir, exist_ok=True)current_time = datetime.now().strftime("%Y%m%d_%H%M%S")report_file = os.path.join(report_dir, f"report_{current_time}.html")# 让 test_img 执行 10 次for i in range(10):try:pytest.main(["-v", "test_img.py", f"--html={report_file}"])except Exception as e:print(f"运行测试时出现错误: {e}")count += 1time.sleep(5)

在这个修改后的代码中,通过在主函数中添加一个 for i in range(10) 的循环,每次测试都执行 10 次,并在每轮次测试结束后生成相应的 HTML 报告。

方法三:使用 pytest-repeat 插件

pytest-repeat 是一个插件,允许你重复执行某个测试。首先安装插件:

pip install pytest-repeat

然后你可以通过命令行参数或代码来控制某个测试执行的次数。比如,使用下面的命令让 test_img 执行 10 次:

pytest --count=10 -v test_img.py

或者在代码中通过 @pytest.mark.repeat(10) 来控制:

import pytest@pytest.mark.repeat(10)
def test_img():screenshot_path = "resources/base3.png"base_image_path = "resources/base1.png"boolean = check_image_similarity(screenshot_path, base_image_path, threshold=0.5)assert boolean, "两张图片不一样"

示例代码:

from PIL import Image
import numpy as np
import pytest
from skimage.metrics import structural_similarity as ssim
import uiautomator2 as u2
import time
import subprocess
import os
from datetime import datetime
# 创建目录
os.makedirs('resources/images', exist_ok=True)# 截图并保存
def save_screenshot(d):current_time = datetime.now().strftime("%Y%m%d_%H%M%S")screenshot_path = f'resources/images/screenshot_{current_time}.png'd.screenshot(screenshot_path)print(f"截图已保存: {screenshot_path}")return screenshot_path  # 返回截图路径# 比较图片相似度的函数
def compare_images_similarity(image1_path, image2_path, threshold=0.5):try:img1 = Image.open(image1_path).convert('L')img2 = Image.open(image2_path).convert('L')img1 = np.array(img1)img2 = np.array(img2)if img1.shape != img2.shape:print("图片尺寸不一致")return 0.0, Falsesimilarity_index, _ = ssim(img1, img2, full=True)return similarity_index, similarity_index >= thresholdexcept Exception as e:print(f"处理图片时发生错误: {e}")return 0.0, False# 检查截图与本地存储图片的相似性
def check_image_similarity(new_screenshot, base_image, threshold=0.5):similarity, is_similar = compare_images_similarity(new_screenshot, base_image, threshold)print(f"相似度: {similarity * 100:.2f}%")if is_similar:print("两张图片相似度大于或等于指定阈值,判断为相同")return Trueelse:print("两张图片相似度小于指定阈值,判断为不同")return False
@pytest.mark.repeat(10)
def test_img():print("正在执行测试")screenshot_path = "resources/base3.png" base_image_path="resources/base1.png" boolean=check_image_similarity(screenshot_path, base_image_path, threshold=0.5)assert boolean, "两张图片图片不一样"
@pytest.mark.parametrize("run", range(10))  # 运行10次
def test_img1(run):print(f"正在执行测试,当前轮次: {run}")screenshot_path = "resources/base3.png" base_image_path="resources/base1.png" boolean=check_image_similarity(screenshot_path, base_image_path, threshold=0.5)assert boolean, "两张图片图片不一样"
if __name__ == "__main__":count = 1while True:print(f"这是第{count}轮次蓝牙、WiFi、热点、dvr压测")report_dir = "report"os.makedirs(report_dir, exist_ok=True)current_time = datetime.now().strftime("%Y%m%d_%H%M%S")report_file = os.path.join(report_dir, f"report_{current_time}.html")try:pytest.main(["-v", "test_img.py", f"--html={report_file}"])except Exception as e:print(f"运行测试时出现错误: {e}")count += 1time.sleep(5)break

总结

  • 使用 parametrize 让函数执行多次是较为简便的方式。
  • 在主函数中循环执行测试可以让你更灵活地控制多次执行。
  • 你也可以使用 pytest-repeat 插件来轻松实现重复运行某个测试。

根据你的需求,选择最适合的方式来实现这个功能。

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

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

相关文章

DICOM 基础知识:深入理解DICOM数据结构与标签说明

目录 DICOM 图像概念 DICOM 图像关键特性: DICOM 文件结构 常见数据元素: 数据元素示例详解 DICOM-VR 数据类型说明 DICOM 标准支持的数据集 结语 DICOM 图像概念 DICOM(Digital Imaging and Communications in Medicine&…

ELK之路第二步——可视化界面Kibana

Kibana 1.安装2.解压3.修改配置4.启动 这部分内容就比较简单了,水一片文章。 1.安装 需要梯子 官网下载链接:https://www.elastic.co/cn/downloads/past-releases/kibana-7-3-0 如果你去官网下载页面,点击下载是404报错,记得切换…

UE5之5.4 第三人称示例代码阅读

第三人称的代码相对第一人称少了很多,只有一个移动跳跃的能力 构造函数,添加角色的移动属性,限制了当controller移动角色不会乱转,然后创建了一个相机杆,创建了一个跟随相机,绑到相机杆上 然后在这个函数设…

SpringMVC6-SpringMVC的视图

目录 ThymeleafView 转发视图 重定向视图 视图控制器view-controller SpringMVC中的视图是View接口,视图的作用:渲染数据,将模型Model中的数据展示给用户 SpringMVC视图的种类很多,默认有转发视图InternalResourceView 和重定…

基于Qt的多线程并行和循序运行实验Demo

致谢(Acknowledgement): 感谢Youtube博主Qt With Ketan与KDAB精心录制的Qt多线程处理应用教程,感谢Bilibili博主爱编程的大丙对Qt多线程与线程池内容深入浅出的讲解。 一、计算机线程相关概念 线程概念[1]: 在计算机科…

【Anaconda】Anaconda3 下载与安装教程(Windows 11)

引言 Anaconda发行版是一个用于数据科学、机器学习和AI项目的平台。它包括数千个开源包,一个包和环境管理器,一个桌面应用程序,以及云服务。 安装步骤 下载安装程序 访问官方Anaconda网站下载安装程序。 https://www.anaconda.com/download/…

关闭windows更新方法

在windows更新里选择暂停windows更新 然后按下winr,输入regedit 在注册表里找到 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings\PauseUpdatesExpiryTime 修改时间即可

联想笔记本电脑睡眠后打开黑屏解决方法

下载联想机器睡眠无法唤醒修复工具 下载地址:https://tools.lenovo.com.cn/exeTools/detail/id/233/rid/6182522.html 使用完后重启电脑,问题解决。

多线程进阶——线程池的实现

什么是池化技术 池化技术是一种资源管理策略,它通过重复利用已存在的资源来减少资源的消耗,从而提高系统的性能和效率。在计算机编程中,池化技术通常用于管理线程、连接、数据库连接等资源。 我们会将可能使用的资源预先创建好,…

亿家旺生鲜云订单零售系统的设计与实现小程序ssm+论文源码调试讲解

2相关技术 2.1微信小程序 小程序是一种新的开放能力,开发者可以快速地开发一个小程序。小程序可以在微信内被便捷地获取和传播,同时具有出色的使用体验。尤其拥抱微信生态圈,让微信小程序更加的如虎添翼,发展迅猛。 2.2 MYSQL数据…

Vue笔记-element ui中关于table的前端分页

对于 Element UI 表格的前端分页&#xff0c;可以在组件中使用 JavaScript 来实现数据的分页显示&#xff0c;而不必从后端获取已分页的数据。以下是一个简单的示例&#xff0c;演示如何在前端进行 Element UI 表格的分页&#xff1a; <template><div><el-tabl…

SpringBoot核心框架之AOP详解

SpringBoot核心框架之AOP详解 一、AOP基础 1. AOP概述 AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程&#xff0c;面向方面编程&#xff09;&#xff0c;其实就是面向特定方法编程。 场景&#xff1a; 项目部分功能运行较慢&#xff0c;定位执行耗时…

CSS_定位_网页布局总结_元素的显示与隐藏

目录 目标 1. 定位 1.1 为什么需要定位 1.2 定位组成 1. 定位模式 2. 边偏移 1.3 静态定位 static&#xff08;了解&#xff09; 1.4 相对定位 relative&#xff08;重要&#xff09; 1.5 绝对定位 absolute&#xff08;重要&#xff09; 1.6 子绝父相的由来&#xff…

【CCL】浅析 CFX Command Language

【CCL】浅析 CFX Command Language 文章目录 【CCL】浅析 CFX Command LanguageI - 前言ActionsPower Syntax II - Perl 语法概述变量定义注释字符串操作符其他 CCL 语法概述参考链接 I - 前言 CCL 全称是 CFX Command Language &#xff0c;是 CFX-Post 软件内部通讯的命令行…

LLM | 论文精读 | NeurIPS 2023 | SWIFTSAGE: 结合快思考与慢思考的生成智能体

论文标题&#xff1a;SWIFTSAGE: A Generative Agent with Fast and Slow Thinking for Complex Interactive Tasks 作者&#xff1a;Bill Yuchen Lin, Yicheng Fu, Karina Yang, Faeze Brahman, Shiyu Huang, Chandra Bhagavatula, Prithviraj Ammanabrolu, Yejin Choi, Xian…

Python的协程与传统的线程相比,是否能更有效地利用计算资源?在多大程度上,这种效率是可测量的?如何量化Python协程的优势|协程|线程|性能优化

目录 1. 协程与线程的基本概念 1.1 线程 1.2 协程 2. 协程的实现原理 2.1 基本示例 3. 协程与线程的效率对比 3.1 资源利用率 3.2 性能测试 4. 使用场景分析 4.1 适用场景 4.2 不适用场景 5. 性能监测与测量 5.1 使用时间记录 5.2 使用第三方库 6. 总结与展望 P…

入门 | Prometheus+Grafana 普罗米修斯

#1024程序员节&#xff5c;征文# 一、prometheus介绍 1、监控系统组成 一个完整的监控系统需要包括如下功能&#xff1a;数据产生、数据采集、数据存储、数据处理、数据展示、分析、告警等。 &#xff08;1&#xff09;、数据来源 数据来源&#xff0c;也就是需要监控的数据…

【认知智能】编译器1

深度学习编译器是一种专门设计用来优化和加速深度学习模型在各种硬件平台上执行的工具。它们通过将高级深度学习框架&#xff08;如TensorFlow, PyTorch等&#xff09;中的计算图转换为针对特定硬件架构优化过的低级代码来实现这一目标。基础架构通常包括以下几个关键组件&…

ML 系列:机器学习和深度学习的深层次总结(17)从样本空间到概率规则概率

一、说明 概率是支撑大部分统计分析的基本概念。从本质上讲&#xff0c;概率提供了一个框架&#xff0c;用于量化不确定性并对未来事件做出明智的预测。无论您是在掷骰子、预测天气还是评估金融市场的风险&#xff0c;概率都是帮助您驾驭不确定性的工具。本篇将讲授概率的原理和…

STM32 第17章 EXIT--外部中断/事件控制器

时间:2024.10.23 参考资料:《零死角玩转STM32》“EXTI-外部中断/事件控制器” STM32里每一个GPIO都能产生中断,中断的产生体现在GPIO的电平的变化,电平的变化需要一个外设来管理,最终传给NVIC(内核里的嵌套中断控制器)来处理。 一、学习内容 1、EXTI功能框图+EXTI初始…