Pythonでのテストの紹介。 パート3

友人たち、私たちはあなたにとって素晴らしいニュースを持っています。 第一に、通りで太陽がついに輝いています。これは、春がその権利を完全に引き継ぎ始めていることを意味します。 2番目のニュースはより専門的です。3月20日、最初のレッスンはコース「Python Developer」の新しいスレッドから始まります。これに関連して、記事「Introduction to Testing in Python」の最後の部分を公開します



複数の環境でのテスト



これまで、特定の依存関係セットを持つ仮想環境を使用して、Pythonの1つのバージョンをテストしてきました。 しかし、Pythonのいくつかのバージョンまたはパッケージのいくつかのバージョンでアプリケーションをテストする必要が常にあるかもしれません。 Toxは、複数の環境でのテストを自動化するアプリケーションです。







Toxのインストール



Toxはpip経由でインストールするパッケージとしてP​​yPlで利用可能です:



$ pip install tox
      
      





インストール後、Toxの構成に進むことができます。



依存関係に合わせてToxをカスタマイズする



Toxは、プロジェクトディレクトリの構成ファイルを使用して構成されます。 次のものが含まれます。





Toxを構成するための構文を学ぶ代わりに、クイックスタートアプリケーションを起動することから始めることができます。



 $ tox-quickstart
      
      





Tox構成ツールは質問をして、 tox.ini



次のようなファイルを作成します。



 [tox] envlist = py27, py36 [testenv] deps = commands = python -m unittest discover
      
      





Toxを起動する前に、パッケージをインストールする手順を含むsetup.py



がアプリケーションフォルダーにあることを確認してください。 そうでない場合は、 setup.py



作成ガイドを使用してください



また、プロジェクトがPyPlでの配布を目的としていない場合、 tox



ヘッダーの下のtox



ファイルに次の行を追加することで、この要件をスキップできます。



 [tox] envlist = py27, py36 skipsdist=True
      
      





setup.pyを作成せず、アプリケーションがPyPlに依存している場合、 testenv



セクションでそれらを明確にする必要があります。 たとえば、Djangoには次のものが必要です。



 [testenv] deps = django
      
      





この手順の最後に、テストを実行できます。



これでToxを実行でき、Python 2.7用とPython 3.6用の2つの仮想環境が作成されます。 Toxディレクトリは.tox/



と呼ばれます。 その中で、Toxは各仮想環境に対して-m unittest discover



を実行します。



このプロセスは、コマンドラインからToxを呼び出すことで開始できます。



 $ tox
      
      





Toxは、各環境のテスト結果を生成します。 Toxを初めて起動すると、仮想環境の作成に時間がかかりますが、Toxを2回目に実行すると、すべてがはるかに高速に動作します。

Toxの結果は非常に単純です。 バージョンごとに環境が作成され、依存関係がインストールされてから、テストコマンドが実行されます。



覚えておく価値のある追加のコマンドラインオプションがいくつかあります。

Python 3.6などの単一の環境を実行します。



 $ tox -e py36
      
      





依存関係の変更またはサイドパッケージが破損した場合の仮想環境の再作成:



 $ tox -r
      
      





あまり詳細ではない結果でToxを実行する:



 $ tox -q
      
      





より詳細な出力でToxを実行する:



 $ tox -v
      
      





Toxの詳細については、 Toxドキュメントサイトをご覧ください。



テスト自動化



これまで、コマンドを実行してテストを手動で実行しました。 ただし、変更が行われたときにテストを自動的に実行し、バージョン管理システム(Gitなど)を使用してリポジトリにコミットするためのツールがあります。 テスト自動化ツールは、多くの場合、CI / CDツールと呼ばれ、「継続的統合/継続的展開」を意味します。 テストを実行し、アプリケーションをコンパイルして公開し、さらに運用環境に展開することもできます。

Travis CIは、利用可能な多くのCIサービスの1つです。



Travis CIはPythonとうまく機能し、クラウドで作成されたすべてのテストの実行を自動化できるようになりました! Travis CIは、GitHubおよびGitLabのオープンソースプロジェクトでは無料で、プライベートプロジェクトでは有料で利用できます。



