Djangoでテスト駆動開発を学ぼう!2~初めてのテスト編~

前回は、テスト駆動開発のための環境設定を主に行いました。

今回から、テスト駆動開発を通して、ToDoアプリケーションを開発していきます。

前回

Selenium実行

Seleniumの実行だけ復習しておきましょう。

下記のコードは、前回実装したコードに「browser.quit()」を追加したものです。

terminalを2つ立ち上げ、以下のコマンドを実行しましょう。

terminalが一瞬立ち上がって、消えたら成功です。

初めてのテスト関数

functional_tests.pyを関数化しましょう。

setup_methodには、テスト前に実行したい処理を書きます。また、teardown_methodには、テスト終了後に実行したい処理を書きます。

これらのメソッドは、pytest特有のメソッドです。unittestでは、以下の様に書きます。

テストを実行しましょう。python manage.py runserverを実行していることを確認してから、pytestを実行してください。

OKですね。なお、pytestには、便利なオプションが多数ありますが、今はpytestコマンドだけで十分でしょう。

listsアプリケーションの追加

さて、Djangoのアプリケーションを追加しましょう。次のコマンドを実行してください。

上記のコマンドにより、「lists」アプリケーションを追加しました。

初めてのUnit Test

では、新しく作成したlistsアプリケーションにUnit Testを追加しましょう!

Djangoは、MVCタイプのフレームワークです。※Model-View-Templateなので、MVTとも呼ばれています。

以下、簡単な処理の流れです。

  1. ブラウザから特定のURLに対してリクエストを送る
  2. Viewに記述されたURLに紐付く関数により、リクエストが処理される
  3. HTTP responseをブラウザに返す

そのため、URLに紐付く関数が適切に処理されているか、適切なテンプレート(HTML)がブラウザに返却させているか、などをテストしていくことにしましょう。

まずは、「localhost:8000/」にアクセスした時、home_page関数が呼ばれるかテストします。

resolve関数を使用するとブラウザ上で「localhost:8000/」にアクセスしたことと同じ処理を実行することができます。

テストを実行しましょう。

home_page関数を設定していないので、エラーになりました。

lists/views.pyに以下の関数を設定しましょう。

テストを実行してみましょう。

該当するURLが見つからないため、エラーになってしまいました。

urls.pyの追加

ではどうするのかというと、DjangoではURLを設定する専用のファイルであるurls.pyを用意します。

これで、ブラウザからのリクエストをhome_page関数へ渡すことができます。

それでは、テストを実行しましょう!

はい!エラーになりました。実は、まだ設定が足りないんですよ。

urls.pyには、プロジェクト(todos)とアプリ(lists)の両方に存在していて、先ほど設定したurls.pyは、アプリ側の設定なのです。

しかし、Djangoは、起動してから最初にプロジェクトのurls.pyを見にいくので、そちら側にも設定する必要があります。

テストを実行してみましょう。

テストがパスしました!

まぁぶっちゃけ、URLテストはなくてもいいかなと個人的には思ってます(笑)。めんどくさいですよね。

テスト駆動はこんな感じなので、しょうがないです。

~~TDDサイクルの復習~~ 1. テストコードを書く
2. テストを実行し、「エラーになること」を確認する
3. テストがpassするように「必要最低限」のプロダクトコードを書く
4. テストを実行し、「passすること」を確認する
5. リファクタリングする

ただ、バグはめっちゃ減ります。堅牢なシステムの出来上がりです。トレードオフなんですよね。

Viewのテスト

ブラウザのリクエストから目的の関数を実行できること確認するテストをpassしたので、次はView自体のテストに着手しましょう。

home_page関数では、ホニャララな処理ののちに、HTMLを返します。ホニャララな部分については後ほど考えるとして、まずはHTMLを返すようにしてみましょう。

まずは、テストからです。

上記のテストでは、home_page関数を実行したら期待したhtml要素を返却されるか確認しています。

テストを実行しましょう。

テストが失敗しましたね(計算通りです)!

プロダクトコードを修正します。

テストを実行します。

エラー内容が変わりましたね。続きを実装しましょう。

テストを実行します。

テストがパスしました!

localhost:8000にアクセスしてみましょう。

OKですね。

functional_tests.pyも実行してみましょう。

テストが失敗しましたね。原因は、HTMLのタイトルを変更したためなので、サクッと直してしまいましょう。

「test_can_start_a_list_and_retrieve_it_later」のassertを「Django」 -> 「To-Do lists」に変更しました。

テストを実行します。

OKですね。

今回は、ここまでにしましょう。

まとめ

今回は、URLとViewに関するちょっとしたテスト関数を実装し、テストを行いました。

まだまだテスト駆動開発の道のりは遠く険しいですが、なんとなくやり方はご理解されたのかな?と勝手に思っています^^

いやぁ、テストの実行結果をブログに書き写していく作業って、結構大変なんですよね。

それと同時に、「こんなにチマチマテストしてないで、サクッとプロダクトコードを書いて、仕事を終えて〜〜」っていう衝動にかられたりします。

でも、ここはグッっとこらえて、私と一緒にテスト駆動開発を勉強していきましょう!

それでは、また!

コメントを残す