[英]Run a test suite with different parameters? (pytest)
一個類中有一組 UI 測試:
類TestMainPage(對象):登錄='登錄'密碼='密碼'
def test_open_site(self, browser, url):
"""Opening browser and go to website"""
browser.go_to_site(url)
browser.check_open_auth_page()
def test_authorisation(self, browser):
"""Аuthorization on the website"""
browser.authorisation(login=self.login, password=self.password)
...
如何依次為一個測試會話運行具有不同參數的此類? 函數的參數化不合適,因為此測試將獨立執行,並且只有在此之后才會繼續進行下一個測試
我找到了這個解決方案:
my_list = [1,2,3]
@pytest.fixture(scope="session", params=my_list)
def my_params(request):
return request.param
class Test_suite:
def test_1(self, my_params):
assert 1==1
def test_2(self, my_params, ):
assert 1 == 1
def test_3(self, my_params, ):
assert 1 == 1
它交替執行,這是我需要的:
test.py::Test_suite::test_1[1]
test.py::Test_suite::test_2[1]
test.py::Test_suite::test_3[1]
test.py::Test_suite::test_1[2]
test.py::Test_suite::test_2[2]
test.py::Test_suite::test_1[3]
test.py::Test_suite::test_2[3]
test.py::Test_suite::test_3[3]
但是當添加第二個參數時,混亂開始(實際結果):
test.py::Test_suite::test_1[1] 通過
test.py::Test_suite::test_2[1-1] 通過
test.py::Test_suite::test_3[1-1] 通過
test.py::Test_suite::test_2[2-1] 通過
test.py::Test_suite::test_3[2-1] 通過
test.py::Test_suite::test_1[2] 通過
test.py::Test_suite::test_2[2-2] 通過
test.py::Test_suite::test_3[2-2] 通過
test.py::Test_suite::test_2[1-2] 通過
test.py::Test_suite::test_3[1-2] 通過
test.py::Test_suite::test_2[3-2] 通過
test.py::Test_suite::test_3[3-2] 通過
test.py::Test_suite::test_2[3-1] 通過
test.py::Test_suite::test_3[3-1] 通過
test.py::Test_suite::test_1[3] 通過
test.py::Test_suite::test_2[3-3] 通過
...
我還需要按順序得出結論(預期結果):
test.py::Test_suite::test_1[1] 通過
test.py::Test_suite::test_2[1-1] 通過
test.py::Test_suite::test_3[1-1] 通過
test.py::Test_suite::test_2[1-2] 通過
test.py::Test_suite::test_3[1-2] 通過
test.py::Test_suite::test_2[1-3] 通過
test.py::Test_suite::test_3[1-3] 通過
test.py::Test_suite::test_2[1-4] 通過
test.py::Test_suite::test_3[1-4] 通過
test.py::Test_suite::test_2[1-5] 通過
test.py::Test_suite::test_3[1-5] 通過
test.py::Test_suite::test_1[2] 通過
test.py::Test_suite::test_2[2-1] 通過
test.py::Test_suite::test_3[2-1] 通過
並進一步。 如何實施?
使用帶有兩個變量的腳本:
my_list = [1,2,3]
my_list_two = [1,2,3,4,5]
@pytest.fixture(scope="session", params=my_list)
def my_params(request):
return request.param
@pytest.fixture(scope="session", params=my_list_two)
def my_params_two(request):
return request.param
class Test_suite:
def test_1(self, my_params):
assert 1==1
def test_2(self, my_params, my_params_two):
assert 1 == 1
def test_3(self, my_params, my_params_two):
assert 1 == 1
快速的谷歌搜索將引導您找到這張票,其中概述了一些解決方法,其中移動一個夾具的范圍(見下文)或使用一些 pytest_modify_collection 掛鈎,但您遇到的問題似乎仍然是一個懸而未決的問題
import pytest
LOGINS = ["l1", "l2", "l3"]
PASSWORDS = ["p1", "p2", "p3", "p4", "p5"]
@pytest.fixture(scope="session", params=LOGINS)
def logins(request):
return request.param
@pytest.fixture(scope="module", params=PASSWORDS)
def passwords(request):
return request.param
def test_one(logins):
pass
def test_two(logins, passwords):
pass
在這種特殊情況下,如果您將固定裝置的范圍更改為function
,您將獲得所需的結果:
import pytest
my_list = [1, 2, 3]
my_list_two = [1, 2, 3, 4, 5]
@pytest.fixture(params=my_list)
def my_params(request):
return request.param
@pytest.fixture(params=my_list_two)
def my_params_two(request):
return request.param
class TestSuite:
def test_1(self, my_params):
assert 1 == 1
def test_2(self, my_params, my_params_two):
assert 1 == 1
def test_3(self, my_params, my_params_two):
assert 1 == 1
test_suite.py::TestSuite::test_1[1] PASSED [ 3%]
test_suite.py::TestSuite::test_1[2] PASSED [ 6%]
test_suite.py::TestSuite::test_1[3] PASSED [ 9%]
test_suite.py::TestSuite::test_2[1-1] PASSED [ 12%]
test_suite.py::TestSuite::test_2[1-2] PASSED [ 15%]
test_suite.py::TestSuite::test_2[1-3] PASSED [ 18%]
test_suite.py::TestSuite::test_2[1-4] PASSED [ 21%]
test_suite.py::TestSuite::test_2[1-5] PASSED [ 24%]
test_suite.py::TestSuite::test_2[2-1] PASSED [ 27%]
test_suite.py::TestSuite::test_2[2-2] PASSED [ 30%]
test_suite.py::TestSuite::test_2[2-3] PASSED [ 33%]
test_suite.py::TestSuite::test_2[2-4] PASSED [ 36%]
test_suite.py::TestSuite::test_2[2-5] PASSED [ 39%]
test_suite.py::TestSuite::test_2[3-1] PASSED [ 42%]
test_suite.py::TestSuite::test_2[3-2] PASSED [ 45%]
test_suite.py::TestSuite::test_2[3-3] PASSED [ 48%]
test_suite.py::TestSuite::test_2[3-4] PASSED [ 51%]
test_suite.py::TestSuite::test_2[3-5] PASSED [ 54%]
test_suite.py::TestSuite::test_3[1-1] PASSED [ 57%]
test_suite.py::TestSuite::test_3[1-2] PASSED [ 60%]
test_suite.py::TestSuite::test_3[1-3] PASSED [ 63%]
test_suite.py::TestSuite::test_3[1-4] PASSED [ 66%]
test_suite.py::TestSuite::test_3[1-5] PASSED [ 69%]
test_suite.py::TestSuite::test_3[2-1] PASSED [ 72%]
test_suite.py::TestSuite::test_3[2-2] PASSED [ 75%]
test_suite.py::TestSuite::test_3[2-3] PASSED [ 78%]
test_suite.py::TestSuite::test_3[2-4] PASSED [ 81%]
test_suite.py::TestSuite::test_3[2-5] PASSED [ 84%]
test_suite.py::TestSuite::test_3[3-1] PASSED [ 87%]
test_suite.py::TestSuite::test_3[3-2] PASSED [ 90%]
test_suite.py::TestSuite::test_3[3-3] PASSED [ 93%]
test_suite.py::TestSuite::test_3[3-4] PASSED [ 96%]
test_suite.py::TestSuite::test_3[3-5] PASSED [100%]
有關如何訂購燈具的更多信息,請參閱文檔。
事實證明,這個問題目前還沒有解決。 解決此問題的唯一(非官方)方法是使用優先級參數。 此功能在 pytest-param-priority 庫pytest-param-priority中實現:
import pytest
import time
from pytest_param_priority import parameter_priority
@parameter_priority(0)
@pytest.fixture(scope="module", params=[1, 2, 3])
def number(request):
return request.param
@parameter_priority(2)
@pytest.fixture(scope="module", params=["a", "b", "c"])
def letter(request):
return request.param
@pytest.fixture(scope="module")
def my_expensive_setup_fixture(letter, number):
time.sleep(1)
@parameter_priority(1)
@pytest.fixture(scope="module", params=["red", "green", "blue"])
def color(request):
return request.param
@pytest.fixture(scope="module")
def intermediate_step(color, my_expensive_setup_fixture):
pass
def test_one(intermediate_step):
pass
def test_two(intermediate_step):
pass
管理設置測試的優先級不再是問題
我將嘗試實現一個類似的系統並測試它會產生什么。 稍后,我將為我的代碼添加一個專門的解決方案,也許它會對某人有用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.