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) 以页面为单位来封装页面上 ...
随机推荐
- IDEA 一个服务同时启动多个实例
有些时候为了测试,服务的分发,我们可以在IDEA中对一个微服务启动多个实例,配置方法如下: 1.编辑同时启动的微服务. 勾选 allow parallel run 2.编辑完成后复制一份配置. 3.复 ...
- TypeScript 笔记(一)
1. TypeScript 的介绍 完整教程TypeScript 入门教程 TypeScript 是 JavaScript 的一个超集,支持 ECMAScript 6 标准,由微软开发的自由和开源的编 ...
- API开发与管理规范v1.0
1. 协议规范 为了确保不同业务系统之间以及前后端的的数据交互的快捷性,通讯协议统一约定如下: 对内调用的API接口统一使用 HTTP协议 对外互联网发布的API建议使用HTTPS协议也可以使用HTT ...
- startup
要提取startup/后面的字符,可以使用cut命令或awk命令.以下是两种方法: 使用cut命令: bash #!/bin/bash # 给定的字符串 STR1="startup/valu ...
- Qt/C++音视频开发74-合并标签图形/生成yolo运算结果图形/文字和图形合并成一个/水印滤镜
一.前言 在使用yolo做人工智能运算后,运算结果除了一个方框,还可能需要增加文字显示在对应方框上,以便标记是何种物体,比如显示是人还是动物,或者还有可能追踪人员,显示该人员的姓名.这种应用场景非常普 ...
- RxSqlUtils(base R2dbc)
一.前言 随着 Solon 3.0 和 Solon-Rx 3.0 发布,又迎来了的 RxSqlUtils 扩展插件,用于"响应式"操作数据库.RxSqlUtils 是基于 R2db ...
- Wasm在即时通讯IM场景下的Web端应用性能提升初探
本文由得物技术WWQ分享,原题"基于IM场景下的Wasm初探:提升Web应用性能",下文进行了排版和内容优化. 1.什么是Wasm Wasm,全称 WebAssembly,官网描述 ...
- IM开发者的零基础通信技术入门(十五):理解定位技术,一篇就够
[来源申明]本文引用了微信公众号"鲜枣课堂"的<老司机揭秘手机定位技术,这下彻底明白啦!>文章内容.为了更好的内容呈现,下文在引用和收录时内容有改动,转载时请注明原文来 ...
- .Net程序员机会来了,微软官方新推出一个面向Windows开发者本地运行AI模型的开源工具
想要开发AI产品的.Net程序员机会来了,这个项目应该好好研究. 虽然说大模型基本都有提供网络API,但肯定没有直接使用本地模型速度快. 最近微软官方新推出AI Dev Gallery开源项目,可以帮 ...
- linux下VEP的安装
VEP(Variant Effect Predictor)作为Ensembl官方推出的变异影响预测软件,被广泛使用,以下内容也来自Ensembl 软件包下载(ZIP格式): curl -L-Ohttp ...