Pycharmでテストカバレッジを計測する


pycharmでは簡単にテストカバレッジを計測することができます。


試して見るためdjango-generate-scaffoldで適当なdjangoアプリを作ってみます。

参考 : django-generate-scaffoldをさわってみたメモ - brainstorm

pycharmでdjangoプロジェクトを新規作成したら、「Run manage.py Task」でgeneratescaffoldを実行します。


ダイアログに書いてありますが、Shift + Enterするとcommandにパラメータを渡せます。


こんな感じでBookモデルとCURDを作成しました。


generate-scaffoldはテストは書いてくれません。
デフォルトのテストを動かしてみます。

class SimpleTest(TestCase):
    def test_basic_addition(self):
        """
        Tests that 1 + 1 always equals 2.
        """
        self.assertEqual(1 + 1, 2)


tests.pyを開いてCtrl + Shift + F10でテスト実行されます。

カバレッジ計測有りで実行する場合は、実行するプログラムがtests.pyの状態で、以下のボタンを押します。


はじめて実行する場合は以下の様な警告がでるかもしれません。

「enable」をクリックすればpycharmにバンドルされているcoverage.pyでカバレッジ計測されるようです。


テスト実行が終わると、coverage viewが開きます。
ここを見れば実行された行数の割合がわかります。

view関数に関するテストが無いのでviews.pyやviewsパッケージ以下はnot coveredになってます。


ちょっとだけテスト書いてみます。

class BookViewTest(TestCase):
    def setUp(self):
        self.client = Client()

    def test_index(self):
        res = self.client.get('/book/')
        self.assertEquals(res.status_code, 200)


再度カバレッジ計測有りで実行してみるとbook_views.pyのカバレッジは95%になりました。

これはbook_views.pyに実装されているview関数のほとんどがGenericViewで構成されているためです。
book_views.pyそのものにはほとんど実装がありません。


では実行されなかった5%のコードはどこなのか?
エディタで見ると実行された行は緑、実行されなかった行は赤になっているのがわかります。


BookDeleteViewのget_success_urlだけ実行されなかったようです。

テストを追加してみます。

class BookDeleteViewTest(TestCase):
    def setUp(self):
        self.client = Client()
        self.book = Book.objects.create(title=u"Python プロフェッショナルプログラミング",
                                        author=u"ビープラウド",
                                        price=2940)

    def test_delete(self):
        res = self.client.post('/book/%s/delete/' % self.book.id)
        self.assertEquals(res.status_code, 302)
        self.assertEquals(Book.objects.count(), 0)


再度カバレッジ計測すると、book_views.pyのカバレッジは100%になりました。

カバレッジ計測結果のhtml出力

カバレッジ計測結果はcoverage viewの以下のボタンからhtmlに出力することができます。


htmlの見た目はこんな感じ



なかなか便利なんじゃないでしょうか