pytest執行順序:前後case存在相互影響

1. pytest執行模塊不是順序的

pytest在執行一個模塊的所有case時,並不是按照代碼從上往下的順序執行的。

每個case的測試環境是一定的,有前置和後置環節,如果在測試過程中有其他case插入,就可能產生這樣的情況:其他case的操作導致被插入的case執行環境異常,從而導致測試不通過。即:case之間相互影響。

2. 實際舉例

以上是在某個自動化測試過程中發現了該問題。
test_live_window 這個case 在執行測試時,出現部分跑過、部分不過的問題,而且這個問題在Jenkins上跑是必現的。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-L1RIujAD-1588937827740)(/api/project/236324/files/20869572/imagePreview)]
另外,我通過對比那部分報錯的case,發現報錯的位置都是一樣的,涉及具體的業務就是獲取的“窗格信息”的寬和高數值反了,即寬變成了高,高變成了寬。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Uf1hRN7I-1588937827742)(/api/project/236324/files/20869579/imagePreview)]

於是我在本地的pycharm中執行這個test_live_window 的case,並沒有發現問題,都是可以跑過的。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VG8FrXVC-1588937827744)(/api/project/236324/files/20869374/imagePreview)]

那麼問題出在哪裏呢?
可以看出,只有在Jenkins上跑全部的case時會出現,在本地單跑這一條測試用例可以成功,沒有問題;那麼我現在本地的pycharm中擴大測試範圍,即跑 test_live_window 所在的腳本(模塊),這樣會執行該腳本中的所有case,而不只是 test_live_window 單條case,在這種方法下,終於發現了問題,能復現在使用Jenkins跑所有測試腳本時出現的問題了。

從圖中可以看出,test_live_window 這個case的所有參數化構建的場景一共有18個,但並不是連續跑完的,中間竟然還跑了其他的case,這裏中間插入的就是 test_live_ucode_mirror(這個case會切換鏡像,難怪會產生前面提到的寬和高相反的問題),這樣就破壞了test_live_window的測試環境了。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-e1sDkbZj-1588937827746)(/api/project/236324/files/20869462/imagePreview)]

3. 解決case之間的相互影響

使用class,用類的範圍將 test_live_window 包含起來,這樣即使再多的參數化構建,也會一起連續跑完了,不會被其他無關的case插入,可以保證當前的測試環境沒有問題。

原來是寫成一個單獨的函數:在這裏插入圖片描述
現在用class包含起來:
在這裏插入圖片描述
同時,在寫case時,要注意每個fixture的作用範圍,合理地使用function、class、module等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章