【Django】テストコードの書き方について学んでいく

投稿日:

プログラミング初心者の勉強ブログ #98

Pythonオンライン学習教材として評判のPyQ(https://pyq.jp/)によるPython学習記録です。Rubyを多少かじり、第二外国語としてPythonを少しづつ学んでいきます。(内容はRubyとの比較が多くなるかもしれません。)

PyQがやたらテストをさせてくるので今回はDjangoのdjango.test.TestCaseでのテストの書き方についてまとめます。RailsでもRspecがあったがあまりやらなかったのでDjangoでもう一度確認していきます。後半はPyQを2週間ほどやっての感想です。

 

目次

 

Djangoでテストを書いていく

テストの実行

実行はターミナルで行う。

ecディレクトリに移動後、manage.pyを起動させ、「test」の後ろに実行したいテストファイルの関数を入力する。

 

テストファイルの作成

テストファイルは「views.py」と同じ階層に作成した「test」ディレクトリ内に入れる。そのため、対象のモジュール毎に1つのテストディレクトリが作られる。このとき、ファイル名の頭は「test〜」とし、test_views.py、test_models.py、test_forms.pyのようにテストファイルをモデルやビューそれぞれで書き込んでいく。

ディレクトリ構成

上の画像の場合、「tickets」直下にview.pyが存在し、同じくtestディレクトリが同階層に存在する。testディレクトリ内は「forms」や「models」「views」などtickets内のそれぞれのpyファイルのコード毎にテストファイルを作成するのが一般的。

 

テストコードの作成

先ほどの画像で示したファイル構成の中の、実際のtest_views.pyのコードを見ながら確認していく。

下のコードは、「チケット販売ECサイトのチケット一覧機能」をテストしている。チケットにはカテゴリーが存在し、categoryモデルが別に存在する。

 

tickets/test/test_views.py

 

tickets/testing.py

 

tbpauth/testing.py

 

ポイント

地味に書かれているが

ここと、

ここをちゃんと理解しておきたい。この_getTarget関数は、テストクラス内で「self._getTarget()」の形で使われている。要は「return reverse('tickets:list')」が何をしているかだが、reverseはURLをパスの名前から逆引きしてくれる関数で、'reverse('tickets:list')'によって'tickets/list'というパスをreturnしている。

「self.client.get(self._getTarget())」によって、「GETで'tickets/list'へのリクエスト」をするHTTPクライアントに対するレスポンスを返り値として返す。

 

あとはassertTemplateUsedやassertEqual、レスポンスオブジェクトに対するcontextなどの各種メソッドの使い方を理解しておけば、とりあえず読むことはできる気がする。

 

その他

箇条書きしていく。

  • テストで使用したデータはテスト終了後自動で削除されるため、後で消す必要はない。
  • 今回のようなView関数のテストにあたっては、データがちゃんと表示されているかに加え、並び順がちゃんとソートされた通りになっているかも確認すべき。
  • assertEqualなどのメソッドは他にも複数存在するため、ある程度把握しておくべきかもしれない。
  • Python組み込みのunittestととは少し違うので注意する。

 

まとめ

PyQの難易度が高く感じます。基本的に前半部は写経中心の進み、最後にアウトプットチャンスとして自力で解かなければならない問題が出題されるのですが、今回やった「Django中級」では、写経でやった内容より何段階かレベルが上がった問題を最後に出してくるので、結局わからず模範解答の写経になります。写経学習を行うにあたって何が怖いかといえば、気づいたらタイピングゲームになってしまいかねない点です。もともとPyQの学習目的はPythonとDjangoのコードが読めるようになることなのであれですが、写経中心の学習だと一人でDjango使ってアプリ作るレベルまでまず到達できないと感じます。自分のローカルでPythonとDjangoの環境構築をしなくても学習できるのは便利だと思いますが、ローカルで順々に作成していきたいのか正直なところです。ソースコードがPyQサイト内にしか存在しないので、解約してしまうとコードが見れない訳です。ローカルで順々に開発できればソースコードが自分のPCに残る訳で。これは戦略的なのものなのかはわかりません。3000円のコースのくせに贅沢言うなと怒られそうです。こんな感想が出てしまうということは、何十万もするプログラミングスクールの手厚いフォローにゆとられて育ってしまったからなんだと思います。文句ばかり言ってしまってますが、Python学習教材としてPyQはおすすめの教材なんだと思います。実際Pythonの基礎学習はかなりいい感じに進めることができ、勉強がはかどりました。また、今回の「Django中級」は、何か一つのアプリを一から順々に作っていくスタイルではなく、ある程度作られた状態のコードから自分で機能を追加していくというスタイルのため、コードを読み解いていかなければなりません。「新人エンジニア時代は実際の業務でいちから開発をはじめることはほとんどなく、先輩エンジニアが用意した環境に機能を追加する仕事が多いです。」とPyQに書かれてたので、こちらのスタイルの方が確かに実践寄りで良いのかもしれません。後半になってクエストの問題が模範解答を見ずに解けなくなったことに対する悔しさがこのような文句を生んでいるだけです。なんか言ってるよくらいに聞き流して欲しいです。ただ、ローカル環境で一から順々にアプリを作成したかったなーと。僕の現状のPyQの感想はこんな感じです。

以上ありがとうございました。

-プログラミング学習
-, ,

Copyright© s u p ? , 2019 All Rights Reserved.