1. 程式人生 > 實用技巧 >介面自動化測試:pytest-xdist之session級別的fixture只執行一次

介面自動化測試: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