接口自動化測試:pytest-xdist之session級別的fixture只執行一次


概況:

1、多個接口測試用例單線程執行很慢,需要用pytest-xdist插件提高執行速度;

2、存在session級別fixture,只能執行一次:執行登錄等前置操作,獲取token等全局數據,如果多次執行,則之前的token會失效

3、pytest-xdist插件沒有實現session只執行一次的機智,但提供了文件鎖的解決方案,官網:https://www.baidu.com/link?url=diurQHxNUGWze5amBnj_RLJkQvo1-Ls5l2N3Db7HKSamAzRidZDL1LAYl4mxZecP&wd=&eqid=ad97ca9b003dd6f2000000065f9634e9

遇到的問題:

以為官網示例中的參數、方法等都是隨便寫的偽方法,所以自己想當然的也隨意寫了,查找資料搞了很久沒有解決。

最終解決:

其實,官網給的資料就是解決方案,其中的tmp_path_factory、worker_id等參數都是框架已經實現了的,直接按照示例套用就行

@pytest.fixture(scope="session", autouse=True) def c_login_fixture(tmp_path_factory, worker_id): """執行用例前登錄獲取token"""
    if worker_id == "master": #如果是單線程執行,會走這里的邏輯
        user_account = os.environ["user_account"] password = os.environ["password"] res = login(user_account, password).json() #將token加入到環境變量中,測試用例可以直接從環境變量中取
        token = res["result"]["token"] os.environ["token"] = token return root_tmp_dir = tmp_path_factory.getbasetemp().parent fn = root_tmp_dir / "data.json" with FileLock(str(fn) + ".lock"): if fn.is_file(): # 從緩存文件中讀取token
            token = json.loads(fn.read_text()) os.environ["token"] = token else: ## 登錄后獲取token,寫入到緩存文件中
            user_account = os.environ["user_account"] password = os.environ["password"] res = login(user_account, password).json() token = res["result"]["token"] fn.write_text(json.dumps(token)) os.environ["token"] = token return

其他問題:

fixture只執行一次的問題解決后,新的問題出現了:

現象:

在用例並行執行過程中,發現部分用例會失敗甚至程序拋出異常的問題,進一步排查后發現,是某些接口會不定時的隨機請求失敗;

將pytest -n 2命令中的線程數調整后發現失敗的接口發生變化;

單獨把請求失敗的接口拿出來請求,沒問題

最終問題定位:

業務方面的原因,某些業務接口不支持並發:因為有些數據必需(比如code)唯一,所以同時執行會發生沖突,導致接口失敗

解決方案:

1、在特定的接口請求前加延遲,還是會有失敗的情況,不穩定;

2、添加重試機制和重試等待時間:--reruns 1 --reruns-delay 2(可以稍微設置大點),參考https://www.cnblogs.com/my_captain/p/12720190.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM