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)