Korzystanie z prawników, chcę napisać funkcję testową, która zajmuje wiele urządzeń jako argumentów. Każda z urządzeń ma kilka parametrów.

Na przykład, w Test_demo.py to funkcja test_squared_is_less_than_10, która bierze urządzenia, negative_integer i positive_integer jako argumenty, a następnie sprawdza, czy kwadrat parametrów urządzeń jest mniejszy niż 10.

import pytest

@pytest.fixture(params=[-1, -2, -3])
def negative_integer(request):
    return request.param

@pytest.fixture(params=[1, 2, 3])
def positive_integer(request):
    return request.param

def test_squared_is_less_than_10(negative_integer, positive_integer):
    assert negative_integer ** 2 < 10
    assert positive_integer ** 2 < 10

Spodziewam się, że kiedy uruchomię komendę prawszczą w terminalu, należy wykonać łącznie 6 testów, tj.e. {x0}} dla positive_integer i [1, 2, 3] dla negative_integer.

Jednak w Kasztaniu wydaje się wykonywać zagnieżdżonej pętli rodzaju iteracji, aby wykonały 9 testów I.e. {x0}}.

Oto wyjście, kiedy uruchomię pytest -v -k "test_squared_is_less":

test_squared_is_less_than_10[-1-1] PASSED                                                              
test_squared_is_less_than_10[-1-2] PASSED                                                              
test_squared_is_less_than_10[-1-3] PASSED                                                              
test_squared_is_less_than_10[-2-1] PASSED                                                              
test_squared_is_less_than_10[-2-2] PASSED                                                              
test_squared_is_less_than_10[-2-3] PASSED                                                              
test_squared_is_less_than_10[-3-1] PASSED                                                              
test_squared_is_less_than_10[-3-2] PASSED                                                              
test_squared_is_less_than_10[-3-3] PASSED 

Jest to niepożądane, ponieważ chcę prowadzić tylko 6 testów zamiast 9. Z większą liczbą parametrów (powiedzmy 20), Kytest wykonuje 400 testów zamiast żądanych testów 40, co jest stratą czasu obliczeniowego.

Jak mogę poradzić sobie z tym problemem.

P.S: Chciałbym uniknąć pisania dwóch oddzielnych testów, takich jak

test_negative_squared_is_less_than_10(negative_integer) i test_positive_squared_is_less_than_10(positive_integer)

4
JafetVoltron 27 marzec 2020, 13:06

1 odpowiedź

Najlepsza odpowiedź

Możesz zastosować parametryzacji nie-kartezja za pomocą znacznika @pytest.mark.parametrize. Twój kod, refaktowany:

import pytest


neg_params = [-1, -2, -3]

@pytest.fixture(params=neg_params)
def negative_integer(request):
    return request.param


pos_params = [1, 2, 3]

@pytest.fixture(params=pos_params)
def positive_integer(request):
    return request.param


@pytest.mark.parametrize(
    "negative_integer, positive_integer",
    zip(neg_params, pos_params),
    indirect=True
)
def test_squared_is_less_than_10(negative_integer, positive_integer):
    assert negative_integer ** 2 < 10
    assert positive_integer ** 2 < 10
4
hoefling 27 marzec 2020, 10:46