2_Django REST framework応用 ~テスト駆動開発~

Django REST framework
とんぺい
とんぺい

師匠〜、こんばんは〜!今日もDRF(Django Rest Framework)の応用編を勉強しに来たブゥ!

師匠
師匠

とんぺいくん、こんばんは。前回の講義では、CIツールであるTravis CIの導入を一緒に行ったね。今回は、テスト駆動開発(TDD)という開発手法の勉強をしていくよ。

とんぺい
とんぺい

テスト駆動開発(Test-Driven Development: TDD)!!また新しい用語が出てきたブゥ!!今日もわかりやすい解説をよろしくお願いします!

注意

  • ソースコードの中に「[」という文字列がありますが” [ “が文字化けしたものです。
  • 同じく「&&」とありますがこちらは「&&」となります。
  • 修正法が判明次第修正します。

ソースコード

テスト駆動開発とは

師匠
師匠

まずはテスト駆動開発の説明から始めよう。とんぺいくんはソフトウェア開発において、「テスト」とはどういう意味があるか知っているかな?

とんぺい
とんぺい

う〜ん、ソフトウェア開発におけるテストかぁ〜…

できあがったプログラミングがちゃんと動くか試すことを言うんだブゥか?

師匠
師匠

 その通りだ。テスト駆動開発は、プログラムの実装前にテストコードを書き、そのテストコードに適合するように実装とリファクタリングを進めていく開発方法を指すんだ。

とんぺい
とんぺい

ほぅほぅ。テスト駆動開発を行うことで、どんなメリットがあるんだブゥ?

師匠
師匠

テスト駆動開発のメリットは主に3つあるよ。

  • バグを早期に発見できる
  • 要件や使用を理解しやすくなる
  • 開発の心理的負担が軽減される
とんぺい
とんぺい

なるほどぉ〜!機能ごとに細かくテストを行うことで、バグを早期発見できて、開発者も自身のコードに問題ないことを確認しながら実装を進めていくことができるんだブゥね!

師匠
師匠

その通り。しかし、以下のようなデメリットも存在するよ。

  • 慣れるのに時間がかかる
  • テストコードの実装・保守に時間がかかる
とんぺい
とんぺい

確かに、どうすれば高品質なテストコードを書けるかわからないから、慣れるまでが大変そうだブゥ!チームメンバーへの事前の共有が大切だブゥね!

core app.の作成

師匠
師匠

それでは、ここからは実際にテスト駆動開発を用いながら、REST APIの作成を行っていくよ。VSCodeで、前回作成したDjangoのプロジェクトを開き、terminalに以下のように入力しよう。

とんぺい
とんぺい

これはDjangoプロジェクトの中にアプリを作成するコマンドだったブゥね!無事にcoreアプリがプロジェクト内に作成されたブゥ!

師匠
師匠

今後、modelはこのcoreアプリで管理するよ。それでは、coreアプリ内のファイル整理しよう。まずは、tests.pyviews.pyを削除しよう。

とんぺい
とんぺい

まずはtests.pyviews.pyを削除と…

うん。無事に削除できたブゥ!

師匠
師匠

では、次に新しくtestsディレクトリを作成しよう。そして、testsディレクトリの中に__init__.pyを作成するよ。今後はそのディレクトリの中に、テスト駆動開発で用いるテストコードを追加していくよ。

とんぺい
とんぺい

了解だブゥ!testsディレクトリを作成して、その中に__init__.pyを作成するっと…

無事に完了したブゥ〜!

師匠
師匠

coreが無事に作成できたら、appディレクトリのsettings.pycoreをDjangoプロジェクトに組み込むことを明示的に記述しよう。

とんぺい
とんぺい

settings.pycoreを追加したブゥ!

Custom User modelのテストコードを追加

師匠
師匠

では、早速Custom User modelのテストコードを書いていこう。testsディレクトリの中にtest_models.pyを作成するよ。

とんぺい
とんぺい

ほぅほぅ!テストコードというのはこういうふうに書くんだブゥね!テスト自体はDjangoにデフォルトで実装されているから、1から作らなくて楽だブゥ!

師匠
師匠

無事にテストコードを実装できたら、以下のコマンドをterminalで入力しよう。

とんぺい
とんぺい

ぶぶぅ!何やらエラーが表示されたブゥ!

え〜っと、「必要な引数が渡されていない」ということだブゥね!

師匠
師匠

その通りだ。この段階では、DjangoのデフォルトのUser modelを用いてテストが行われているため、上記のようなエラーが出力されるよ。このエラーが出力されないようにmodels.pyにCustom User modelを作成しよう。

とんぺい
とんぺい

無事にmodels.pyの編集が完了したブゥ!

このあたりは入門編でもやったから、コードの理解はバッチリだブゥ!

師匠
師匠

復習もしっかりできているようで安心したよ。では、models.pyの記述が完了したら、appディレクトリのsettings.pyに戻って、今回のDjangoプロジェクトで用いるUser modelを定義しよう。

とんぺい
とんぺい

このあたりも、特に問題なくできたブゥ〜!

師匠
師匠

よろしい。では、terminalで以下のコマンドを入力して、models.pyからmigrationファイルを作成しよう。

とんぺい
とんぺい

migrationsディレクトリに0001_initial.pyが無事に作成されたブゥ。

師匠
師匠

いい調子だ。では、migrationファイルの作成が無事に完了したら、再びterminalでテストを実行してみよう。

とんぺい
とんぺい

おっ!今度は、エラーが出力されなかったブゥ!

OKと出力されているからうまくいってそうだブゥね!

師匠
師匠

うん。無事にCustom User modelの実装はできたようだ。

このようにテスト駆動開発では、最初にテストコードを書き、エラーを出力して、そのエラーを解決できるように機能を実装していくよ。

とんぺい
とんぺい

なるほど!こういうふうに、機能単位で実装がしっかりできているのかを、細かくテストしながら開発を行っていくんだブゥね!

emailの正規化テスト

師匠
師匠

続いて、入力されたemailアドレスが正規化されるか確認するためのテストコードを作成するよ。test_models.pyに以下のコードを追加しよう。

とんぺい
とんぺい

ふんふん。コードを見た感じだと、emailのドメイン部分が小文字に変換されるかを確認しているテストだブぅね!

師匠
師匠

流石とんぺいくん、その通りだ。テストコードの実装ができたら、terminalで以下のコマンドを入力してテストを実行しよう。

とんぺい
とんぺい

おぉ!AssertionErrorでしっかりエラー内容が確認できるブゥね!今度は、このエラーが出力されないようにmodels.pyの修正を行っていくんだブゥね!

師匠
師匠

段々とテスト駆動開発の流れが理解できてきたようだね。

では、models.pyを以下のように修正して、もう一度テストを実行してみよう。

とんぺい
とんぺい

テストが無事に成功したみたいだブゥ!

emailの正規化は、normalize_email()を使用すればできるんだブゥね!

emailのバリデーションテスト

師匠
師匠

続いて、emailのバリデーション機能を実装しよう。この機能は、Userを作成する際に、create_user()にemailが渡されているかを確認する機能だよ。test_models.pyを編集してテストを実行しよう。

とんぺい
とんぺい

無事にエラーが出力されたブゥね!

今回はどんなエラーが出力されたんだブゥ?

師匠
師匠

今回は、emailが未入力の状態でcreate_user()が発火するとValueErrorが出力されることを想定されていたが、ValueErrorが出力されないのでテストが失敗しているんだ。下記のように修正し、もう一度テストを行おう。

とんぺい
とんぺい

無事にテストを通過したブゥ!

create_user()の中に、emailがない場合はraise ValueError()を発火させると書けばテストがうまくいくんだブゥね!

Super User(管理者)の作成

師匠
師匠

最後に、Super User(管理者)の作成機能を実装しよう。test_models.pyを開いて、テストコードを実装し、terminalでテストを実行するコマンドを入力しよう。

とんぺい
とんぺい

予想通りに、create_superuser()が無いよって言われているブゥ!次は、このエラーを解決するためにmodels.pycreate_superuser()を作成するんだブゥね!

師匠
師匠

その通りだ。では、とんぺいくんが言ったとおりにmodels.pycreate_superuser()を作成して、もう一度テストを実行してみよう。

とんぺい
とんぺい

OKだブゥ!

これでCustom User modelに関しては完璧だブゥね!

師匠
師匠

うん、無事にCustom User modelは作成できたね。

では最後にGithubに変更をpushしてTravis CIでも無事にテストが完了したか確認してみよう。

とんぺい
とんぺい

Travis CIでも大丈夫そうだブゥ!

コードの管理者はGithubにpushされたコードに対して、毎回自分でテストをしなくても良いんだブゥね!

師匠
師匠

そうだね。そのためのCIツールになるんだ。

いかに開発を効率良く行うか、使えるサービスを調査してどんどん自分の開発環境に取り込んでいこう。

まとめ

とんぺい
とんぺい

本日は以下のことを学んだブゥ!

  • テスト駆動開発とは
  • テスト駆動開発を用いたCustom User modelの実装
師匠
師匠

本日のハンズオンを通して、テスト駆動開発の流れが理解できたはずだ。次回以降もこの流れに沿って開発を行っていくので、しっかり復習しといてくれ。

とんぺい
とんぺい

了解だブゥ!今日もすごく楽しかったブゥ!

それではまた次回だブゥ!

参考

コメント

タイトルとURLをコピーしました