バックグラウンド
アサーションの判断にpytestを使用する場合、ユースケースの正確さのために、次のような複数の側面がアサーションされることがよくあります。
アサーション1:応答のHTTPステータスをアサーションします
アサーション2:応答によって返されたコード値をアサーションします
アサーション3:応答によって返されたjsonのデータフィールドが期待を満たしているかどうかをアサーションします。
あなたはネイティブのPythonの使用している場合はアサートを、あなたはすべてのアサーションが失敗するような状況が発生します。たとえば、アサーション1の結果が失敗した場合、アサーション2もアサーション3も実行されません。
アサーション2とアサーション3が引き続き実行されることを期待して、より多くのアサーション結果を取得して、インターフェイスが間違っている場所を特定し、問題をより適切に特定できるようにします。現時点では、この記事の主人公が表示されます:pytest-assume plugin 。
前書き
pytestテストケースで複数の失敗したアサーションを実行できるようにするプラグイン(つまり、上記のアサーション1、アサーション2、およびアサーション3がすべて失敗した場合、3つのアサーションすべてを実行できます)。
プロジェクト:https://github.com/astraw38/pytest-assume
説明:
プラグインはpytest-expectから派生していますが、いくつかの小さな変更が加えられています。
1. showlocalsをサポートします(つまり、実行中にローカル変数を表示するためのpytestコマンドラインの「-l」パラメーター)。
2.fixtrueデコレータを指定せずにグローバルに使用できます。(つまり、任意のtest_xxx関数で使用できます)。
3.アサーション出力にいくつかのフォーマットの美化が行われました。
インストール
#Pythonのバージョンに応じて、pip3またはPIPを選択します。sudopip3 (PIP)install git + HTTPS://github.com/astraw38/pytest-assume.git# またはsudo pip3(pip)install pytest- assume
例
1.ネイティブassertとpytest-assumeを比較するテストケース
#!/ usr / bin / env python3 #!coding:utf-8 import pytest @ pytest.mark.parametrize(( 'x'、 'y')、[(1、1)、(1、0)、(0 、1)]) DEF test_simple_assume(X、Y): アサートのx == yの#If文。このアサーションが失敗し、その後のアサーションのいずれも実行されないであろう 真のアサート アサート偽を 、(( 'X' pytest.mark.parametrize @ 'y')、[(1、1)、(1、0)、(0、1)]) def test_pytest_assume(x、y): pytest.assume(x == y)#このアサーションが失敗しても、 pytest .assumeは引き続き実行されます(True) pytest.assume(False)
入る:
================================================== ===================================テストセッションが開始されます============ ================================================== =======================
プラットフォームダーウィン-Python3.8.2、pytest-6.2.1、py-1.10.0、pluggy-0.13.1
rootdir :/ Users / xxx / Desktop / pytest
プラグイン:仮定-2.4.2 、注文-0.66つのアイテムを収集しました (ここで実行される6つのユースケース)
test_demo.py FFF [100%]
================================================== ========================================失敗========= ================================================== ================================
___________________________________________________________________________________ test_simple_assume [1-1] ___________________________________________________________________________________x = 1、y = 1
@ pytest.mark.parametrize(( 'x'、 'y')、[(1、1)、(1、0)、(0、1)])
def test_simple_assume(x、y):
assert x == y
Trueをアサート
> Falseをアサート(最初の2つのアサーションは成功し、3番目のアサーションは失敗しました)
EはFalseをアサートしますtest_demo.py:9:AssertionError
___________________________________________________________________________________ test_simple_assume [1-0] ___________________________________________________________________________________x = 1、y = 0
@ pytest.mark.parametrize(( 'x'、 'y')、[(1、1)、(1、0)、(0、1)])
def test_simple_assume(x、y):
> assert x == y(最初のアサーションは失敗し、後続のアサーションは実行されません)
E assert 1 == 0test_demo.py:7:AssertionError
___________________________________________________________________________________ test_simple_assume [0-1] ___________________________________________________________________________________x = 0、y = 1
@ pytest.mark.parametrize(( 'x'、 'y')、[(1、1)、(1、0)、(0、1)])
def test_simple_assume(x、y):
> assert x == y(最初のアサーションが失敗し、後続のアサーションは実行されません)
E assert 0 == 1test_demo.py:7:AssertionError
___________________________________________________________________________________ test_pytest_assume [1-1] ___________________________________________________________________________________tp = <class'pytest_assume.plugin.FailedAssumption '>、value = None、tb = None
def reraise(tp、value、tb = None):
try:
if value is None:
value = tp()
if value .__ traceback__ is not tb:
> raise value.with_traceback(tb)
E pytest_assume.plugin.FailedAssumption:
E 1 Failed仮定:
E
E test_demo.py:15:AssumptionFailure
E >> pytest.assume(False)
E AssertionError:assert False(最初の2つのアサーションは成功し、3番目のアサーションは失敗します)/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/site-packages/six.py:702:FailedAssumption
-------------- -------------------------------------------------- ------------------キャプチャされたstdoutの分解----------------------------- -------------------------------------------------- ----
F
___________________________________________________________________________________ test_pytest_assume [1-0] ___________________________________________________________________________________tp = <class'pytest_assume.plugin.FailedAssumption '>、value = None、tb = None
def reraise(tp、value、tb = None):
try:
if value is None:
value = tp()
if value .__ traceback__ is not tb:
> raise value.with_traceback(tb)
E pytest_assume.plugin.FailedAssumption:
E 2 Failed前提条件:
E
E test_demo.py:13:AssumptionFailure
E >> pytest.assume(x == y)は(第一个断言失败、后续继续执行)
EてAssertionError:偽アサート
E
Eのtest_demo.py:15:AssumptionFailure
E> > pytest.assume(False)
E AssertionError:Falseをアサート/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/site-packages/six.py:702:FailedAssumption
-------------- -------------------------------------------------- ------------------キャプチャされたstdoutの分解----------------------------- -------------------------------------------------- ----
F
___________________________________________________________________________________ test_pytest_assume [0-1] ___________________________________________________________________________________tp = <class'pytest_assume.plugin.FailedAssumption '>、value = None、tb = None
def reraise(tp、value、tb = None):
try:
if value is None:
value = tp()
if value .__ traceback__ is not tb:
> raise value.with_traceback(tb)
E pytest_assume.plugin.FailedAssumption:
E 2 Failed前提条件:
E
E test_demo.py:13:AssumptionFailure
E >> pytest.assume(x == y)は(第一个断言失败、后续继续执行)
EてAssertionError:偽アサート
E
Eのtest_demo.py:15:AssumptionFailure
E> > pytest.assume(False)
E AssertionError:Falseをアサート/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/site-packages/six.py:702:FailedAssumption
-------------- -------------------------------------------------- ------------------キャプチャされたstdoutの分解----------------------------- -------------------------------------------------- ----
F
============================================= ======================================短いテストの概要情報======== ================================================== =========================
FAILED test_demo.py :: test_simple_assume [1-1]-アサートFalseFAILED test_demo.py :: test_simple_assume [
1- 0]-アサート1 == 0
失敗test_demo.py :: test_simple_assume [0-1]-アサート0 == 1
FAILED test_demo.py :: test_pytest_assume [1-1] --pytest_assume.plugin.FailedAssumption:
FAILED test_demo.py :: test_pytest_assume [1-0] --pytest_assume.plugin.FailedAssumption:
FAILED test_demo.py :: test_pytest_assume [0-1 --pytest_assume.plugin.FailedAssumption:
=========================================== =========================================== 0.19秒で6回失敗== ================================================== ==================================
ここで、2つの違いを確認できます。実装の違いは、次のとおりです。
アサーションタイプ | 1,1 | 1,0 | 0、1 | 結論として |
主張する | アサーション3が失敗しました | アサーション1は失敗し、アサーション2とアサーション3は実行されません | アサーション1は失敗し、アサーション2とアサーション3は実行されません | アサーションが失敗すると、アサーションは停止します |
pytest。 | アサーション3が失敗しました | アサーション1は失敗し、アサーション2とアサーション3は実行を継続します | アサーション1は失敗し、アサーション2とアサーション3は実行を継続します | pytest.assumeは、アサーションの結果に関係なく実行されます |
2.pytestを使用します-コンテキストマネージャーを介して仮定します
#!/ usr / bin / env python3#!coding:utf-8
pytest からpytestをインポートする importassume @ pytest.mark.parametrize(( 'x'、 'y')、[(1、1)、(1、0)、(0、1)]) def test_simple_assume(x、y) : #コンテキストマネージャーを使用する利点は、例外をキャッチするために表示する必要がないことです。簡潔で効果的なこの書き込み方法を使用することをお勧めします。 仮定の場合:assert x == y 仮定の場合:trueの 仮定の場合:Falseのアサート
注意すべき主な点は、コンテキストマネージャーに複数のアサーションが含まれている場合、最初のアサーションのみが実行されることです。
#!/ usr / bin / env python3 #!coding:utf-8 import pytest from pytest importassume @ pytest.mark.parametrize(( 'x'、 'y')、[(1、1)、(1、0 )、(0、1)]) def test_simple_assume(x、y):# コンテキストマネージャーを使用する利点は、例外をキャッチするために表示する必要がないことです。この書き込み方法を使用することをお勧めします。簡潔で効果的です。 仮定付き:# 最初のアサーションのみが実行されます! アサートx == y アサートTrue アサートFalse
上記はpytest-assumeプラグインの詳細な説明です。コンテンツの一部はgithubプロジェクトの例を参照しています。ご不明な点がございましたら、メッセージを残してください。
ブロガー:お金を稼ぐためのテスト
モットー:テストと自動化に焦点を当て、R&D効率の向上に努めます。テストと勤勉さを通じて、元の蓄積を完了し、読書と財務管理から財務の自由までを行います。
csdn:https://blog.csdn.net/ccgshigao
ブログパーク:https://www.cnblogs.com/qa-freeroad/
51cto:https://blog.51cto.com/14900374