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自动化测试 - 我对测试用例超时处理的一点看法的更多相关文章

  1. 广深小龙-基于unittest、pytest自动化测试框架之demo来学习啦!!!

    基于unittest.pytest自动化测试框架之demo,赶紧用起来,一起学习吧! demo分为两个框架:①pytest    ②unittest demo 中 包含 web.api 自动化测试框架 ...

  2. Pytest自动化测试-简易入门教程(02)

    Pytest框架简介 Pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:1.简单灵活,容易上手,支持参数化2.能够支持简单的单元测试和复杂的功能测试,3.还可以用来做sel ...

  3. Python单元测试框架之pytest 1 ---如何执行测试用例

    From: https://www.cnblogs.com/fnng/p/4765112.html 介绍   pytest是一个成熟的全功能的Python测试工具,可以帮助你写出更好的程序. 适合从简 ...

  4. pytest多进程/多线程执行测试用例

    前言: 实际项目中的用例数量会非常多,几百上千:如果采用单进程串行执行的话会非常耗费时间.假设每条用例耗时2s,1000条就需要2000s $\approx$ 33min:还要加上用例加载.测试前/后 ...

  5. rt-thread中软件定时器组件超时界限的一点理解

    @2019-01-15 [小记] 对 rt-thread 中的软件定时器组件中超时界限的一点理解 rt_thread_timer_entry(void *parameter)函数中if ((next_ ...

  6. Pytest自动化测试 - 必知必会的一些插件

    Pytest拥有丰富的插件架构,超过800个以上的外部插件和活跃的社区,在PyPI项目中以" pytest- *"为标识. 本篇将列举github标星超过两百的一些插件进行实战演示 ...

  7. Pytest自动化测试 - 完美结合Allure

    简介 Allure Framework是一种灵活的.轻量级.多语言测试报告工具. 不仅可以以简洁的网络报告形式非常简洁地显示已测试的内容, 而且还允许参与开发过程的每个人从日常执行中提取最大程度的有用 ...

  8. Pytest自动化测试-简易入门教程(03)

    今天分享内容的重点,和大家来讲一下我们的测试框架--Pytest 讲到这个框架的话呢,可能有伙伴就会问老师,我在学习自动化测试过程中,我们要去学一些什么东西? 第一个肯定要学会的是一门编程语言,比如说 ...

  9. Pytest自动化测试-简易入门教程(01)

    我们今天主讲的内容,就是测试框架Pytest,讲到这个测试框架对于没有做过Web自动化的伙伴来说,会觉得这个东西是陌生的,那么到底什么是框架呢?什么又是自动化呢?自动化为什么又要用框架呢? 难道我学自 ...

  10. GUI自动化测试中优化测试用例思维方法

    1.测试脚本与数据解耦(数据驱动) 让操作相同但是数据不同的测试可以通过同一 套自动化测试脚本来实现,只是在每次测试执行时提供不同的测试输入数据. 2.页面对象模型(POM) 以页面为单位来封装页面上 ...

随机推荐

  1. 如何给自己的网站添加live2D女仆

    <script type="text/javascript" charset="utf-8"  src="https://files.cnblo ...

  2. moectf2023的一些题

    [moectf]GUI 这是一道win32窗口程序 找到线程的回调函数 sub_740C94这个函数里有很多函数,意义不明,实际并不会对输入的字符串做出改变 回调函数里下断点,然后单步动调 sub_7 ...

  3. uni-app生命周期小测

    标签: js uni-app 前情 uni-app是我很喜欢的跨平台框架,它能开发小程序,H5,APP(安卓/iOS),对前端开发很友好,自带的IDE让开发体验也很棒,公司项目就是主推uni-app. ...

  4. 大文件传输与断点续传实现(极简Demo: React+Node.js)

    大文件传输与断点续传实现(极简Demo:React+Node.js) 简述 使用React前端和Node.js后端实现大文件传输和断点续传的功能.通过分片上传技术,可以有效地解决网络不稳定带来的传输中 ...

  5. Superpower:一个基于 C# 的文本解析工具开源项目

    推荐一个文本解析开源工具:Superpower,方便我们解析文本,比如解析日志文件.构建自己的编程语言还是其他需要精确解析和错误报告的场景. 01 项目简介 Superpower 的核心功能是将字符序 ...

  6. 通过云主机调用API,一键训练部署商品问答模型

    本文分享自华为云社区<[开发者空间实践指导]CodeArts IDE调用API训练商品问答模型>,作者:开发者空间小蜜蜂. 一.案例介绍 在电子商务领域,售前和售后服务是确保客户满意度和提 ...

  7. shell脚本忽略错误继续执行

    在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行.如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set +e 命令来取消该设置. 例如,下面是一个忽略错误并继 ...

  8. Qt编写物联网管理平台33-设备面板

    一.前言 设备面板展示数据,相对于表格展示,可能在一个页面中能够展示的设备数据量少一些,但是有些用户和场景,又需要这种面板的形式,可能更生动形象一些.尤其是经过这么些年的社会的毒打,我的原则是:用户是 ...

  9. Qt数据库应用3-数据打印到pdf

    一.前言 自从数据可以导出到xls,又有客户提出了不同的需求,比如既然可以将数据导出到xls,那是否可以导出到pdf文件呢?因为xls打开以后用户可以修改数据造假之类的,而pdf默认是不可编辑的,除非 ...

  10. Vue中this.$store.dispatch() 与 this.$store.commit()的区别

    两者的区别 (1)this.$store.commit() commit: 同步操作 this.$store.commit('方法名',值)[存储] this.$store.state.方法名[取值] ...