2014
10
27
10
27
Python: テストの妥当性を考える(code coverage)
Coverallsの使用を機にコードカバレッジというものを知ったので簡単な紹介。
初級者から脱したい人向けのPython本を読んでいたら、テストを書いてテスト駆動開発しようぜという章があった。それを読んでからの開発は必要に応じてまずテストを書いて、開発を進めながらテストを並行して行っていた。だけど誰に教わったわけでもないので、テストが妥当に書けているかという不安が少しあった。
Coverallsというサービスをオープンソースで勧められてコードカバレッジというものを知った。これはテストの妥当性を測るものだ。 テストがプロジェクト中のコードのどれくらいを実際に走らせているかを目安としてパーセントで出せる。テストしてない関数がないかということや、テスト中で試されていないif分岐、try分岐まで確認できる。このテストのカバー率が100%に近づくほど、コードの隅々までチェックされたテストを行えたということになる。
実際にコードカバレッジのチェックをやってみる。環境はLinuxでもWindowsでも。
まずモジュールcoverageをインストールする。PyPIにあるのでeasy_installかpipですぐ入れられる。インストールが済んだら、ターミナルでプロジェクトのコードがあるディレクトリへ移動する。そしてcoverageコマンドに続けて、テストの実行コマンドを入れる。
> coverage run test.py

いつもどおりのテスト結果が表示される。ここから次のコマンドを入れてカバレッジの概要を見てみる。
> coverage report -m

スクリプトファイルそれぞれで何%がテストによってカバーされていて、カバーが抜け落ちているのが何行目かということもわかるようになっている。でもちょっとわかりにくい。結果をHTML出力することで、もっと見やすくなる。
> coverage html
これでカレントディレクトリにカバレッジ測定結果を集めたhtmlcovディレクトリができ、中にブラウザで表示するためのHTMLやCSSなどが並ぶ。コードと同じ名前の拡張子を変えたHTMLを開いてみる。

::::

未カバーのところを赤でマークしてくれてある。これを見ればテストの改良もサクサク進められる。
Pythonスクリプトはオープンソースで多くの人に使ってもらいたいなんてものを書くときには多環境に対応させる必要がある。Linux、WinとかPython 2.xと3.xとか。そうすると一つの環境では実行されないif分岐の一枝とかが絶対に出てくる。
カバレッジ測定は一つの環境で行われるので、分岐内のどちらかは必ずカバーできなくなる。つまり100%をカバーするのはデフォルトでは難しいケースがあるということ。任意の箇所をカバー測定から外す手段や多環境でのテストを統合する方法があることを頭に入れておきたい。そのあたりは下に公式ドキュメントのリンクを置いたのでそちらから。あるいは今後記事にするかもしれない。
テストの導入の次のステップである妥当性検討のためのカバレッジ測定。これによってテストを充実させプロジェクトの品質が上がるという期待ができる。テスト導入の次にぜひ。
coverage公式ドキュメント:http://nedbatchelder.com/code/coverage/
初級者から脱したい人向けのPython本を読んでいたら、テストを書いてテスト駆動開発しようぜという章があった。それを読んでからの開発は必要に応じてまずテストを書いて、開発を進めながらテストを並行して行っていた。だけど誰に教わったわけでもないので、テストが妥当に書けているかという不安が少しあった。
Coverallsというサービスをオープンソースで勧められてコードカバレッジというものを知った。これはテストの妥当性を測るものだ。 テストがプロジェクト中のコードのどれくらいを実際に走らせているかを目安としてパーセントで出せる。テストしてない関数がないかということや、テスト中で試されていないif分岐、try分岐まで確認できる。このテストのカバー率が100%に近づくほど、コードの隅々までチェックされたテストを行えたということになる。
実際にコードカバレッジのチェックをやってみる。環境はLinuxでもWindowsでも。
まずモジュールcoverageをインストールする。PyPIにあるのでeasy_installかpipですぐ入れられる。インストールが済んだら、ターミナルでプロジェクトのコードがあるディレクトリへ移動する。そしてcoverageコマンドに続けて、テストの実行コマンドを入れる。
> coverage run test.py

いつもどおりのテスト結果が表示される。ここから次のコマンドを入れてカバレッジの概要を見てみる。
> coverage report -m

スクリプトファイルそれぞれで何%がテストによってカバーされていて、カバーが抜け落ちているのが何行目かということもわかるようになっている。でもちょっとわかりにくい。結果をHTML出力することで、もっと見やすくなる。
> coverage html
これでカレントディレクトリにカバレッジ測定結果を集めたhtmlcovディレクトリができ、中にブラウザで表示するためのHTMLやCSSなどが並ぶ。コードと同じ名前の拡張子を変えたHTMLを開いてみる。

::::

未カバーのところを赤でマークしてくれてある。これを見ればテストの改良もサクサク進められる。
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/
スポンサーサイト