python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python 带权重随机测试

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

作者:P粉602998670

本文主要介绍了Python中实现带权重的随机测试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

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

用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)失效,因为失败的其实是某个别名,下次重跑时找不到原名。

如何让权重配置可外部化

硬编码权重不利于维护。推荐把权重表放到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 带权重随机测试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文