開始するには、ログインして、GitHubまたはGitLabの資格情報を使用して認証します。 次に、次の内容の.travis.yml



というファイルを作成します。



 language: python python: - "2.7" - "3.7" install: - pip install -r requirements.txt script: - python -m unittest discover
      
      





この構成により、Travis CIに次の指示が与えられます。





このファイルをコミットしてプッシュすると、Travis CIは、リモートGitリポジトリにプッシュするたびにこれらのコマンドを実行します。 結果はウェブサイトで見ることができます。



次は何ですか



これで、テストの作成、プロジェクトへの追加、実行、さらには自動実行の方法がわかったので、テストライブラリの成長に応じて役立つ高度なメソッドに慣れることができます。



リンターアプリケーションの概要



ToxとTravis CIにはテストチームがセットアップされています。 このチュートリアルでは、python -m unittest discoverをテストチームとして使用しました。



これらのツールで1つ以上のコマンドを提供できます。これにより、新しいツールを追加して、アプリケーションの品質を向上させることができます。



そのようなアプリケーションの1つがリンターです。 彼はあなたのコードを見てコメントを残します。 したがって、エラーに関するアドバイスを提供し、末尾のスペースを修正し、潜在的なバグを予測することさえできます。



リンターの詳細については、Python Code Quality Tutorialをご覧ください



flake8によるパッシブリンティング



flake8は人気のあるリンターで、 PEP 8仕様に従ってコードのスタイルに関するコメントを残します。



pipを使用してflake8



をインストールできます。



 $ pip install flake8
      
      





次に、単一のファイル、フォルダー、またはテンプレートに対してflake8



を実行できます。



 $ flake8 test.py test.py:6:1: E302 expected 2 blank lines, found 1 test.py:23:1: E305 expected 2 blank lines after class or function definition, found 1 test.py:24:20: W292 no newline at end of file
      
      





flake8



によってflake8



されたコード内のエラーと警告のリストが表示されます。

flake8



は、コマンドラインまたはプロジェクト構成ファイルで構成できます。 上記のE305など、一部のルールを無視する場合は、構成でこれを設定できます。 flake8



は、プロジェクトフォルダー内のsetup.cfg



ファイルまたはflake8



ファイルを確認します。 Toxを使用する場合は、 flake8



構成flake8



tox.ini



追加できます。



この例では、 .gitおよび__pycache__ディレクトリとE305ルールを無視します。 さらに、文字列の最大長が80文字から90文字に増加します。1行あたり79文字という標準の制限は、長いメソッド名、テスト値を含む文字列リテラル、他の長いデータ。 通常、テストでは、文字列の長さを120文字に増やします。



 [flake8] ignore = E305 exclude = .git,__pycache__ max-line-length = 90
      
      





または、コマンドラインで次のオプションを提供できます。



 $ flake8 --ignore E305 --exclude .git,__pycache__ --max-line-length=90
      
      





設定の完全なリストは、 ドキュメントサイトにあります。

これで、CI設定にflake8



を追加できます。 Travis CIの場合、次のようになります。



 matrix: include: - python: "2.7" script: "flake8"
      
      





Travisは.flake8



の構成を読み取り、lintエラーがある場合はビルドを完了できません。 必ずflake8



依存関係をrequirements.txt



追加してください。



コードフォーマッターを使用した積極的なリンティング



flake8



は編集のみを推奨するパッシブリンターであり、コードに自分で入力する必要があります。 コードフォーマッタは、より積極的なアプローチです。 スタイルとレイアウトに従ってコードを自動的に変更します。



black



は非常に容赦ないフォーマッターです。 設定はなく、非常に細心の注意を払っています。 テストパイプラインに挿入するのに最適なツールです。



注意:黒にはPythonバージョン3.6以降が必要です。


pipを使用してblack



をインストールできます:



 $ pip install black
      
      





次に、コマンドラインから開始するには、フォーマットするファイルまたはディレクトリを指定します。



 $ black test.py
      
      





