5_Django REST framework応用 ~Mockを用いたデータベース接続のテスト~

アイキャッチ画像 Django REST framework
とんぺい
とんぺい

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

師匠
師匠

とんぺいくん、こんばんは。前回は、PostgreSQLをDjango上で使用するための設定を行ったね。今回は「Mock」を用いたDBの接続テストを実装するよ。

とんぺい
とんぺい

Mock!!また新しい単語が出てきたブゥ!

承知しました!今日もよろしくお願いします!

注意

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

ソースコード

Mockテストとは

師匠
師匠

まずはテストにおけるMockの役割を説明しよう。Mockとはテストに必要な値を擬似的に設定することをいうよ。

とんぺい
とんぺい

うん?

そんなことしたら正しくテストができないんじゃないブゥか??

師匠
師匠

クラスの単体テストを行う際には、そのクラスが正しく動作するのかだけを確認すれば良いんだ。例えばクラスAのテストにクラスBが必要な場合、クラスBの動作をMockを用いて成功したと仮定してクラスAのテストを行うんだ。

とんぺい
とんぺい

ほぅほぅ。クラスの単体テストを行う際には、今テストを行いたいクラスの動作が正常に動くかだけを見れば良いんだブゥね!具体的にはどのような機能をMockするんだブゥか?

師匠
師匠

例えば、あるクラスPの中に外部からimportしたメール送信機能があるとするね。その際、自身が実装したクラスPの機能をテストする際に、メール送信機能のところをmockにするんだ。

とんぺい
とんぺい

ほぅほぅ!

単体テストを行う際は、あくまでそのクラスの中で自身が実装したところが正常かを見るんだブゥね!

師匠
師匠

その通り。外部からimportした機能に関しては、その機能を実装したところでテストを行うべきだ。テストが二重にならないようクラスの単体テストを行う際には、他のクラスに依存しないようにテストコードを書くことが大切だよ。

とんぺい
とんぺい

ふんふん!

テストにおけるMockの役割は理解できたブゥ!

丁寧な解説をありがとうだブゥ〜!

DB接続確認テストの実装

師匠
師匠

Mockについて理解できたところで、実際にDB接続確認のテストをMockを用いて実装してみよう。testフォルダの中に新しくtest_commands.pyを追加して以下のようにコードを記述するよ。

とんぺい
とんぺい

テストコードの実装が完了したブゥ!

mockのpatchというものを使って、仮想的に値を設定できるんだブゥね!

師匠
師匠

そうだね。では、以下のコマンドをterminalに入力してテストを実行してみよう。

とんぺい
とんぺい

wait_for_dbというよくわかんないコマンドがありますと怒られたブゥ!!これから、このwait_for_dbを実行していくんだブゥね!

DB接続コマンドの実装

師匠
師匠

カスタムコマンドを作成する際には公式の推奨どおりに、managementディレクトリを作成し、またその中にcommandsというディレクトリを作成しよう。

とんぺい
とんぺい

了解だブゥ!core/management/commandsというディレクトリ構成になるんだブゥね!各ディレクトリに_init_.pyを作成することも忘れちゃ駄目だブゥね!

師匠
師匠

では、commandsディレクトリの中にwait_for_db.pyを作成し以下のようにソースコードを記述し、terminalでテストを実行しよう。

とんぺい
とんぺい

今度は無事にテストが完了しているブゥ!

docker-compose.ymlの修正

師匠
師匠

テストが無事に完了したら、Djangoアプリが立ち上がる前に実際にこのコマンドを実行させるためのコードをdocker-compose.ymlに記述しよう。commandの箇所を修正するよ。

とんぺい
とんぺい

ほぅほぅ。runserverの前にwait_for_dbmigrateを置くことでDBの状態を新しくした状態で接続可能かの確認をしているんだブゥね!

師匠
師匠

その通り。では、terminalにdocker-compose upと入力してDjangoアプリを立ち上げてみよう。

とんぺい
とんぺい

無事にDBとDjangoアプリの起動ができたブゥ!

ブラウザで動作確認

師匠
師匠

DBとDjangoアプリの起動が確認できたら、実際にブラウザで動作確認をしよう。ブラウザでlocalhost:8080にアクセスするよ。

とんぺい
とんぺい

うん!Djangoアプリは問題なく動いているブゥ!

師匠
師匠

では、スーパーユーザーを作成して管理画面にログインしてみよう。terminalで以下のコマンドを入力すると、スーパーユーザーを作成できたね。

とんぺい
とんぺい

管理者権限を持ったユーザー(スーパーユーザー)の作成が完了したブゥ!

師匠
師匠

では、ブラウザでlocalhost:8080/adminにアクセスしてみよう。

とんぺい
とんぺい

無事に管理画面にたどり着くことができたブゥ!

師匠
師匠

それは良かった。

では、本日の講義のまとめに入ろう

まとめ

師匠
師匠

本日は新しく以下のことについて学習したね。

  • Mockとは
  • Mockを用いたテストコードの実装方法
  • カスタムコマンドの実装方法
とんぺい
とんぺい

うん!新しい事だらけで難しかったけど、しっかり復習して今後も保守性の高いコードが書けるように頑張るブゥ!

師匠
師匠

良い心意気だ。今回までの内容でDjangoアプリの実装を行う準備が完了したよ。次回からは、実際にAPIの機能を実装していくからお楽しみに。

とんぺい
とんぺい

それはすごく楽しみだブゥ!

今日はありがとうございました!また次回だブゥ〜

参考

コメント

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