最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中實現(xiàn)帶權(quán)重的隨機測試

 更新時間:2026年05月07日 09:07:10   作者:P粉602998670  
本文主要介紹了Python中實現(xiàn)帶權(quán)重的隨機測試,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

pytest中怎么給測試用例加執(zhí)行權(quán)重

pytest本身不支持測試用例權(quán)重調(diào)度,pytest的執(zhí)行順序默認(rèn)按文件/函數(shù)名排序,或靠--randomly插件隨機化,但“按權(quán)重隨機”得自己控制。核心思路是:不改變pytest調(diào)度機制,而是在測試函數(shù)內(nèi)部用random.choices()random.random()做條件跳過。

常見錯誤是試圖在pytest_generate_tests里動態(tài)生成帶權(quán)重的參數(shù)化用例——這只能控制參數(shù)組合數(shù)量,無法讓同一個測試函數(shù)被“更大概率執(zhí)行”。真正要的是:每次運行時,每個測試有獨立概率被觸發(fā)。

  • @pytest.mark.skipif配合隨機判斷是最輕量、最兼容的方式
  • 權(quán)重需歸一化為概率值(如權(quán)重[3,1,2] → 概率[0.5, 0.167, 0.333])
  • 避免在setup_methodconftest.py頂層調(diào)用random,否則所有測試共享同一隨機結(jié)果

用random.choices實現(xiàn)多測試函數(shù)的加權(quán)調(diào)度

如果你有一組測試函數(shù),想讓它們按權(quán)重被選中執(zhí)行(比如模擬高頻/低頻場景),可以用random.choices()從函數(shù)列表中抽樣,再用pytest.skip()跳過未被選中的。注意:這要求所有候選測試函數(shù)在同一模塊中,且用相同裝飾器邏輯。

示例場景:三個測試函數(shù)test_login、test_searchtest_logout,權(quán)重分別為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運行只會執(zhí)行其中一個測試,因為selected_name在模塊導(dǎo)入時就固定了。如需每次調(diào)用都重新采樣,得把random.choices()移到每個測試函數(shù)內(nèi)部,但會失去“整體權(quán)重分布”的語義。

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

pytest-randomly只打亂執(zhí)行順序,不支持權(quán)重;pytest-ordering只控制先后,不能控制是否執(zhí)行。強行用它們“模擬權(quán)重”,比如重復(fù)定義同一測試函數(shù)多次(test_login_v1test_login_v2test_login_v3),會導(dǎo)致報告中出現(xiàn)冗余條目、覆蓋率統(tǒng)計失真、CI日志膨脹。

更嚴(yán)重的問題是:這類方案會讓pytest --lf(last-failed)失效,因為失敗的其實是某個別名,下次重跑時找不到原名。

  • 真實權(quán)重邏輯必須在運行時、函數(shù)級判定,而非生成時
  • 權(quán)重應(yīng)隨每次pytest進程獨立計算,不能依賴全局狀態(tài)
  • 如果需要跨會話穩(wěn)定權(quán)重(比如A/B測試分流),得用os.environ.get("TEST_SEED")固定random.seed()

如何讓權(quán)重配置可外部化

硬編碼權(quán)重不利于維護。推薦把權(quán)重表放到JSON或pyproject.toml中,用importlib.resources讀?。≒ython 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>在每個測試函數(shù)開頭:</h1><p>if random.random() > WEIGHTS.get("test_api_create", 0) / total:
pytest.skip("Low-weight test")

這個寫法比choices()更靈活:允許單個測試獨立決定是否執(zhí)行,也便于后期接入外部配置中心或環(huán)境變量覆蓋。

真正容易被忽略的是:權(quán)重值本身沒有單位意義,只有相對比例才起作用。設(shè)成[100, 1, 1]和[10, 0.1, 0.1]效果完全一樣,但前者更容易讓人誤以為“100次里必執(zhí)行100次”,其實只是概率更高而已。

到此這篇關(guān)于Python中實現(xiàn)帶權(quán)重的隨機測試的文章就介紹到這了,更多相關(guān)Python 帶權(quán)重隨機測試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

青田县| 马鞍山市| 鄂州市| 和硕县| 和顺县| 翁牛特旗| 襄垣县| 奈曼旗| 仪陇县| 常德市| 宜黄县| 常宁市| 益阳市| 阿坝| 屯昌县| 普宁市| 同仁县| 青浦区| 澄江县| 海阳市| 水富县| 霍城县| 藁城市| 山东省| 康定县| 延安市| 襄垣县| 鄂托克前旗| 兰州市| 香港| 德钦县| 玛沁县| 张掖市| 阳曲县| 彰化县| 丰县| 安新县| 河北区| 三穗县| 铜梁县| 武平县|