複数の環境でのテスト
これまで、特定の依存関係セットを持つ仮想環境を使用して、Pythonの1つのバージョンをテストしてきました。 しかし、Pythonのいくつかのバージョンまたはパッケージのいくつかのバージョンでアプリケーションをテストする必要が常にあるかもしれません。 Toxは、複数の環境でのテストを自動化するアプリケーションです。
![](https://habrastorage.org/webt/kx/tm/g6/kxtmg6h8xqazqnklzaxbyviiwly.png)
Toxのインストール
Toxはpip経由でインストールするパッケージとしてPyPlで利用可能です:
$ pip install tox
インストール後、Toxの構成に進むことができます。
依存関係に合わせてToxをカスタマイズする
Toxは、プロジェクトディレクトリの構成ファイルを使用して構成されます。 次のものが含まれます。
- テストを実行するために実行するコマンド。
- 実行に必要な追加パッケージ。
- テスト用に選択されたPythonのターゲットバージョン。
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に次の指示が与えられます。
- Python 2.7および3.7のテスト(オプションで、それらを他のものに置き換えることができます。)
- requirements.txtにリストされているすべてのパッケージのインストール(依存関係がない場合は、このセクションを削除できます。)
- python -m unittest discoverを実行してテストを実行します。
このファイルをコミットしてプッシュすると、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を実行すると、ベンチマーク結果が得られます。
![](https://habrastorage.org/webt/9t/mn/pe/9tmnpe2bmfnlm5p_k41ni3cbo5e.png)
詳細については、 ドキュメントサイトをご覧ください。
セキュリティエラーを特定するためのテスト
アプリケーションで実行する必要があるもう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開発者コースを取得することができます!
前編
第二部