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. ORCA避障源码笔记

    参考资料 https://gamma.cs.unc.edu/ORCA/publications/ORCA.pdf https://gamma.cs.unc.edu/RVO2/ 数学知识 1.向量的点乘 ...

  2. NFS服务搭建过程

    NFS服务 [1].nfs配置 作用: 解决数据一致性问题 NFS服务程序的配置文件为/etc/exports,需要严格按照共享目录的路径 允许访问的NFS客户端(共享权限参数)格式书写,定义要共享的 ...

  3. CentOS上配合nginx 使用 Certbot 生成SSL证书

    您可以使用 Let's Encrypt 来申请免费的 SSL 证书.以下是在 CentOS 上安装 Certbot 并使用它来获取 Let's Encrypt SSL 证书的步骤: 安装 Certbo ...

  4. openEuler创建和root一样的账号

    1. 使用以下命令在 openEuler 操作系统的 root 用户下创建管理员用户: useradd -m -G root admin -m 表示创建用户的同时创建用户的主目录, -G 表示将用户添 ...

  5. PM-从后微服务谈架构演进

    2022 年,关于微服务发生了几件有趣的事情. 其一,正式掌管 Twitter 不久的 Elon Musk 对 Twitter 的开发团队 "批判" 了一番.他表示自己为 Twit ...

  6. tomcat部署cas6并配置自己的ssl证书

    ​配置并安装tomcat,详见我的文章:windows安装tomcat10 安装必备的软件:(在<windows安装tomcat10>中已详细配置) apache-tomcat-10.1. ...

  7. win10重装如何跳过微软账号直接设置本地帐户

    ​在添加你的帐户界面,选择脱机帐户 第二个页面,选择有限的体验 第三个页面,设置自己本地的用户名 第四个页面,设置自己本地的密码

  8. 理解 ASP.NET Core:Cookie 认证

    理解 ASP.NET Core:Cookie 认证 ASP.NET Core 内置提供了基于 Cookie 的认证支持.在使用 Cookie 验证的时候,相关的三要素: 认证模式名称:CookieAu ...

  9. Java的HTTP接口测试框架Gatling

    之前讲过的<JHM>是一个java的基准测试框架,一般用于测试jdk里的API.如果要测试http接口,可以使用Gatling. 你可能用过JMeter,也是可以的 原生的Gatling是 ...

  10. [双体系练习]Java基础易错点

    toCharArray()和split()的区别. toCharArray() 这个方法将一个字符串转换成一个字符数组.每个字符都会成为数组中的一个元素. 返回值:一个包含字符串中所有字符的char数 ...