web-dev-qa-db-ja.com

1つのPython pytestメソッド内で複数のアサーションを処理できますか?

pytestを使用してテストを作成していますが、次の問題が発生しました。変数をテストするテストがあり、重い計算を実行した後、別のテストを実行したいと思います。

問題は、最初のassertが失敗した場合、テスト全体が失敗し、pystestが2番目のテストを実行しないことです。コード:

class TestSomething:
    def tests_method(self, some_variables):
        # Some actions that take a lot of time!
        assert some_var == 1
        # Some actions that take a lot of time!
        assert some_var == 2

このテスト方法は2つの方法に分けることができることは承知していますが、ここでのパフォーマンスの問題は非常に重要です。

1つのメソッドで2つのアサーションを実行する方法はありますか?

8
Yuval Pruss

通常、最初のアサーションでテストを失敗させます。ただし、本当に複数の比較を行いたい場合は、タプルを比較してください。簡単な例を次に示します。

def foo(x):
    return x + 1


def bar(y):
    return y - 1


def test_foo():
    # some expensive calculation                                                                                                                                    
    a = foo(10)

    # another expensive calculation                                                                                                                                 
    b = bar(10)

    assert (a, b) == (10, 9)

Pytestで実行すると、両方の値が表示されます。

$ pytest scratch.py
============================= test session starts =============================
platform linux2 -- Python 2.7.12, pytest-3.0.7, py-1.4.33, pluggy-0.4.0
rootdir: /home/don/workspace/scratch, inifile:
collected 1 items

scratch.py F

================================== FAILURES ===================================
__________________________________ test_foo ___________________________________

def test_foo():
# some expensive calculation
a = foo(10)

# another expensive calculation
b = bar(10)

>       assert (a, b) == (10, 9)
E       assert (11, 9) == (10, 9)
E         At index 0 diff: 11 != 10
E         Use -v to get the full diff

scratch.py:16: AssertionError
========================== 1 failed in 0.02 seconds ===========================

また、andを使用して比較を組み合わせようとしましたが、 短絡 のために機能しません。たとえば、私はこのアサーションを試しました:

assert a == 10 and b == 9

Pytestはこの失敗を報告しました:

>       assert a == 10 and b == 9
E       assert (11 == 10)

--showlocalsオプションを使用しない限り、bの値は報告されません。

6
Don Kirkby