pytest自动化测试 - 我对测试用例超时处理的一点看法
1 pytest自动化测试 - 我对测试用例超时处理的一点看法
1.1 背景
用例在执行过程中,可能由于网络等待,或者等待一些特殊的文件,而又由于一些异常,导致这些条件一直不能满足,用例卡死,这种情况在自动化测试中是不允许的,会浪费大量的时间,影响测试任务的进度,甚至导致版本发布周期的延长。
为了给每个用例都设置上超时时间,有以下几种方法:
1.2 方法1:给每个用例添加@pytest.mark.timeout
修饰器
@pytest.mark.timeout在Windows下并不能很好的工作,1 个用例出现超时,整个测试任务就中断了,非常扯淡!
import pytest
import time
@pytest.mark.timeout(5)
def test_case1():
time.sleep(2)
assert True
@pytest.mark.timeout(5)
def test_case2():
time.sleep(6) # 此用例会超时
assert True
def test_case3():
print("用例3:Windows下不会执行")
assert 3 == 3
1.3 方法2:使用钩子函数给每个用例添加一个timeout修饰器
然而,下面这个做法,在Windows下并没有什么卵用!,超时的那个用例也执行成功了!
import pytest
import time
def pytest_collection_modifyitems(session, config, items):
for item in items:
item.add_marker(pytest.mark.timeout(3))
def setup_function():
print()
def test_case3():
print("用例3:开始")
time.sleep(3)
assert True
print("用例3:结束")
def test_case4():
print("用例4:开始")
time.sleep(5) # 此用例会超时,但Windows不超时,神奇!
assert True
print("用例4:结束")
def test_case5():
print("用例5: 开始")
assert 3 == 3
print("用例5: 结束")
Windows下的执行结果:
============================= test session starts =============================
platform win32 -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
rootdir: D:\TYYSOFT\Study\Python\pytest
configfile: pytest.ini
plugins: check-2.4.1, html-4.1.1, metadata-3.1.1, timeout-2.3.1, xdist-3.6.1
collected 3 items
test_timeout_004.py
用例3:开始
用例3:结束
.
用例4:开始
用例4:结束
.
用例5: 开始
用例5: 结束
.
-- Generated html report: file:///D:/TYYSOFT/Study/Python/pytest/report.html --
============================== 3 passed in 8.03s ==============================
其他所谓的使用timeout
标记的超时处理在Windows下都没有什么卵用!
1.4 方法3:介绍一个自己写的使用线程处理用例超时的方法
用例的超时,其实主要是监控每条任务的超时情况,通过创建1个基础函数base_func
这个函数每次调用时都创建1个线程,并给线程设置超时时间,用例中的执行语句都通过这个线程函数base_func
来执行,base_func
中对超时任务会设置失败。
import pytest
import threading
import time
# 核心函数:该函数创建1个线程,并执行给定的task,超时后会把用例设置为失败
def base_func(task, timeout=5):
thread = threading.Thread(target=task)
thread.start()
thread.join(timeout) #设置超时
if thread.is_alive():
print(f"::{task.__name__}: 语句执行超时...")
assert False
# 1个长时间任务
def long_time_task():
time.sleep(2)
# 模块发送消息的基础函数
def send_msg(msg):
print(msg)
# 预置条件
def setup_function():
print()
base_func(print("预置条件!"))
# 这是用例1
def test_timeout_001():
base_func(send_msg("用例1开始"))
base_func(long_time_task)
base_func(send_msg("用例1结束"))
def test_timeout_002():
base_func(send_msg("用例2开始"))
base_func(send_msg("用例2结束"))
输出结果:
============================= test session starts =============================
platform win32 -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
rootdir: D:\TYYSOFT\Study\Python\pytest
configfile: pytest.ini
plugins: check-2.4.1, html-4.1.1, metadata-3.1.1, timeout-2.3.1, xdist-3.6.1
collected 2 items
test_timeout_002.py
预置条件!
用例1开始
::long_time_task: 语句执行超时...
F
预置条件!
用例2开始
用例2结束
.
================================== FAILURES ===================================
______________________________ test_timeout_001 _______________________________
def test_timeout_001():
base_func(send_msg("用例1开始"))
> base_func(long_time_task)
test_timeout_002.py:31:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
task = <function long_time_task at 0x000001AAE4112DE0>, timeout = 5
def base_func(task, timeout=5):
thread = threading.Thread(target=task)
thread.start()
thread.join(timeout) #设置超时
if thread.is_alive():
print(f"::{task.__name__}: 语句执行超时...")
> assert False
E assert False
test_timeout_002.py:13: AssertionError
-- Generated html report: file:///D:/TYYSOFT/Study/Python/pytest/report.html --
=========================== short test summary info ===========================
FAILED test_timeout_002.py::test_timeout_001 - assert False
========================= 1 failed, 1 passed in 5.11s =========================
两个用例都执行了, 第2个用例并没有因为第1个用例超时而中止执行!
使用基础函数来包装测试执行语句的必要性, 因为实际在测试执行时, 每个语句都有可能执行超时,对其进行封装执行可以保证测试脚本的严谨性。
作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来自AI平台,如:豆包、DeepSeek(硅基流动)(注册链接)等,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright 2022~2025 All rights reserved.
pytest自动化测试 - 我对测试用例超时处理的一点看法的更多相关文章
- 广深小龙-基于unittest、pytest自动化测试框架之demo来学习啦!!!
基于unittest.pytest自动化测试框架之demo,赶紧用起来,一起学习吧! demo分为两个框架:①pytest ②unittest demo 中 包含 web.api 自动化测试框架 ...
- Pytest自动化测试-简易入门教程(02)
Pytest框架简介 Pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:1.简单灵活,容易上手,支持参数化2.能够支持简单的单元测试和复杂的功能测试,3.还可以用来做sel ...
- Python单元测试框架之pytest 1 ---如何执行测试用例
From: https://www.cnblogs.com/fnng/p/4765112.html 介绍 pytest是一个成熟的全功能的Python测试工具,可以帮助你写出更好的程序. 适合从简 ...
- pytest多进程/多线程执行测试用例
前言: 实际项目中的用例数量会非常多,几百上千:如果采用单进程串行执行的话会非常耗费时间.假设每条用例耗时2s,1000条就需要2000s $\approx$ 33min:还要加上用例加载.测试前/后 ...
- rt-thread中软件定时器组件超时界限的一点理解
@2019-01-15 [小记] 对 rt-thread 中的软件定时器组件中超时界限的一点理解 rt_thread_timer_entry(void *parameter)函数中if ((next_ ...
- Pytest自动化测试 - 必知必会的一些插件
Pytest拥有丰富的插件架构,超过800个以上的外部插件和活跃的社区,在PyPI项目中以" pytest- *"为标识. 本篇将列举github标星超过两百的一些插件进行实战演示 ...
- Pytest自动化测试 - 完美结合Allure
简介 Allure Framework是一种灵活的.轻量级.多语言测试报告工具. 不仅可以以简洁的网络报告形式非常简洁地显示已测试的内容, 而且还允许参与开发过程的每个人从日常执行中提取最大程度的有用 ...
- Pytest自动化测试-简易入门教程(03)
今天分享内容的重点,和大家来讲一下我们的测试框架--Pytest 讲到这个框架的话呢,可能有伙伴就会问老师,我在学习自动化测试过程中,我们要去学一些什么东西? 第一个肯定要学会的是一门编程语言,比如说 ...
- Pytest自动化测试-简易入门教程(01)
我们今天主讲的内容,就是测试框架Pytest,讲到这个测试框架对于没有做过Web自动化的伙伴来说,会觉得这个东西是陌生的,那么到底什么是框架呢?什么又是自动化呢?自动化为什么又要用框架呢? 难道我学自 ...
- GUI自动化测试中优化测试用例思维方法
1.测试脚本与数据解耦(数据驱动) 让操作相同但是数据不同的测试可以通过同一 套自动化测试脚本来实现,只是在每次测试执行时提供不同的测试输入数据. 2.页面对象模型(POM) 以页面为单位来封装页面上 ...
随机推荐
- 【实战问题】-- 并发的时候分布式锁setnx细节
前面讲解到实战问题]-- 设计礼品领取的架构设计以及多次领取现象解决?,如果出现网络延迟的情况下,多个请求阻塞,那么恶意攻击就可以全部请求领取接口成功,而针对这种做法,我们使用setnx来解决,确保只 ...
- MySQL底层概述—7.优化原则及慢查询
大纲 1.Explain概述 2.Explain详解 3.索引优化数据准备 4.索引优化原则详解 5.慢查询设置与测试 6.慢查询SQL优化思路 1.Explain概述 使用Explain关键字可以模 ...
- IOS快捷指令代码分享
IOS快捷指令分享 制作快捷指令 首先在快捷指令APP上制作快捷指令 添加一些逻辑,具体可以自己体验 然后点击共享,获取iCloud链接 类似于这种 https://www.icloud.com/sh ...
- vmagent如何快速采集和转发Metrics
vmagent如何快速采集和转发Metrics 本文介绍了vmagent的设计细节,参考自:vmagent-how-it-works VictoriaMetrics agent是一个轻量级工具,用于采 ...
- Docker之操作系统Alpine
简介 图 1.24.2.1 - Apline Linux 操作系统 Alpine 操作系统是一个面向安全的轻型 Linux 发行版.它不同于通常 Linux 发行版,Alpine 采用了 musl l ...
- OpenMMLab AI实战营 第三课笔记
OpenMMLab AI实战营 第三课笔记 目录 OpenMMLab AI实战营 第三课笔记 进入 mmclassification 目录 导入工具包 下载数据集 数据集目录结构 下载 config ...
- 2020-2024 IDEA安装+激活
一.下载 1. IDEA各版本官方下载入口 IDEA官网下载地址 2. 选择左边,然后点击[20xx.x.x-Windows(exe)] PS: 如需下载特定版本,可以往下拉,都是选择[202x.x- ...
- 题解:CF727F Polycarp's problems
link. 贪心做法. 本题贪心做法的实质就是用整数尽量多地抵消该整数后面的负数. 如果正着做,没有办法考虑全该数后面的所有负数,所以倒着做. 例如当前遍历到了 \(50\),此时序列如下: \[\d ...
- w3cschool-MyBatis-Plus 插件
https://www.w3cschool.cn/mybatis_plus/mybatis_plus-udwn3mgc.html MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具 ...
- 第七章 LinkedBlockingQueue源码解析
1.对于LinkedBlockingQueue需要掌握以下几点 创建 入队(添加元素) 出队(删除元素) 2.创建 Node节点内部类与LinkedBlockingQueue的一些属性 static ...