テストコードをクリーンに保つ



テストを作成するときは、通常のアプリケーションを作成するときよりもコードフラグメントを頻繁にコピーアンドペーストすることに気付くかもしれません。 ときどき、テストは非常に単調になりますが、これはコードをずさんで断片化した形で落とす理由ではありません。



時間が経つにつれて、テストコードに技術的な負債が蓄積し、構造によりアプリケーションコードの大幅な変更に必要なテストを変更することが非常に困難になることが判明します。



テストを作成するときは、DRY原則に従ってください:自分自身を繰り返さないでください。



テストフィクスチャと関数は、保守が容易なコードを記述するための優れた方法です。 また、読みやすさを忘れないでください。 flake8



などのflake8



ツールをテストコードに展開することを検討してください。



 $ flake8 --max-line-length=120 tests/
      
      





編集間のパフォーマンス低下を特定するためのテスト



Pythonでコードをベンチマークするには多くの方法があります。 標準ライブラリには、機能を数回スケジュールし、配布を表示するtimeitモジュールがあります。 この例では、test()が100回実行され、次にprint()を使用して出力が行われます。



 def test(): # ... your code if __name__ == '__main__': import timeit print(timeit.timeit("test()", setup="from __main__ import test", number=100))
      
      





テストランナーとしてpytestを使用する場合は、pytest-benchmarkプラグインを確認してください。 ベンチマークと呼ばれるpytestフィクスチャを提供します。 呼び出されたオブジェクトはすべてベンチマーク()に渡すことができ、呼び出されたpytestの結果の時間を解析します。



pipを使用してPyPlからpytest-benchmarkをインストールできます。



 $ pip install pytest-benchmark
      
      





次に、フィクスチャを使用して、呼び出されたオブジェクトを実行に渡すテストを追加できます。



 def test_my_function(benchmark): result = benchmark(test)
      
      





pytestを実行すると、ベンチマーク結果が得られます。







詳細については、 ドキュメントサイトをご覧ください。



セキュリティエラーを特定するためのテスト



アプリケーションで実行する必要があるもう1つのテストは、一般的なエラーとセキュリティの脆弱性をチェックすることです。



pipを使用してPyPlからBanditをインストールします。



 $ pip install bandit
      
      





次に、 -r



フラグを使用してアプリケーションモジュールの名前を渡し、簡単な情報を取得できます。



 $ bandit -r my_sum [main] INFO profile include tests: None [main] INFO profile exclude tests: None [main] INFO cli include tests: None [main] INFO cli exclude tests: None [main] INFO running on Python 3.5.2 Run started:2018-10-08 00:35:02.669550 Test results: No issues identified. Code scanned: Total lines of code: 5 Total lines skipped (#nosec): 0 Run metrics: Total issues (by severity): Undefined: 0.0 Low: 0.0 Medium: 0.0 High: 0.0 Total issues (by confidence): Undefined: 0.0 Low: 0.0 Medium: 0.0 High: 0.0 Files skipped (0):
      
      





flake8



flake8



に、 bandit



フラグbandit



を設定できます。それらの一部を無視する場合は、パラメーターを使用してsetup.cfg



ファイルに次のフラグメントを追加できます。



 [bandit] exclude: /test tests: B101,B102,B301
      
      





GitHub Webサイトの詳細。



おわりに



Pythonは、アプリケーションの正しい動作を確認するために必要な組み込みコマンドとライブラリのおかげで、テストを利用可能にしました。 Pythonでテストを開始するのは簡単です。unittestを使用して、小さくて保守しやすいメソッドを記述して、コードをテストできます。



アプリケーションのテストと拡張の詳細については、pytestなどのテストフレームワークのいずれかにアップグレードして、より高度な機能の使用を開始することを検討してください。



読んでくれてありがとう。 Pythonで紛れもない未来を!



そして、記事を読んだ人のために、私たちは別の素晴らしいニュースを持っています。 今、10,000ルーブルの割引でPython開発者コースを取得することができます!



前編

第二部



All Articles