Pythonプロジェクトを成功させるための10ステップ

本書の翻訳版は、Pythonプロジェクトにコードの書式設定、テスト、継続的統合、および依存性分析ツールを装備できるようにするツール専用です。 これにより、開発プロセスの速度が上がり、コードの品質、均一性、セキュリティが向上します。 この資料の読者は既にPython開発の経験があり、読んでいる間に実験するPythonプロジェクトがあることを前提としています。 そのようなプロジェクトがない場合は、 ここで開発環境を準備し、Pythonパッケージを作成する方法を学ぶことができます。 ここで提供される例は、macOSとPython 3.7を使用して準備されます。







ステップ1. Blackのインストール









プロジェクトコードは、コードスタイルの規則に従う必要があります。 Blackは、コードを自動的にフォーマットし、その外観をPEP 8標準に合わせるPythonパッケージです。 Blackは比較的新しいプロジェクトですが、すでに100万以上のダウンロードを獲得しています。 その使用はすぐにPython開発の良い味のしるしになりました。 こちらがブラックのマニュアルです。



私はコードエディターとしてAtomを使用しているため、 Python-Black



パッケージをAtomに追加しました。 インストール方法については、 こちらをご覧ください 。 このパッケージをインストールした後、Atomはファイルを保存した後にコードを再フォーマットします。



ブラックについて話している間、このツールにプロジェクトで私たちと一緒に働く人たちの開発環境を装備しましょう。 その結果、プロジェクトで作業するすべての人が同じコードフォーマットルールを使用します。そうしないと、プルリクエストは受け入れられません。



requirements_dev.txt



ファイルにある最初の空き行にblack==18.9b0



を追加し、 install -r requirements_dev.txt



コマンドを実行しinstall -r requirements_dev.txt







デフォルトでは、黒はコード行の長さを88文字に設定します。 Sphinxなどの一部のスタイルガイドでは、79文字の文字列長が必要です。 Black-Atom



パッケージの設定では、目的の行の長さを設定できます。



コードのフォーマットにかかる時間を節約するツールを入手したので、PyPIへのコードの送信を高速化して簡素化する方法について考えます。



ステップ2. .pypircファイルを作成する



より糸を使用してアプリケーションアセンブリをTestPyPIおよびPyPIに送信する場合、ログイン情報を手動で入力する必要あります。 麻ひもに慣れていない場合は、 この資料をご覧ください。 次に、このプロセスを自動化します。



Twineは、ホームディレクトリにある.pypirc



ファイルを使用できます。 データをアンロードするこのツールは、指定されたファイルからURL、ユーザー名、およびパスワードを取得します。



したがって、ホームディレクトリに.pypirc



ファイルを作成します。



 touch ~/.pypirc
      
      





次のテキストを追加します。



 [distutils] index-servers =   pypi   testpypi [testpypi] repository: https://test.pypi.org/legacy username = your_username password = your_pypitest_password [pypi] username = your_username password = your_pypi_password
      
      





ここで実際のユーザー名とパスワードを入力する必要があることは明らかです。 また、このファイルが現在の作業ディレクトリではなく、ホームディレクトリに保存されていることを確認してください。 このファイルを他のユーザーから保護する場合は、コマンドラインツールを使用して、アクセス許可を構成できます。



 chmod 600 ~/.pypirc
      
      





