なぜPytestは、フィクスチャのパラメータを介して、ネストされたループを実行しません

JafetVoltron:

Pytestを使用して、私は、引数として、複数の固定具にかかるテスト関数を書きたいです。備品のそれぞれは、いくつかのパラメータがあります。

例えば、test_demo.pyで機能であるtest_squared_is_less_than_10固定具を取り、negative_integerそしてpositive_integer引数として、次にチェックフィクスチャパラメータの二乗は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

私はつまり、私はターミナルでpytestコマンドを実行すると、6つのテストの合計が実行されなければならないことを期待する[-1, -2, -3]ためにpositive_integer[1, 2, 3]のためにnegative_integer

9つのテストがすなわち実行されるように、しかし、pytestは、反復のネストされたループの種類を実行するには思えます[(-1, 1), (-1, 2), (-1, 3), (-2, 1), (-2, 2), (-2, 3), (-3, 1), (-3, 2), (-3, 3)]

ここで私が実行して出力されます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 

私は計算時間の無駄であるのparamsの大きな数(20と言う)、pytestは、400回のテストの代わりに、所望の40回のテストを実行しますと代わりに9の6回の試験を実施したいので、これは、望ましくありません。

どのように私はこの問題に対処することができます。

PS:私は、例えば2つの別々のテストを、書き込まないようしたいと思います

test_negative_squared_is_less_than_10(negative_integer) そして test_positive_squared_is_less_than_10(positive_integer)

アップを実行します。

あなたは経由して非デカルトパラメータ化を適用することができ@pytest.mark.parametrize、マーカー。あなたのコード、リファクタリング:

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=364784&siteId=1