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