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

Python中實(shí)現(xiàn)帶權(quán)重的隨機(jī)測(cè)試

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

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

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

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

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

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

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

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

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

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

更嚴(yán)重的問(wèn)題是:這類(lèi)方案會(huì)讓pytest --lf(last-failed)失效,因?yàn)槭〉钠鋵?shí)是某個(gè)別名,下次重跑時(shí)找不到原名。

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

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

硬編碼權(quán)重不利于維護(hù)。推薦把權(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
}

然后在測(cè)試模塊中:

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>在每個(gè)測(cè)試函數(shù)開(kāi)頭:</h1><p>if random.random() > WEIGHTS.get("test_api_create", 0) / total:
pytest.skip("Low-weight test")

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

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

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

相關(guān)文章

最新評(píng)論

屏南县| 恭城| 岳普湖县| 安阳市| 威海市| 宜宾市| 丰宁| 临夏市| 青河县| 博客| 安陆市| 曲水县| 大理市| 北安市| 朝阳区| 岳西县| 桃源县| 株洲市| 尉氏县| 玉林市| 沾益县| 金秀| 年辖:市辖区| 万源市| 青州市| 闵行区| 永昌县| 临夏市| 什邡市| 衢州市| 南投县| 天镇县| 天津市| 郓城县| 瑞昌市| 德惠市| 裕民县| 襄樊市| 东乡族自治县| 巴东县| 六安市|