python標準のunittestのカバレッジを取る

2015-08-28 追記

doctestのカバレッジを取る方法も書きました。といっても同じツールでほぼ同じ使い方です。素敵。

python標準ライブラリの中にはunittestと言う単体テスト用のモジュールがありまして、案外これが便利だったりします。 テストのためだけに環境整えるのは面倒だし、かと言ってテストしないどくには不安だし・・・って時にでも? 前に紹介したdoctestよりも面倒な分ちょっと高度な事が出来る、って感じかな。

そのunittestの使い方については公式のドキュメントに譲るとして、この記事ではunittestで書いたテストのカバレッジを見る方法について。

カバレッジと言うのは、テストがプログラムをカバーしている割合、だそうです。全体のプログラムのうち、何パーセントがテストされている、的な。

今回使うのはcoverageと言うツール。そのまんまの名前だ。

gentooならportageにあるので

# emerge coverage

で入ります。 ubuntuとかでもpython-coverageで入る、らしい? 試してませんが。

テスト対象のプログラムをmain.py、テストケースをtest.pyとしておきましょう。

$ coverage run test.py

でテストを実行します。python2.xの場合はcoverage2コマンドで。

テストが終わったら、

$ coverage report

でモジュール毎のカバレッジを見ることが出来ます。

$ coverage report main.py

とすれば目的のモジュールのカバレッジだけ見ることも可能。

$ coverage annotate main.py
$ cat main.py,cover

としてあげると、どの行がテストされていてどの行がテストされていないのかを見ることが出来ます。

>から始まっている行がテスト済み、!から始まっている行は未テスト。 モジュール名を省略するとすべてのモジュールのレポートを書き出してくれるみたい。

とはいえテキスト形式だとちょっと見辛いので、HTMLで出力するのがおすすめ。 HTML出力は

$ coverage html

こんな感じで。htmlcov/index.htmlってファイルを開くとかなりいい感じに見せてくれます。

見終わったら、

$ coverage erase

とするとテスト結果を保存したファイル(./.coverage)を削除してくれます。 ,coverファイルやhtmlcovディレクトリは削除されないので、こっちは手動で。

なかなか素晴らしいぞこのツール。便利。

参考: PythonでUnitTestとCodeCoverageをやってみる(2) - HDEラボ