概況:
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

