主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Python: テストの妥当性を考える(code coverage)

                
tags: python
 Coverallsの使用を機にコードカバレッジというものを知ったので簡単な紹介。


 初級者から脱したい人向けのPython本を読んでいたら、テストを書いてテスト駆動開発しようぜという章があった。それを読んでからの開発は必要に応じてまずテストを書いて、開発を進めながらテストを並行して行っていた。だけど誰に教わったわけでもないので、テストが妥当に書けているかという不安が少しあった。
 Coverallsというサービスをオープンソースで勧められてコードカバレッジというものを知った。これはテストの妥当性を測るものだ。 テストがプロジェクト中のコードのどれくらいを実際に走らせているかを目安としてパーセントで出せる。テストしてない関数がないかということや、テスト中で試されていないif分岐、try分岐まで確認できる。このテストのカバー率が100%に近づくほど、コードの隅々までチェックされたテストを行えたということになる。

 実際にコードカバレッジのチェックをやってみる。環境はLinuxでもWindowsでも。
 まずモジュールcoverageをインストールする。PyPIにあるのでeasy_installかpipですぐ入れられる。インストールが済んだら、ターミナルでプロジェクトのコードがあるディレクトリへ移動する。そしてcoverageコマンドに続けて、テストの実行コマンドを入れる。
> coverage run test.py
1410271334000.jpg
いつもどおりのテスト結果が表示される。ここから次のコマンドを入れてカバレッジの概要を見てみる。
> coverage report -m
1410271334103.jpg
スクリプトファイルそれぞれで何%がテストによってカバーされていて、カバーが抜け落ちているのが何行目かということもわかるようになっている。でもちょっとわかりにくい。結果をHTML出力することで、もっと見やすくなる。
> coverage html
これでカレントディレクトリにカバレッジ測定結果を集めたhtmlcovディレクトリができ、中にブラウザで表示するためのHTMLやCSSなどが並ぶ。コードと同じ名前の拡張子を変えたHTMLを開いてみる。
1410271333352.jpg
::::
1410271333442.jpg
未カバーのところを赤でマークしてくれてある。これを見ればテストの改良もサクサク進められる。

 Pythonスクリプトはオープンソースで多くの人に使ってもらいたいなんてものを書くときには多環境に対応させる必要がある。Linux、WinとかPython 2.xと3.xとか。そうすると一つの環境では実行されないif分岐の一枝とかが絶対に出てくる。
if py_ver == 2.7:
print(2.7) # will be done on Python 2.7, but this won't be done on Python 3.4
elif py_ver == 3.4:
print(3.4) # will be done on Python 3.4, but this won't be done on Python 2.7


 カバレッジ測定は一つの環境で行われるので、分岐内のどちらかは必ずカバーできなくなる。つまり100%をカバーするのはデフォルトでは難しいケースがあるということ。任意の箇所をカバー測定から外す手段や多環境でのテストを統合する方法があることを頭に入れておきたい。そのあたりは下に公式ドキュメントのリンクを置いたのでそちらから。あるいは今後記事にするかもしれない。
 テストの導入の次のステップである妥当性検討のためのカバレッジ測定。これによってテストを充実させプロジェクトの品質が上がるという期待ができる。テスト導入の次にぜひ。

coverage公式ドキュメント:http://nedbatchelder.com/code/coverage/
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。