これで、次のコマンドを使用して、パッケージをTestPyPIにロードできます。



 twine upload -r testpypi dist/*
      
      





通常のPyPIでは、次のようなパッケージをロードできます。



 twine upload dist/*
      
      





.pypirc



ファイルを取得した後、ユーザー名とパスワードを手動で入力する必要はなくなりました。



ここで、開発環境にテストツールを追加して、作成しているパッケージの正しい動作を検証できるようにします。



ステップ3. pytestをインストールして構成する









Pytestは、Pythonで記述されたコードをテストするための最も人気のある使いやすいライブラリです。 この例では、プロジェクトに簡単なテストを追加します。 さて 、pytestの詳細に興味がある場合は、このツールの入門ガイドとしてお勧めします。



pytestの詳細をrequirements_dev.txt



ファイルに追加します。



 pytest==4.3.0
      
      





パッケージをインストールしましょう:



 pip install requirements_dev.txt
      
      





次に、pytestがパッケージを検出できるようにする次のコマンドを実行します。



 pip install -e .
      
      





仮想開発環境を非アクティブにした場合、テストを実行するには両方のpip



コマンドを再度実行する必要があります。



ステップ4.テストの作成



プロジェクトのルートディレクトリにtest



フォルダーを追加します。 ファイルtest_your_package_name.py



中に配置します。 私のファイルはtest_notebookc.py



と呼ばれtest_notebookc.py



。 ファイル名がtest_



で始まる場合、pytestはそのようなファイルを自動的に検出できます。



次のテストをtest_notebookc.py



ファイルに追加しました。これは、関数が正しい名前を表示するかどうかを確認することを目的としています。 このコードを変更して、使用するファイル名と関数名が自分のものと一致するようにし、独自のテストを記述します。



 """Tests for `notebookc` package.""" import pytest from notebookc import notebookc def test_convert(capsys):   """Correct my_name argument prints"""   notebookc.convert("Jill")   captured = capsys.readouterr()   assert "Jall" in captured.out
      
      





ここで何が起こっていますか?



まず、ここでモジュールをインポートします。 次に、 test_my_function_name



テンプレートに従って名前が作成される関数を作成します。 この関数の命名規則により、プロジェクトコードを読んでいる他の人が、テストで何がテストされているかをすばやく理解できます。 さらに、これはテストでコードのカバレッジを制御するのに役立つパッケージに必要です。これについては以下で説明します。



その後、( convert



)関数を呼び出し、名前Jill



を引数として渡します。 次に-関数が表示するものをキャプチャします。 ここで、問題の関数は非常に単純であると言う価値があります。 彼女はmy_name



パラメータを受け取り、次のことを行います。



 print(f"I'll convert a notebook for you some day, {my_name}.")
      
      





Pytestは、関数の出力にJall



Jall



れているかどうかをチェックします。 Jill



関数を渡すため、この行は存在しないはずです。 ここに、出力の傍受に関する情報を見つけることができるpytestのドキュメントがあります。



コマンドプロンプトでpytest



と入力して、テストを実行します。 このテストは失敗するはずです。 エラー情報は赤で表示されます。









テスト中にエラーが検出されました。



特定の条件下でテストがエラーで終了するように、テストの正確性を確認して説明することをお勧めします。 緑のメッセージのみを出力するテストを作成しないでください。テストを実行すると、チェック対象の内容がチェックされないことがあります。



テストが失敗したと確信した後、 Jall



ステートメントをJill



変更し、テストを再度実行します。 これで正常に完了するはずです。









テストが正常に完了しました。



今ではすべてが順調です。 このテストでは、誰かが関数に行を渡すと、この関数が表示するテキストにこの行が含まれることを確認できます。



また、渡されたデータを処理する方法について関数をチェックするテストを作成することもできます。 つまり、文字列とタイプが異なるデータを受信すると、TypeErrorエラーが発生するはずです。 Pythonでの例外とエラー処理に関する優れた情報を次に示します。



前のテストを作成したときに、テストを正常に完了するコードを作成しました。 これは、テスト駆動開発(TDD)と呼ばれます。 TDDは、TDDを使用しない場合よりもエラーの少ないコードを記述するのに役立つ実証済みのプログラミングアプローチです。 ここにいくつかの有用なTDD資料があります。



次に、演習として、文字列以外の何かを渡すときにエラーをスローし、この関数に適切なメカニズムを実装するように、 convert()



関数をチェックするテストを作成してみてください。 整数、リスト、および辞書は文字列に変換されることに注意してください。



パッケージがテストに合格すると、継続的インテグレーションシステムを利用する準備が整います。



ステップ5. Travis CIサービスへの登録とその構成









Travis CIは、「ソフトウェアを構築およびテストするための分散型Webサービス」です。 最近、 イデラに買収されました。 他の継続的インテグレーションシステムもありますが、Travis CIは人気のあるオープンソースのよく文書化されたツールなので、これを使用します。



Travis CIを使用すると、テストに合格して標準を満たすコードのみをプロジェクトに統合できます。 ここでは、Travis CIの詳細をご覧ください。また、継続的な統合についてはこちらをご覧ください。



https://travis-ci.org/でアカウントを作成します 。 次に、[ Review and add your authorized organizations



]をクリックし、プロファイルページのReview and add your authorized organizations



リンクReview and add your authorized organizations



。 GitHubにアクセスするためのパスワードの入力を求められます。 [ Organization access



セクションで[ Grant



をクリックしOrganization access













Travis CIアカウントのセットアップ



notebooktoall



notebookc



リポジトリに関する情報がアカウントに表示されるように、アカウントを同期する必要がありました。 通常、Travis CIがコードを処理するには、約1分かかります。 その後、次の図に示すスイッチを使用してリポジトリをアクティブ化する必要があります。









リポジトリのアクティベーション



ここで、 Settings



ボタンをクリックする必要があります。 ここでは、リポジトリに送信されたプルリクエストまたはブランチに基づいてTravisがビルドできるかどうかを示す必要があります。









プロジェクトビルドのセットアップ



ここで、作業中のプロジェクトをセットアップします。これにより、Travisはプルリクエストごとにプロジェクトをビルドできます。



ステップ6. .travis.ymlファイルを作成する



プロジェクトのルートフォルダーで、次の内容の.travis.yml



ファイルを作成します。



 dist: xenial language: python python: 3.7.2 install: - pip install -r requirements_dev.txt - pip install -e . script: - pytest
      
      





dist: xenial



、Ubuntu Xenial 16.04を使用して仮想環境を整理する必要性をTravisに伝えるために必要です。 Python 3.7コードをテストするには、Ubuntu Xenialが必要です。詳細については、 こちらをご覧ください



install



セクションでは、プロジェクト開発で使用されるパッケージをインストールできます。 pip install -e .



コマンド Travisの仮想環境でパッケージのインストールを実行します。 この後、pytestを開始したTravisはパッケージを見つけることができます。



ステップ7. Travis CIでのテスト



変更をコミットし、GitHubに送信して、PRを実行します。 Travisは数秒以内に動作し始めます。









職場でのトラビス



これがTravisがプロジェクトを処理する際に行うことです。









プロジェクトの処理中にTravisによって実行されるアクション



PRが失敗した場合-Travisはそれを報告します。 プルリクエストが失敗した場合、同じブランチに変更を送信すると、Travisが自動的に動作を開始することに注意してください。



Travis Webサイトのリポジトリページに移動し、そこを見てください。 ここでは、アセンブリに関する多くの興味深いものを見つけることができます。 おそらく、将来、アセンブリの失敗の原因を理解しようとすると、このページに頻繁にゲストになるでしょう。



すべてがうまくいったと仮定すると、ページに緑色のラベルが含まれていれば、プロジェクトの検証とアセンブリは成功しました。









プロジェクトの組み立てが正常に完了しました



ページに緑または赤のラベルがない場合は、[ More options



]メニューを開いて[ Requests



]を選択します。 ここにエラーメッセージが赤で表示されている場合は、それらを分析します。 Build config file is required



エラーメッセージが表示Build config file is required



、Travisがリポジトリで.travis.yml



ファイルを見つけられないことを意味します。 修正するとエラーは消えます。



Travisは、プロジェクトのアセンブリが失敗した場合、および修正が可能な場合に、ユーザーに電子メールを送信します。



コミットを送信してPRを開くと、Travisがプロジェクトのビルドプロセスを自動的に再起動することに注意してください。



次に、コードをテストでカバーするためにプロジェクトを分析します。



ステップ8.テストによるコードカバレッジの評価



テスト付きのコードカバレッジに関するレポートを使用すると、プロジェクトコードのどの部分がテストされているかを確認できます。 このようなレポートを作成するには、 pytest-covパッケージを使用します。



requirements_dev.txt



ファイルに次の行を追加します。



 pytest-cov==2.6.1
      
      





次のコマンドを実行します。



 pytest --cov=my_project_name
      
      





私の場合、 pytest --cov=notebookc



コマンドがpytest --cov=notebookc



後、次のレポートが表示されました。









コードカバレッジレポート



結局のところ、プロジェクトコード全体にテストが提供されています。 プロジェクト全体が複数行のコードで構成されている場合、このような指標は非常に簡単に実現できます。



次に、コードをテストでカバーするという観点から、プロジェクトの状態の公開履歴を保持できるツールについて説明します。



ステップ9.カバーオールの使用



Coverallsプロジェクトでは、コードカバレッジに関する履歴情報をテストで維持できます。









つなぎ服



このプロジェクトの機能を活用するには、GitHubアカウントのデータを使用して、 https://coveralls.io/サイトに登録する必要があります。 次に、リポジトリを接続する必要があります。



requirements_dev.txt



ファイルで、行coveralls==1.6.0



追加します。 ところで、プロジェクトの作業のこの段階で、このファイルは次のようになります。



 pip==19.0.3 wheel==0.33.0 twine==1.13.0 pytest==4.3.0 pytest-cov==2.6.1 coveralls==1.6.0
      
      





.travis.yml



ファイルを.travis.yml



ようにします(この場合、プロジェクトの名前はここにあります)。



 dist: xenial language: python python: 3.7.2 install: — pip install -r requirements_dev.txt — pip install -e . script: — pytest --cov=my_package_name after_success: — coveralls
      
      





これで、Travisがプロジェクトをビルドするときに、必要なパッケージをインストールし、テストを実行して、テストのコードカバレッジに関するレポートを作成します。 その後、このレポートはCoverallsサービスに送信されます。



コミットし、コードをGitHubに送信し、何が起こるかを確認します。 コードカバレッジテストレポートがCoverallsに届くまで数分かかる場合があります。









プロジェクト処理、テストカバレッジレポート



現在、PRチェックの中には、Coverallsによって実行されるチェックもあります。



Coverallsページで、プロジェクトがテストで100%カバーされていることを確認できます。









テストカバレッジ情報



次に、プロジェクトに別の便利なツールを装備しましょう。



ステップ10. PyUpを使用する



PyUp.ioサービスを使用すると、開発者は、使用する依存関係が古くなっているかどうか、および脆弱性があるかどうかを確認できます。 このサービスは、GitHub上のパッケージの更新を目的としたプル要求を自動的に実行します。 このプロジェクトの機能を利用するには、GitHubアカウント( https://pyup.io/)を使用して登録する必要があります 。 リポジトリを追加するときは、 Update Schedules



every week



設定することをお勧めします。 このアプローチを使用すると、プロジェクトに多くの依存関係がある場合、プル要求があまり多く発生しません。









更新を構成する



PyUp.io Webサイトで、パッケージ情報がどのように見えるかを以下に示します。一部は古くなっています。









パッケージの詳細



このサービスを使用すると、使用するパッケージの最新バージョンがいつリリースされるかを常に知ることができます。 彼らが言うように、知識は勝利の半分です。 そして、後半は明らかに、依存関係を更新するための自動プルリクエストです。



まとめ



この記事では、Pythonプロジェクトを開発するときに、Black、pytest、Travis CI、Coveralls、PyUpなどのツールを使用する方法を学びました。 プロジェクトの依存関係の制御、コードのフォーマットとテスト、プロジェクトの検証とビルドを支援します。 これらのツールがお役に立てば幸いです。



親愛なる読者! Pythonプロジェクトを開発する際に使用するツールは何ですか?






All Articles