Pytest使用概要

6147 ワード

前言
最近オーペンタイムの授業を聞いています。中の講師はpytestフレームワークを極力尊重しています。ユニティストフレームを軽蔑しています。ハハ!そしていくつかの資料を調べて、python軽蔑チェーン:pytest軽蔑>unittest軽蔑>robotframe ebookを見つけました。
pytestはpythonの第三者ユニットテストフレームで、unittestを持参するよりも簡潔で効率的で、315種類以上のプラグインをサポートします。同時にunittestフレームに対応します。これにより、unittestフレームワークがpytestフレームに移行する際にコードを書き換える必要がなくなります。次に、文章の中でpytestの簡潔で効率的な使い方を分析します。
一、据え付ける
まずpipを使ってpytestをインストールします。

pip3 install pytest
pytestがインストールされましたか?

pip3 show pytest
二、簡単に使う
1.test_を作成するsample.pyファイル、コードは以下の通りです。

#!/usr/bin/env python
# coding=utf-8
import pytest

def inc(x):
    return x + 1

def test_answer():
    assert inc(3) == 5

if __name__ =="__main__":
    pytest.main()
実行結果:
test_sample.py F[100%]
===========================================FAILURES============================================================================
グウグウグウグウグウグウグウグウグウグウグウグウグウグウグウグウグウグウtest_アンスパワー
def test_answer():
>asert inc(3)==5
Eクラスメイト4==5
E+where 4=inc(3)
test_sample.py:19:AsertionError
===========================1 failed in 0.41 s====================================================================================
上記の例からは、pytestで断言する用法は直接にastertを使い、unittestでself.astertと言い切る用法とは違いがあることが分かります。
2.まとめてみます。pytestを使ってテストを実行するには、従うべき規則があります。
  • .pyテストファイルはtest_でなければなりません。冒頭(または_でtestエンド)
  • 試験類はTestで始まる必要があり、init方法がない
  • 試験方法はtest_でなければなりません。先頭
  • アサイトを使用しなければならないと断言しました。
    三、fixture
    pytestが提供するfixtureはunittestでsetup/teardown機能を実現し、caseを実行するたびにデータを初期化することができる。異なる点は、fixtureは特定のcaseを実行する前に実行してもいいです。caseを実行する前に呼び出してもいいです。setup/teardownよりもっと使いやすいです。
    1.fixture scope作用範囲
    まずfixture関数の定義を見ます。
    
    def fixture(scope="function", params=None, autouse=False, ids=None, name=None):
        """
        :arg scope:          :function(  )、calss、module、package/session
        :arg params:            ,          fixture          。
        :arg autouse:     True, fixture func             。   False(   ),       fixture。
        :arg ids:                id  ,       id    。      id,           。
        :arg name:     fixture   。            。   fixture            ,                arg  ;                     “fixture_ <fixturename>”    ”@ pytest.fixture(name ='<fixturename>')”。
      """
    重点において、scope四組のパラメータの意味:
  • function:各方法(関数)は一回実行されます。
  • クラス:各クラスは一回実行します。クラスには複数の方法があります。最初の方法の呼び出し時のみ実行します。
  • module:一つ.pyファイルは一回実行します。一つ.pyファイルは、複数のクラスと方法を含むことができる。
  • package/session:複数のファイルは一回呼び出して、クロス・pyファイルができます。
  • 必要な関数の前に装飾器@pytest.fixture()を追加します。簡単な例を挙げます。
    
    #!/usr/bin/env python
    # coding=utf-8
    import pytest
    
    @pytest.fixture(scope='function')
    def login():
        print("  ")
    
    def test_1():
        print('    1')
    
    def test_2(login):
        print('    2')
    
    
    if __name__ =="__main__":
        pytest.main(['test_sample.py','-s'])
    実行結果:
    test_sample.py
    テストケース1
    ..。
    ログイン
    テストケース2
    ..。
    ========================2 passed in 0.07 s===============2=2 passed in=================================================================
    2.yield
    各用例の前に初期化操作を実行したばかりです。例で実行した後、データをクリアする(または元に戻す)操作が必要なら、yieldを使って実現できます。
    
    #!/usr/bin/env python
    # coding=utf-8
    import pytest
    
    @pytest.fixture(scope='function')
    def login():
        print("  ")
        yield
        print("    ")
    
    def test_1():
        print('    1')
    
    def test_2(login):
        print('    2')
    
    if __name__ =="__main__":
        pytest.main(['test_sample.py','-s'])
    実行結果:
    test_sample.py
    テストケース1
    ..。
    ログイン
    テストケース2
    ログアウト
    ========================2 passed in 0.08 s=======================================================================================
    3.conftest
    上のケースは全部同じです。pyファイルに書いてあります。もし複数の.pyファイルがlogin()メソッドを呼び出す必要があるならば、login()メソッドを外に書かなければならなくて、ここでconft.pyプロファイルを引用しました。test_xxx.pyテストファイルにはimport conftestは必要ありません。pytestは自動的に同じクラスのディレクトリのconft.pyファイルを検索します。
    conft.pyとテストファイルディレクトリの階層関係
    
    #   conftest.py,  test_sample.py     
    import pytest
    
    @pytest.fixture(scope='function')
    def login():
        print("  ")
    
    
    
    
    # test_sample.py     
    import pytest
    
    def test_1():
        print('    1')
    
    def test_2(login):
        print('    2')
    
    if __name__ =="__main__":
        pytest.main(['test_sample.py','-s'])
    実行結果:
    test_sample.py
    テストケース1
    ..。
    ログイン
    テストケース2
    ..。
    ========================2 passed in 0.01 s=============2=2 passed in===================================================================
    四、再試行の仕組み
    時には例で失敗しました。コードの問題ではないことが分かりました。環境やネットワークの不安定さと関係があるかもしれません。この時には再試験機構を導入して、外在的要素を排除します。
    1、pytest-rerunfailuresをインストールする
    
    pip3showpytest-rerunfailures
    2、やり直しの二つの方法
    1)飾り器を使う@pytest.mark.flaaky(reruns=5,reruns_delay=2)
    Reruns:最大再試行回数
    ルンガスdelay:再試行間隔時間、単位は秒です。
    
    #!/usr/bin/env python
    # coding=utf-8
    import pytest
    
    
    @pytest.mark.flaky(reruns=5, reruns_delay=2)
    def test():
        assert 0==1
    
    if __name__ =="__main__":
        pytest.main(['test_sample.py','-s'])

    Rは用例が失敗したらやり直して5回試していることを示しています。
    2)コマンドラインpytest-reruns 5-reruns-delay 2-sを使ってもいいです。パラメータは装飾器@pytest.mark.flaakyと一致します。これは多く言いません。
    ここでPytestの使用概要についての文章を紹介します。Pytestの使用内容については以前の文章を検索してください。または下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。