簡體   English   中英

如何編寫分兩個階段運行的 pytest 測試,每個階段按順序運行?

[英]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夾具(它還支持來自unittestsubTest()在單個測試 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM