[英]How to write pytest tests that run in 2 stages, each stage sequentially?
我在 pytest 中編寫了一堆測試,其中許多采用以下形式(偽代碼):
def test1(self, ...):
expected_events = do_thing1_that_should_generate_events(...)
assert wait_for_events_to_appear_in_ui(expected_events)
事件需要幾分鍾才會出現在 UI 中,因此wait_for_events_to_appear_in_ui
會在超時后輪詢 UI 以獲取它們。 這行得通,但是每個這樣的測試都會運行幾分鍾,所以總運行時間會很長。
所以,我想先運行所有的do_thingX
動作,然后運行所有的驗證。 我考慮將預期事件添加到某個列表中,並進行最終測試來驗證所有這些事件 - 但這意味着如果do_thing1
, pytest 不會報告test1
失敗,但最終測試 - 這是次優的。
理想情況下,測試看起來像:
def test1(self, ...):
expected_events = do_thing1_that_should_generate_events(...)
# some kind of magic that works like yield?
assert wait_for_events_to_appear_in_ui(expected_events)
我怎樣才能做到這一點?
首先看一下pytest-xdist ,它用於在多個進程之間進行並行測試等。 不過,我不知道這對您的情況有多好。 請繼續閱讀以獲取更具體的解決方案。
您需要在您的問題中暗示的單個測試 function 中管理這些測試的異步運行。 也許你使用同步代碼,也許你使用異步框架; 這與此正交。 我將假設您可以自己管理它,並且無論如何它都不是特定於 pytest 的東西。
要解決 pytest 測試 function 中的一攬子通過/失敗問題,您需要子測試。 pytest-subtests允許您通過提供subtests
夾具(它還支持來自unittest
的subTest()
在單個測試 function 中編寫子測試。
這是提供的示例:
def test(subtests):
for i in range(5):
with subtests.test(msg="custom message", i=i):
assert i % 2 == 0
pytest 的 Output:
λ pytest .tmp\test-subtest.py
======================== test session starts ========================
...
collected 1 item
.tmp\test-subtest.py .F.F.. [100%]
============================= FAILURES ==============================
____________________ test [custom message] (i=1) ____________________
def test(subtests):
for i in range(5):
with subtests.test(msg='custom message', i=i):
> assert i % 2 == 0
E assert (1 % 2) == 0
.tmp\test-subtest.py:4: AssertionError
____________________ test [custom message] (i=3) ____________________
def test(subtests):
for i in range(5):
with subtests.test(msg='custom message', i=i):
> assert i % 2 == 0
E assert (3 % 2) == 0
.tmp\test-subtest.py:4: AssertionError
================ 2 failed, 1 passed in 0.07 seconds =================
乍一看,失敗/通過的數字有點違反直覺。 看起來我們有五個子測試,其中兩個應該失敗; 事實上,我們報告了兩次失敗。 但是我們只有一個通過測試,而不是三個。 那一次是test_func()
本身; 因為with
塊正在捕獲內部的斷言, test_func()
沒有失敗。 其他三個子測試沒有失敗,因此根本沒有報告——盡管我們確實看到它們出現在進度點中。
總而言之:自己管理測試,並使用pytest-subtests獲取單獨的失敗報告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.