一、pytest.mark的基本用法
pytest.mark是pytest框架提供的一個非常有用的機制,它可以用來標記單個或多個測試用例。它可以提高測試用例的可讀性,也可以讓我們快速地選擇在單次運行中執行的用例。
import pytest @pytest.mark.login def test_login(): pass @pytest.mark.register def test_register(): pass @pytest.mark.login @pytest.mark.register def test_homepage(): pass
上面的示例中,我們定義了三個測試用例。第一個測試用例用@pytest.mark.login進行了標記,第二個測試用例用@pytest.mark.register進行了標記,第三個測試用例同時用了這兩個標記。
我們可以通過pytest -m選項來運行標記過的用例。例如,pytest -m login將只運行用@pytest.mark.login標記的用例。
此外,我們還可以在fixture中使用標記來指定該fixture適用於哪些測試用例。我們可以在fixture函數定義中添加相關的裝飾器,來指明適用於哪些標記。例如:
import pytest @pytest.fixture @pytest.mark.login def login_data(): return {'username': 'testuser', 'password': '123456'} @pytest.fixture @pytest.mark.register def register_data(): return {'username': 'newuser', 'password': '654321'}
上面的示例中,我們定義了兩個fixture。第一個fixture用@pytest.mark.login標記,第二個fixture用@pytest.mark.register標記。這意味着,當我們在運行用@pytest.mark.login標記的測試用例時,pytest會自動檢測出login_data這個fixture,並將其作為參數傳遞給測試用例。
二、使用自定義標記來組織測試用例
除了使用官方提供的@pytest.mark外,我們還可以使用自定義的標記來組織測試用例。這樣可以讓我們更靈活地組織測試用例,以適應不同的測試需求。
使用自定義標記也非常簡單,我們只需要在conftest.py文件中定義fixture即可。例如:
import pytest @pytest.fixture(scope='session') def api_client(): return APIClient() @pytest.fixture def user(): return User() def pytest_configure(config): config.addinivalue_line('markers', 'api: mark test as API test') config.addinivalue_line('markers', 'ui: mark test as UI test')
上面的示例中,我們定義了兩個fixture:api_client和user。同時,在pytest_configure函數中,我們用config.addinivalue_line方法為pytest添加了兩個自定義標記:api和ui。
現在我們可以在測試用例中使用這些標記了。例如:
@pytest.mark.api def test_create_user(api_client, user): api_client.create_user(user) @pytest.mark.ui def test_login_ui(): LoginPage().login('testuser', '123456') HomePage().assert_user_name('testuser')
在上面的示例中,我們定義了兩個測試用例。第一個用@pytest.mark.api標記,這意味着這是一個API測試用例,需要使用api_client和user這兩個fixture。第二個用@pytest.mark.ui標記,這意味着這是一個UI測試用例。
三、使用參數化標記來優化測試用例
pytest還提供了一個非常方便的@pyteest.mark.parametrize標記,用於參數化測試。它可以讓我們輕鬆地運行多組測試數據,從而減少測試用例的編寫量。
使用@parametrize標記也非常簡單,我們只需要在測試用例函數上添加該標記,並將測試數據以及期望結果作為參數傳遞進去即可。例如:
import pytest @pytest.mark.parametrize(('username', 'password'), [ ('testuser', '123456'), ('newuser', '654321') ]) def test_login(username, password): result = login(username, password) assert result == 'success'
上面的示例中,我們使用了@parametrize標記,以測試兩組登錄數據。pytest會自動運行兩次測試用例,並將每組數據作為參數傳遞給測試用例函數。
四、使用skip和xfail標記來優化測試用例
有時候,我們會遇到一些測試用例暫時無法通過的情況。這時候,如果我們每次都運行這些無法通過的用例,會浪費很多時間。pytest提供了兩個非常有用的標記:skip和xfail,可以用來標記暫時無法通過的測試用例。
使用@skip標記,可以讓pytest跳過一個測試用例。例如:
import pytest @pytest.mark.skip(reason='Test case not ready yet') def test_advanced_search(): pass
上面的示例中,我們使用了@skip標記,並填寫了一個說明,以告訴pytest這個用例是有問題的,應該跳過它。
使用@xfail標記,可以讓pytest把一個無法通過的測試用例當成一個預期失敗的用例來處理。例如:
import pytest @pytest.mark.xfail(reason='Bug not yet fixed') def test_add_bug(): add_bug() assert len(get_bugs()) == 0
上面的示例中,我們使用了@xfail標記,並填寫了一個說明,以告訴pytest這個用例是無法通過的,但是是預期失敗的。
五、使用fixture的autouse參數來自動運行fixture
pytest的fixture機制非常靈活,可以讓我們在測試用例中自由地組織數據和邏輯。同時,我們還可以使用fixture的autouse參數來自動運行fixture。
使用autouse參數很簡單,只需要在fixture函數定義時添加該參數即可。例如:
import pytest @pytest.fixture(autouse=True) def setup(): login() yield logout()
上面的示例中,我們定義了一個fixture,它用於執行登錄和註銷操作。我們把autouse參數設置為True,這意味着這個fixture會在每個用例執行前後自動運行。
這樣的好處是顯而易見的。我們不用在每個用例中都手動添加登錄和註銷的邏輯,而是可以把它們封裝到fixture中,讓每個用例都自動調用這個fixture。這樣可以提高測試用例的可讀性和可維護性,也可以讓我們專註於測試用例本身,而不用過多關注登錄和註銷。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/193883.html