Python: GitHub 上のプロジェクトを Travis-CI, Coveralls と連携する
GitHub でパブリックなプロジェクトを作ったら、無料でCI環境とカバレッジ環境を手に入れることが可能。
これを利用しない手はない。
以下、具体例として一つの小さなプロジェクトを作りながら説明する。
Step 1: GitHub リポジトリ作成
setup.py で管理された Python プロジェクトを作る。
ディレクトリ構成
構成の一例。
. ├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── setup.py ├── src │ └── yourpackage │ ├── __init__.py │ └── yourmodule.py └── tests ├── __init__.py └── test_yourmodule.py |
アプリケーション/ライブラリの実装
ソースコードは src ディレクトリ配下にまとめる。
ここでは例として yourpackage というパッケージと、適当な数値計算を行うyour_function という関数を用意した。
__init__.py にインポート対象(クラス/関数)を書くのを忘れずに。
1 | from .yourmodule import your_function |
1 2 3 4 5 6 7 8 9 10 11 12 13 | def your_function(x): ret = 0 if x % 2 : ret | = 1 if x < 10000 : ret | = 2 if x = = 10000 : ret | = 4 if x % 9 = = 7 : ret | = 8 if x / 2000 = = 6 : ret | = 16 return ret |
テストコードの実装
テストコードは tests ディレクトリ配下にまとめる。
tests 自体もパッケージとして管理したほうが利便性がよいので、空の __init__.py を作る。
そして以下のようなテストコードを書いた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import unittest from yourpackage import your_function class TestYourModule(unittest.TestCase): def setUp( self ): pass def test_your_function_zero( self ): self .assertEqual(your_function( 0 ), 2 ) def test_your_function_odd( self ): self .assertEqual(your_function( 1 ), 3 ) def test_your_function_greater_than_10000( self ): self .assertEqual(your_function( 10006 ), 8 ) def test_your_function_12345( self ): self .assertEqual(your_function( 12345 ), 17 ) |
カバレッジ結果をわかりやすくするため、あえてカバレッジ率は 100% にならないようにしている。
setup.py セットアップスクリプトの記述
今回は必要ないが、他の Python ライブラリに依存があればここで記述する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | from setuptools import setup, find_packages setup( name = 'your-project-name' , version = '0.0.1' , description = 'description for your project' , author = 'your name' , author_email = 'your email address' , url = 'your url' , install_requires = [ # list your dependencies ], tests_require = [ # dependencies for unit testing ], package_dir = {' ': ' src'}, packages = find_packages( 'src' ), include_package_data = True , test_suite = 'tests' , ) |
テストの実行
setup.py を使ってテストを実行する。以下のように表示されれば OK。
$ python ./setup.py test running test running egg_info creating src/your_project_name.egg-info writing src/your_project_name.egg-info/PKG-INFO writing top-level names to src/your_project_name.egg-info/top_level.txt writing dependency_links to src/your_project_name.egg-info/dependency_links.txt writing manifest file 'src/your_project_name.egg-info/SOURCES.txt' reading manifest file 'src/your_project_name.egg-info/SOURCES.txt' writing manifest file 'src/your_project_name.egg-info/SOURCES.txt' running build_ext test_your_function_12345 (tests.test_yourmodule.TestYourModule) ... ok test_your_function_greater_than_10000 (tests.test_yourmodule.TestYourModule) ... ok test_your_function_odd (tests.test_yourmodule.TestYourModule) ... ok test_your_function_zero (tests.test_yourmodule.TestYourModule) ... ok ---------------------------------------------------------------------- Ran 4 tests in 0.000s OK |
ここまでできたら、一旦 GitHub に公開リポジトリとして push する。
Step 2: Travis-CI の登録
- https://travis-ci.org/ にアクセス
- メニュー右上の Sign in with GitHub をクリックし、GitHub OpenID認証を承認
- ログイン後、アカウント名 -> Accounts -> Repositories の画面で
連携したいプロジェクトをチェック・オン
Step 3: Coveralls の登録
- https://coveralls.io/ にアクセス
- メニュー右上の SIGN IN ボタンをクリックし、GitHub OpenID認証を承認
- ログイン後、REPOS -> ADD REPOS ボタンをクリック
- リストに対象リポジトリが表示されていなかったら、画面上部の SYNC GITHUB REPOS ボタンをクリック
- 連携したいプロジェクトをチェック・オン
Step 4: .travis.yml の設置
プロジェクトルートに、.travis.yml という名前の設定ファイルを作れば
Travis-CI がそのファイルを読み取ってテストを走らせてくれる。
こちら (Travis CI: Building a Python Project) を参考に、以下のような内容で記述。
1 2 3 4 5 6 7 8 9 10 11 | - - - language: python python: - "2.6" - "2.7" install: - pip install coveralls script: - coverage run - - source = src setup.py test after_success: - coveralls |
install, script, after_success に Coveralls 連携のための記述を追加していることに注意。
この状態で GitHub に push を行えば、ほどなく(数分以内に)自動的に Travis-CI, Coverall の処理が開始される。
Step5: 結果確認
Travis-CI, Coverall ともに GUI ですぐに結果を確認できる。
またテストに失敗した場合は、自動的に通知メールが飛んでくる。
Step 6: バッジの登録
Travis-CI, Coveralls ともに公式のバッジが用意されている。
これらを README に貼り付ければ、GitHub 訪問者にとってもステータスが一目瞭然だ。
さいごに
今回は Python プロジェクトの例を挙げたが、setup.py やテストコードの準備さえ済めば、実に簡単に連携できる。
まさに朝飯前。『Web系エンジニアにとってテストコードを書くのは朝起きて歯磨きをするように当たり前のこと』との言もあったが、これらのサービスはさながら無料の朝食サービスのようなものだ。
より高度な使い方もできるので、詳細は各サービスのドキュメントを参照。以下はその一例。
- master 以外のブランチと連携
- pull request との連携 (マージする前に結果を確認できるので便利)
- 通知先の拡張 (チャットサービス等と連携)
- プライベートリポジトリとの連携 (有償)
Travis-CI, Coveralls ともに他の言語でも利用可能なので、今後も積極的に活用していきたい。
今回使用したコード
References
- TravisCI - CI環境構築 ~ Python編 ~ - Qiita
- 今回参考にしたプロジェクト: zaneli/docomocvpy
0 件のコメント:
コメントを投稿