あなたが絶対に使用しなければならない7つのpytestプラグイン

 

TL; DR:このガイドでは、私が不可欠だと思う上位7つのpytestプラグインを紹介します。彼らは私のテスト体験を10倍良くしました。Pythonプロジェクトがどれほど複雑であっても、1つ以上のプロジェクトからいつでも恩恵を受けることができます。

pytestは、大きく成長しているPythonテストフレームワークです。そのシンプルさと柔軟性は、他のすべてのPythonテストライブラリを覆い隠します。その単純さにより、テストの冗長性とクリーンさが低下します。そして、柔軟性に関しては、あなたは最高のサービスを受けます。プラグインを介して、その機能を無数の方法で簡単に拡張できます。そして、それが私たちがここで話したいことです。

1.1。 pytest-mock

pytest-mockは、標準パッケージをフィクスチャとしてラップするpytestプラグインですunittest.mockモックオブジェクトに置き換えることで、パッチオブジェクトまたは関数を作成します。よりもクリーンで、簡単で、シンプルですunittest.mock.patchまたモジュールに存在しないスパイおよびスタブユーティリティも提供unittestます。優れた機能のリストはそれだけではありません。pytest-mockこれがあなたのためにできることです:

テストの終了後、モックを自動的に元に戻します。

コンテキストマネージャーやデコレーターの代わりに、パッチ関数にモックフィクスチャを提供します

モックコールアサーションエラーのレポートが改善されました

そのドキュメントから抜粋して適合させた次の例を考えてみましょう。最初の例は、mock.patchデコレータの使用法を示していますこれは非常に冗長であり、引数の順序は装飾されたパッチ関数の順序と逆です。続いて、と対比しpytest-mockます。

@mock.patch('os.remove')@mock.patch('os.listdir')@mock.patch('shutil.copy')def test_unix_fs(mocked_copy, mocked_listdir, mocked_remove):

UnixFS.rm('file')

os.remove.assert_called_once_with('file')

assert UnixFS.ls('dir') == expected

# …

UnixFS.cp('src', 'dst')

# …

pytest-mock

def test_unix_fs(mocker):

mocked_remove = mocker.patch('os.remove')

UnixFS.rm('file')

mocked_remove.assert_called_once_with('file')

listdir = mock.patch('os.listdir')

assert UnixFS.ls('dir') == expected

# …

UnixFS.cp('src', 'dst')

メリットは明らかではないように思われるかもしれませんがmocker、少なくとも3つの異なる方法でヘルプを使用します。

引数の順序を入れ替えてバグを導入するリスクを軽減します

テスト実行中のモックを元に戻します

これにより、pytestのフィクスチャおよびpytest.mark.parametrize機能との統合が向上ます。

2.2。 pytest-cov

コードカバレッジの測定は、いくつかの理由で重要です。これは、テストによって実行されたコードの部分を識別するのに役立ちます。コードカバレッジツールを使用すると、次のことができます。

古い未使用のコードを見つける

テストの省略を明らかにする

コードの品質基準を作成する

Pythonでカバレッジを測定するための最も人気のあるパッケージはcoverage.pyです。pytest-covを使用するpytestプラグインですcoverage.pyが、もう少し進んでいます。サブプロセスをサポートしているため、サブプロセスで実行するものをカバーできます。また、より一貫性のあるpytest動作を持ち、coverage.pyライブラリで利用可能なすべての機能を提供します

使い方は走るのと同じくらい簡単です…

pytest –cov=my-python-project tests/

…次のレポートを作成します。

============================= test session starts ==============================

platform linux — Python 3.6.3, pytest-4.0.2, py-1.7.0, pluggy-0.8.0

plugins: cov-2.6.0

collected 18 items

tests/test_app.py …………… [ 83%]

tests/test_models.py … [100%]

<span style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(238, 238, 238); font-size: 18px; font-weight: bold; –text-opacity: 1; border-radius: 0px; background: transparent;"–<——— coverage: platform linux, python 3.6.3-final-0 ———–

Name Stmts Miss Cover

<span style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(238, 238, 238); font-size: 18px; font-weight: bold; –text-opacity: 1; border-radius: 0px; background: transparent;"–<——————————————-

app.py 27 0 100%

models.py 57 0 100%

tests/__init__.py 0 0 100%

tests/test_app.py 41 0 100%

tests/test_models.py 5 0 100%

<span style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(238, 238, 238); font-size: 18px; font-weight: bold; –text-opacity: 1; border-radius: 0px; background: transparent;"–<——————————————-

TOTAL 130 0 100%

========================== 18 passed in 11.25 seconds ==========================

オプションを渡してHTMLレポートを生成することもできます<span style="box-sizing: border-box; border-width: 0px; border-style: solid; border-color: rgb(238, 238, 238); color: rgba(0,0,0,var(–text-opacity)); font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 0.9em; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); –text-opacity: 1; border-radius: 0.25rem; background: rgb(240, 239, 237);"–<cov-report=htmlこれは、コードをナビゲートして検査できる優れたカバレッジレポートを生成します。レポートには、コードのどの部分がカバーされ、どの部分が欠落しているかが表示されます。

3.3。 pytest-django

Djangoは、PythonでWebアプリを構築するための最も人気のあるフレームワークの1つです。いくつかの機能だけでなく、優れたドキュメントもあります。実際、そのドキュメントは、世の中で最も優れたものの多くによって検討されています。優れた組み込み機能の1つは、unittestモジュールの拡張です。Djangoでテストを作成する必要があるときはいつでもdjango.test.TestCase、のサブクラスであるを使用できますunittest.TestCase非常に優れているにもかかわらず、同じ疣贅に悩まされていunittestます。

