2017-09-16 12 views
1

私はいくつかのpytestテストファイルを書いています。これらのファイルは、サンプルまたはステップテーブルを持たないフィーチャーファイルに添付されています。私が理解していないのは、私のインライン変数(USER1とUSER2)を私のGiven、WhenとThenのステップ(以下の単純な例)の中の文字列である 'when'ステップが実行されるように使用する方法ですそれはジョンを使用して、次に 'それは'ステップが使用されるそれはピーターを使用します。Pytestステップ引数でインライン変数を使用するにはどうすればよいですか?

私はこれらのドキュメントhttp://pytest-bdd.readthedocs.io/en/latest/#step-argumentsとそのパーサーを使用するという言葉を読んできましたか?たぶん私はドキュメントを誤解しているかもしれませんが、私は以下のようなことをどうやってできるのかは本当にはっきりしません。たぶんユーザーは辞書に入れる必要がありますか? {'user1': 'John'、 'user2': 'Peter'}。フィーチャー・ファイルのサンプル・テーブルまたはステップ・テーブルを使用することはここではすばらしいことですが、この場合はバックグラウンドで(pytestファイル内でのみ)行う方法を知る必要があります。事前に

おかげで、すべての

USER1 = 'John' 
USER2 = 'Peter' 

@scenario('User logs in') 
def test_user_logs_in(): 
    """User logs in to website.""" 
    pass 

@given('I go to a website') 
def I_go_to_a_website(): 
    Do something 

@When('{user} logs in') 
def user_logs_in(user): 
    Do something with user1 the first time this step is used 
    Do something with user2 the second time this step is used. 

@then('I should see the account page') 
def should_see_account_page(): 
    Do something 

答えて

0

何を言っていることは、あなたがUSER1で一度あなたの全てのテストを実行したいです、そして再びUSER2で、その後、あなたが探しているものparametrized testsある場合。

基本的には、テストを一度定義します。次に、タプルの変数のグループをオプションのIDセットで定義します。そして、pytestはパラメータのセットごとにそのテストを1回実行します。

基本的な例を考えてみましょう。

addition(a, b): 
    return a + b 

def test_addition(a, b, expected): 
    assert addition(a, b) == expected 

よりもむしろのように、異なるパラメータで何度もテストを定義します。あなたはpytest.mark.parametrizeデコレータ使用することができます

def test_addition(): 
    a = 2 
    b = 2 
    expected = 4 
    assert addition(a, b) == expected 

def test_addition(): 
    a = -2 
    b = -2 
    expected = -4 
    assert addition(a, b) == expected 

:あなたがこのテストを実行すると

import pytest 

@pytest.mark.parametrize('a, b, expected', ((2, 2, 4), (-2, -2, -4))) 
def test_addition(a, b, expected): 
    assert addition(a, b) == expected 

を、あなたは」次の出力が表示されます。

$ pytest -v test_addition.py 
====================================== test session starts ======================================= 
platform linux -- Python 3.6.2, pytest-3.2.2, py-1.4.34, pluggy-0.4.0 -- /home/stackoverflow 
cachedir: .cache 
rootdir: /home/stackoverflow, inifile: 
collected 2 items                     

test_addition.py::test_addition[2-2-4] PASSED 
test_addition.py::test_addition[-2--2--4] PASSED 

==================================== 2 passed in 0.01 seconds ==================================== 

だから、あなたの質問に戻って、あなたはこのような何かをしたい:あなたのリストが長い場合は

import pytest 

USER1 = 'John' 
USER2 = 'Peter' 

@pytest.mark.parametrize('user', ((USER1), (USER2))) 
def test_something(user): 
    # Do something with ``user`` 
    # Test runs twice - once with USER1, once with USER2 
    pass 

fixtureを使う方が良いでしょう。

users_to_test = { 
    'params': ((USER1), (USER2)), 
    'ids': ['test first user', 'test second user'] 
} 

@pytest.fixture(**users_to_test, scope='function') 
def params_for_test_something(request): 
    return request.param 

def test_something(params_for_test_something): 
    user = params_for_test_something[0] 
    pass 

私はこれがはるかに扱いやすい方法だと思います。また、フィクスチャをパラメータ設定することもできますので、魔法は本当に深くなります。

関連する問題