web-dev-qa-db-ja.com

pytestで複数のアサーションを実行できますか?

私はSeleniumテストにpytestを使用していて、単一のテストで複数のアサーションを持つことが可能かどうか知りたいですか?

複数の値を比較する関数を呼び出し、一致しないすべての値についてレポートでレポートを作成します。私が抱えている問題は、「assert」または「pytest.fail」を使用すると、一致しない値が見つかるとすぐにテストが停止することです。

テストを実行し続け、一致しないすべての値についてレポートする方法はありますか?

14
ChrisG29

Jon Clementsがコメントしたように、エラーメッセージのリストを入力してから、リストが空であることをアサートし、アサーションがfalseの場合に各メッセージを表示できます。

具体的には、次のようになります。

def test_something(self):
    errors = []

    # replace assertions by conditions
    if not condition_1:
        errors.append("an error message")
    if not condition_2:
        errors.append("an other error message")

    # assert no error message has been registered, else print messages
    assert not errors, "errors occured:\n{}".format("\n".join(errors))

元のアサーションは、条件が満たされない場合にメッセージをifリストに追加するerrorsステートメントに置き換えられます。次に、errorsリストが空であることをアサートし(空のリストはFalse)、アサーションメッセージにerrorsリストの各メッセージが含まれるようにします。


nose documentation で説明されているように、テストジェネレータを作成することもできます。それを説明するpytestのドキュメントは見つかりませんでしたが、pytestがこれをnoseとまったく同じ方法で処理したことを知っています。

18
Tryph

pytest-assume is "テストごとに複数の失敗を許可するpytestプラグイン"。これを使用する方法の例を次に示します(READMEから取得)。

import pytest

@pytest.mark.parametrize(('x', 'y'), [(1, 1), (1, 0), (0, 1)])
def test_simple_assume(x, y):
    pytest.assume(x == y)
    pytest.assume(True)
    pytest.assume(False)

一部のアサーションは失敗しますが、それらはすべて評価および報告されます。

======================================== FAILURES =========================================
_________________________________ test_simple_assume[1-1] _________________________________
>    pytest.assume(False)
test_assume.py:7

y          = 1
x          = 1
----------------------------------------
Failed Assumptions:1
_________________________________ test_simple_assume[1-0] _________________________________
>    pytest.assume(x == y)
test_assume.py:5

y          = 0
x          = 1
>    pytest.assume(False)
test_assume.py:7

y          = 0
x          = 1
----------------------------------------
Failed Assumptions:2
_________________________________ test_simple_assume[0-1] _________________________________
>    pytest.assume(x == y)
test_assume.py:5

y          = 1
x          = 0
>    pytest.assume(False)
test_assume.py:7

y          = 1
x          = 0
----------------------------------------
Failed Assumptions:2
================================ 3 failed in 0.02 seconds =================================
8
akaihola

Delayed assert と呼ばれる別のアプローチを以下に示します。これは、@ Tryphが提供するものとよく似ており、より優れたスタックトレースを提供します。

PyPIの delayed-assert パッケージは、このアプローチを実装しています。 GitHubの pr4bh4sh/python-delayed-assert リポジトリも参照するか、PyPIから次を使用してインストールしてください。

pip install delayed-assert

(おそらく)python-delayed-assertと組み合わせて任意のアサーションライブラリを使用できます。アサーションというより、スタックトレースマネージャーライブラリのように考えてください。チェック this 使用例

これがエラースタックトレースの外観です。

https://github.com/pr4bh4sh/python-delayed-assert/raw/master/sample.jpg

3
pr4bh4sh

さらに別のライブラリは、pytestに関する2017 Pragmaticの本の著者、Brian Okkenから入手できます。 https://pythontesting.net/books/pytest/https://github.com/okken/pytest-check

import pytest_check as check

def test_example():
    a = 1
    b = 2
    c = [2, 4, 6]
    check.greater(a, b)
    check.less_equal(b, a)
    check.is_in(a, c, "Is 1 in the list")
    check.is_not_in(b, c, "make sure 2 isn't in list")
2
AnneTheAgile