ようにするにはDjangoのテストは、より慣用的で柔軟、pytest-django作成されました。pytest-djangoは、Djangoテストを簡素化し、いくつかの便利なフィクスチャを提供するプラグインです。さらに、DjangoのすべてのTestCaseアサーションを提供しますそれでは、その最高の機能のサンプルを見てみましょう。

pytestマーカー

プラグインには、などの優れたマーカーのセットが付属していpytest.mark.django_dbます。このマーカーにより、テストでデータベースを使用できます。各テストは、テストの終了時にロールバックされる個別のトランザクションで実行されます。

備品

pytest-djangodjango.test.RequestFactorydjango.test.Clientフィクスチャの両方バンドルします。前者では、ビューのテストに使用できるリクエストインスタンスを生成できます。後者はWebブラウザーとして機能し、Djangoアプリケーションをテストするときに非常に役立つことが証明されています。GETとPOSTをシミュレートし、ヘッダーとステータスコードを含む応答を検査できます。

提供されるその他のフィクスチャにはdjango_assert_num_queries、予想されるDBクエリ数を取得するためのが含まれます。admin_user、スーパーユーザーです。mailoutboxDjangoを使用して送信された電子メールが送信されたことを表明するための電子メール送信ボックス

4.4。 pytest-asyncio

asyncioは、バージョン3.4以降のPythonの標準ライブラリの一部であるパッケージです。これは非同期コードを作成するための優れた方法であり、IOバウンドアプリケーションが最高のパフォーマンスを発揮できるようにします。pytest-asyncioは、非同期プログラムのテストを容易にする優れたプラグインです。ほとんどのpytestプラグインと同様にasyncioイベントループと未使用のtcpポートをテストケースに挿入するためのフィクスチャを提供しますまた、非同期フィクスチャの作成も可能です。

もう1つの優れた機能は、非同期テストマーカーです。テストをとしてマークすることによりpytest.mark.asynciopytestevent_loopフィクスチャを使用して非同期タスクとしてテストを実行します以下の例は、非同期テストケースを示しています。

@pytest.mark.asyncioasync def test_example():

"""With pytest.mark.asyncio!"""

await asyncio.sleep(10)

5.5。 pytest-randomly

最も一般的なテストの匂いの1つは、依存テストの匂いです。これは、特定の順序に依存する一連のテストを作成することで構成されます。テスト間に相互依存関係を導入することで、テストが並行して実行されるのを防ぎ、バグを隠すこともできます。一般に、単体テストケースは動作単位をテストする必要があります。そして、それらを可能な限り分離することは良い習慣であると考えられています。

しかし、それを知っているだけでは十分ではありません。無意識のうちに依存テストを導入する可能性があります。そして、それが関係pytest-randomlyするところです。pytest-randomlyランダムシードをテストごとに繰り返し可能な数にリセットして、テストをランダムに並べ替えます。テストをランダムに順序付けることにより、潜在的に未知のテスト間依存関係のリスクを大幅に削減します。

6.6。 pytest-clarity

pytestは、テストの失敗を出力する素晴らしい仕事をします。unittest pytestの出力と比較すると、はるかに明確で非常に詳細です。また、詳細レベルを調整することで、表示できる情報の量を調整することもできます。ただし、最善の努力にもかかわらず、アサーションエラーの出力が非常に乱雑になる場合があります。

pytest-clarity、テストの失敗に対してより理解しやすい差分を有効にすることにより、pytestの出力を改善するために構築されたプラグインです。有用なヒントを提供し、統合または分割された差分を表示することで、それを強化します。テストの失敗を追跡することは、はるかに簡単で痛みがなくなります。簡単な例を次に示します。通常のpytest出力を比較してください

 

…そしてpytest-clarity統合ビューを使用して:

そして分割ビューで:

7。 pytest-bdd

ビヘイビア駆動開発(BDD)は、テスト駆動開発(TDD)の拡張として生まれたテスト方法論です。その背後にある考え方は、単純なドメイン固有のスクリプト言語を使用して、自然言語ステートメントから実行可能テストを作成することです。これらのステートメントは、ビジネスの側面とコードの間のギャップを埋めることを目的としています。純粋にAAA(Arrange、Act、Assert)パターンでテストを定義する代わりに、ユーザーストーリーの観点からテストの動作を説明します。

Gherkin形式のBDDで使用される有名なDSLの1つ。Gherkinは、ほとんどの実際のドメインでビジネスルールを記述できるように十分に正確になるように構築されています。例として、ブログに記事を公開するシナリオを考えてみましょう。次の構造を使用して説明できます。

Feature: Blog

A site where you can publish your articles.

Scenario: Publishing the article

Given I'm an author user

And I have an article

When I go to the article page

And I press the publish button

Then I should not see the error message

And the article should be published # Note: will query the database

pytest-bdd、Gherkin言語のサブセットを実装することでBDDを有効にするpytestプラグインです。たとえば、他のBDDツールに比べて多くの利点があります。

ユニットテストと機能テストの統合を可能にします

これにより、フィクスチャを介したテストセットアップの再利用が可能になります

別のランナーは必要ありません

pytestの シンプルさと柔軟性を活用しておりpytest-bdd、最高のドキュメントの1つもあります。READMEだけでも、すぐに起動して実行できるコンテンツがたくさんあります。

結論

今日は以上です。このpytestプラグインの小さなリストが、私と同じように役立つことを願っています。pytestは、そのコアに拡張性を備えた本当に楽しいテストフレームワークです。

コメントを残す

メールアドレスが公開されることはありません。

Next Post

5つの隠されたPython機能

金 11月 27 , 2020