Python中实现带权重的随机测试

 更新时间:2026年05月07日 09:07:10   作者:P粉602998670  
本文主要介绍了Python中实现带权重的随机测试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

pytest中怎么给测试用例加执行权重

pytest本身不支持测试用例权重调度,pytest的执行顺序默认按文件/函数名排序,或靠--randomly插件随机化,但“按权重随机”得自己控制。核心思路是:不改变pytest调度机制,而是在测试函数内部用random.choices()random.random()做条件跳过。

常见错误是试图在pytest_generate_tests里动态生成带权重的参数化用例——这只能控制参数组合数量,无法让同一个测试函数被“更大概率执行”。真正要的是:每次运行时,每个测试有独立概率被触发。

  • @pytest.mark.skipif配合随机判断是最轻量、最兼容的方式
  • 权重需归一化为概率值(如权重[3,1,2] → 概率[0.5, 0.167, 0.333])
  • 避免在setup_methodconftest.py顶层调用random,否则所有测试共享同一随机结果

用random.choices实现多测试函数的加权调度

如果你有一组测试函数,想让它们按权重被选中执行(比如模拟高频/低频场景),可以用random.choices()从函数列表中抽样,再用pytest.skip()跳过未被选中的。注意:这要求所有候选测试函数在同一模块中,且用相同装饰器逻辑。

示例场景:三个测试函数test_logintest_searchtest_logout,权重分别为5、3、2:

import random
import pytest
<p>TESTS = [
("test_login", 5),
("test_search", 3),
("test<em>logout", 2),
]
weights = [w for </em>, w in TESTS]
selected<em>name = random.choices([n for n, </em> in TESTS], weights=weights, k=1)[0]</p><p>def skip_if_not_selected(test_name):
if test_name != selected_name:
pytest.skip(f"Weighted skip: {test_name} not selected")</p><p>def test_login():
skip_if_not_selected("test_login")
assert True</p><p>def test_search():
skip_if_not_selected("test_search")
assert True</p><p>def test_logout():
skip_if_not_selected("test_logout")
assert True

⚠️ 注意:每次pytest运行只会执行其中一个测试,因为selected_name在模块导入时就固定了。如需每次调用都重新采样,得把random.choices()移到每个测试函数内部,但会失去“整体权重分布”的语义。

为什么不用pytest-randomly或pytest-ordering

pytest-randomly只打乱执行顺序,不支持权重;pytest-ordering只控制先后,不能控制是否执行。强行用它们“模拟权重”,比如重复定义同一测试函数多次(test_login_v1test_login_v2test_login_v3),会导致报告中出现冗余条目、覆盖率统计失真、CI日志膨胀。

更严重的问题是:这类方案会让pytest --lf(last-failed)失效,因为失败的其实是某个别名,下次重跑时找不到原名。

  • 真实权重逻辑必须在运行时、函数级判定,而非生成时
  • 权重应随每次pytest进程独立计算,不能依赖全局状态
  • 如果需要跨会话稳定权重(比如A/B测试分流),得用os.environ.get("TEST_SEED")固定random.seed()

如何让权重配置可外部化

硬编码权重不利于维护。推荐把权重表放到JSON或pyproject.toml中,用importlib.resources读取(Python 3.9+)或pathlib.Path(__file__).parent / "weights.json"加载:

# weights.json
{
  "test_api_create": 4,
  "test_api_update": 2,
  "test_api_delete": 1
}

然后在测试模块中:

import json
from pathlib import Path
<p>WEIGHTS = json.loads((Path(<strong>file</strong>).parent / "weights.json").read_text())
total = sum(WEIGHTS.values())</p><h1>在每个测试函数开头:</h1><p>if random.random() > WEIGHTS.get("test_api_create", 0) / total:
pytest.skip("Low-weight test")

这个写法比choices()更灵活:允许单个测试独立决定是否执行,也便于后期接入外部配置中心或环境变量覆盖。

真正容易被忽略的是:权重值本身没有单位意义,只有相对比例才起作用。设成[100, 1, 1]和[10, 0.1, 0.1]效果完全一样,但前者更容易让人误以为“100次里必执行100次”,其实只是概率更高而已。

到此这篇关于Python中实现带权重的随机测试的文章就介绍到这了,更多相关Python 带权重随机测试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解python3实现的web端json通信协议

    详解python3实现的web端json通信协议

    本篇文章主要介绍了python3实现的web端json通信协议,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-12-12
  • 如何解决jupyter notebook无法导入自己安装的包

    如何解决jupyter notebook无法导入自己安装的包

    这篇文章主要介绍了如何解决jupyter notebook无法导入自己安装的包问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 如何利用python查找电脑文件

    如何利用python查找电脑文件

    利用python查找电脑里的文件非常方便,首先是导入模块os,然后利用os.listdir()打开目录下的所有文件,files其实是一个列表。具体操作方法大家参考下本文
    2018-04-04
  • Python对130w+张图片检索的实现方法

    Python对130w+张图片检索的实现方法

    这篇文章主要给大家介绍了关于Python对130w+张图片检索的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • python ssh 执行shell命令的示例

    python ssh 执行shell命令的示例

    这篇文章主要介绍了python ssh 执行shell命令的示例,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-09-09
  • Python3实现旋转数组的3种算法小结

    Python3实现旋转数组的3种算法小结

    旋转数组是一种常见的数据结构问题,通常是指一个有序数组经过旋转后,使得所有元素逆序排列,本文主要介绍了Python3实现旋转数组的3种算法小结,感兴趣的可以了解一下
    2023-12-12
  • 关于pytorch多GPU训练实例与性能对比分析

    关于pytorch多GPU训练实例与性能对比分析

    今天小编就为大家分享一篇关于pytorch多GPU训练实例与性能对比分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)

    python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)

    这篇文章主要介绍了python环境搭建和pycharm的安装配置及汉化(零基础小白版),需要的朋友可以参考下
    2020-08-08
  • SymPy库关于矩阵的基本操作和运算

    SymPy库关于矩阵的基本操作和运算

    本文主要介绍了SymPy库关于矩阵的基本操作和运算,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Python压缩模块zipfile实现原理及用法解析

    Python压缩模块zipfile实现原理及用法解析

    这篇文章主要介绍了Python压缩模块zipfile实现原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08

最新评论