如果你還想從頭學起Pytest,可以看看這個系列的文章哦!
https://www.cnblogs.com/poloyy/category/1690628.html
前言
- 為了提高復用性,我們在寫測試用例的時候,會用到不同的fixture,比如:最常見的登錄操作,大部分的用例的前置條件都是登錄
- 假設不同的用例想登錄不同的測試賬號,那么登錄fixture就不能把賬號寫死,需要通過傳參的方式來完成登錄操作
案例一:傳單個參數
import pytest @pytest.fixture() def login(request): name = request.param print(f"== 賬號是:{name} ==") return name data = ["pyy1", "polo"] ids = [f"login_test_name is:{name}" for name in data] @pytest.mark.parametrize("login", data, ids=ids, indirect=True) def test_name(login): print(f" 測試用例的登錄賬號是:{login} ")
執行結果
collecting ... collected 2 items 10fixture_request.py::test_name[login_test_name is:pyy1] == 賬號是:pyy1 == PASSED [ 50%] 測試用例的登錄賬號是:pyy1 10fixture_request.py::test_name[login_test_name is:polo] == 賬號是:polo == PASSED [100%] 測試用例的登錄賬號是:polo
知識點
- 添加 indirect=True 參數是為了把 login 當成一個函數去執行,而不是一個參數,並且將data當做參數傳入函數
- def test_name(login) ,這里的login是獲取fixture返回的值
案例二:多個參數
@pytest.fixture() def logins(request): param = request.param print(f"賬號是:{param['username']},密碼是:{param['pwd']}") return param data = [ {"username": "name1", "pwd": "pwd1"}, {"username": "name2", "pwd": "pwd2"}, ] @pytest.mark.parametrize("logins", data, indirect=True) def test_name_pwd(logins): print(f"賬號是:{logins['username']},密碼是:{logins['pwd']}")
執行結果
10fixture_request.py::test_name_pwd[logins0] 賬號是:name1,密碼是:pwd1 PASSED [ 50%]賬號是:name1,密碼是:pwd1 10fixture_request.py::test_name_pwd[logins1] 賬號是:name2,密碼是:pwd2 PASSED [100%]賬號是:name2,密碼是:pwd2
知識點
如果需要傳多個參數,需要通過字典去傳
案例三:多個fixture(只加一個裝飾器)
這種更常用
# 多個fixture @pytest.fixture(scope="module") def input_user(request): user = request.param print("登錄賬戶:%s" % user) return user @pytest.fixture(scope="module") def input_psw(request): psw = request.param print("登錄密碼:%s" % psw) return psw data = [ ("name1", "pwd1"), ("name2", "pwd2") ] @pytest.mark.parametrize("input_user,input_psw", data, indirect=True) def test_more_fixture(input_user, input_psw): print("fixture返回的內容:", input_user, input_psw)
執行結果
10fixture_request.py::test_more_fixture[name1-pwd1] 登錄賬戶:name1 登錄密碼:pwd1 PASSED [ 50%]fixture返回的內容: name1 pwd1 10fixture_request.py::test_more_fixture[name2-pwd2] 登錄賬戶:name2 登錄密碼:pwd2 PASSED [100%]fixture返回的內容: name2 pwd2
案例四:多個fixture(疊加裝飾器)
# 多個fixture @pytest.fixture(scope="function") def input_user(request): user = request.param print("登錄賬戶:%s" % user) return user @pytest.fixture(scope="function") def input_psw(request): psw = request.param print("登錄密碼:%s" % psw) return psw name = ["name1", "name2"] pwd = ["pwd1", "pwd2"] @pytest.mark.parametrize("input_user", name, indirect=True) @pytest.mark.parametrize("input_psw", pwd, indirect=True) def test_more_fixture(input_user, input_psw): print("fixture返回的內容:", input_user, input_psw)
執行結果
10fixture_request.py::test_more_fixture[pwd1-name1] 登錄賬戶:name1 登錄密碼:pwd1 PASSED [ 25%]fixture返回的內容: name1 pwd1 10fixture_request.py::test_more_fixture[pwd1-name2] 登錄賬戶:name2 登錄密碼:pwd1 PASSED [ 50%]fixture返回的內容: name2 pwd1 10fixture_request.py::test_more_fixture[pwd2-name1] 登錄賬戶:name1 登錄密碼:pwd2 PASSED [ 75%]fixture返回的內容: name1 pwd2 10fixture_request.py::test_more_fixture[pwd2-name2] 登錄賬戶:name2 登錄密碼:pwd2 PASSED [100%]fixture返回的內容: name2 pwd2
測試用例數=2*2=4條