私はSeleniumテストにpytestを使用していて、単一のテストで複数のアサーションを持つことが可能かどうか知りたいですか?
複数の値を比較する関数を呼び出し、一致しないすべての値についてレポートでレポートを作成します。私が抱えている問題は、「assert」または「pytest.fail」を使用すると、一致しない値が見つかるとすぐにテストが停止することです。
テストを実行し続け、一致しないすべての値についてレポートする方法はありますか?
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とまったく同じ方法で処理したことを知っています。
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 =================================
Delayed assert と呼ばれる別のアプローチを以下に示します。これは、@ Tryphが提供するものとよく似ており、より優れたスタックトレースを提供します。
PyPIの delayed-assert パッケージは、このアプローチを実装しています。 GitHubの pr4bh4sh/python-delayed-assert リポジトリも参照するか、PyPIから次を使用してインストールしてください。
pip install delayed-assert
(おそらく)python-delayed-assertと組み合わせて任意のアサーションライブラリを使用できます。アサーションというより、スタックトレースマネージャーライブラリのように考えてください。チェック this 使用例
これがエラースタックトレースの外観です。
さらに別のライブラリは、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")