DjangoでTestCaseを使ってテストを書いた

はじめに

少し前から仕事でテストを書きながらコードを書くようになってきた。
最近趣味でコード書くときにPythonでDjangoを使ってるんだけど、こっちでもテストを書いてみようと思ってやってみた。

環境

  • Django v1.11.7

Djangoでテストを書く前に

DjangoとかPythonでテストについて調べると、この辺りのツールが多く出てくる気がする。

  • pytest
  • pytest-django
  • unittest
  • TestCase

そこまでしっかりと違いを調べたわけじゃないんだけど、pytestシリーズとPython標準ライブラリのunittest、そのサブクラスのTestCaseって感じのラインナップになるのかなって印象。

困ったらとりあえず標準ライブラリ側でやろうの精神なので、今回はTestCaseを使ってみることにした。
機能が足りないと思ったら他を使ったら良いよっていうお告げも聞いたのでそういう感じでいこうと思う。

やってみる

Djangoでアプリの雛形を生成した場合、その中に tests.py というファイルが作られるはず。
ただ、ココに全部書いていくと見通しが悪くなりそうなので、 tests/ ディレクトリを作ってこの中にテスト用のファイルを作成した。
Djangoで後ほど下で書くtestの実行コマンドを実行した時、 test*.py なファイルを 自動で探してくれる らしい。

テストを書く

フレームワークのコードのテストになってしまって意味がないんだけど、例の1つとして。
取得したデータの個数を確認してちゃんとデータが引き出せているかの確認。

class HogeModelTest extends TestCase
  def setUp(self): # テスト実行前の処理: データの設定とか
    ModelName.objects.create(name="hoge")  # 例えばココで1件つくる

  def testFindByAll(self):
    ModelItem = ModelName.objects.findAll()
    self.assertEquals(len(ModelItem), 1)

テストを実行する

テストを走らせる時はこんな感じのコマンドを実行します。

$ python manage.py test

testの後ろにテストファイルまでのファイルパスを書いてあげることで、特定アプリ内のテストを実行できる。
eclipseでJUnitを実行したときのみたい目に慣れてるからターミナルで実行したときの見た目になかなか慣れないんだけど、テストをクリアしてるかコケてるかは一番下に表示される。

テストデータについて

Djangoにはfixtureというツールがあって、これを使うことでてテスト前やmigrate時なんかにテストデータをインポートする事ができるみたい。
これ使ったら良いよって前教えてもらったのにすっかり忘れて、QuerySetで .create() を書いてた。

初期データ(init_data)であったりテスト用データであったりといくつかのパターンを用意することができるらしい。
うまいこと使い分けたい。

今Fixtureに移行中なので、できたら追記するか新たに記事を書こうかな。

やってみて

仕事でJava+eclipse+JUnit5な環境でテストを書いてるんだけど、特にEclipseのGUI上で表示されるテストとはやっぱ雰囲気が違って結果が見にくいのが辛い。慣れてない部分が強いんだろうけどね

テストコードを実際に書いてみることで、実際のコードを書きながら悩む時間は無くなったし、後で実行して動くのが一気に確認出来るのは嬉しいなと思ったので今後も書いていきたい。