簡體   English   中英

運行具有不同參數的測試套件? (pytest)

[英]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.

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