pytest-プラグインを想定(ネットワーク全体で最も詳細な説明):複数のアサーションの実行

バックグラウンド

アサーションの判断に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.6

6つのアイテムを収集しました (ここで実行される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 == 0

test_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 == 1 

test_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


おすすめ

転載: blog.51cto.com/14900374/2605161