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開発者コヌスを取埗するこずができたす

前線
第二郚

Source: https://habr.com/ru/post/J444204/


All Articles