(最終更新月:2021年12月)
「ログイン、ログアウト、サインアップ機能がエラーなく動作しているか調べたい!」
「ユーザー関連のテストプログラムのサンプルコードがほしい!」
というDjango初学者の方へ向けた記事となります
当記事では、
- ユーザー関連のテストプログラムのサンプルコード
をご紹介します
ユーザー関連テストがスムーズに進めるようお手伝いができれば幸いです
早速見ていきましょう!
✔YouTube解説動画
当記事の内容は動画を見ながら進めると、約15分程度で完了します。
動画ならではの情報も解説しているので、記事と一緒にご覧ください。
動画の概要欄には、単元ごとのコードを紹介しているgithubページも載せています。
コード紹介【コピペ可!】
accounts > tests.py
from django.test import TestCase, Client
from django.urls import reverse
from django.test.client import RequestFactory
from django.contrib.auth import get_user_model, login
User = get_user_model()
signup_url = reverse("account_signup")
login_url = reverse("account_login")
class UserTestCase(TestCase):
# signupページでユーザーを作成し、Eメール確認も済にする
def setUp(self):
self.email = "test@itc.tokyo"
self.password = "somepass"
self.res = self.client.post(signup_url, {"email": self.email, "password1": self.password, "password2": self.password})
self.user_obj = User.objects.first()
self.email_obj = self.user_obj.emailaddress_set.first()
self.email_obj.verified = True
self.email_obj.save()
# singupページからのレスポンスが正しいか?
def test_signup(self):
self.assertEqual(self.res.status_code, 302)
self.assertEqual(self.res.url, "/accounts/confirm-email/")
# ユーザーがきちんと作らているか?
def test_single_user(self):
counter = User.objects.count()
self.assertEqual(counter, 1)
self.assertEqual(self.user_obj.email, self.email)
#メールアドレスがverifiedになっているか?
def test_emailaddress_verified(self):
self.assertEqual(self.email_obj.verified, True)
# ログインページでのpostが正しく動作するか
def test_login_page(self):
data = {"email": self.email, "password": self.password}
response = self.client.post(login_url, data)
self.assertEqual(response.status_code, 200)
# ログアウトの際にログインページへリダイレクトされているか?
def test_logout(self):
res = self.client.get("/accounts/logout/")
self.assertEqual(res.status_code, 302)
self.assertEqual(res.url, login_url)
# verifiedされているユーザーの場合はきちんとログインできているか?
def test_verified_user_login(self):
c = Client()
res_bool = c.login(email=self.email, password=self.password)
self.assertEqual(res_bool, True)
# verifiedされていないユーザーの場合はログインできない?
def test_not_verified_user_login(self):
res = self.client.post(signup_url, {"email": "not-verifed@itc.tokyo", "password1": "somepassword", "password2": "somepassword"})
self.assertEqual(res.status_code, 302)
c = Client()
res_bool = c.login(email="not-verified@itc.tokyo", password="somepassword")
self.assertEqual(res_bool, False)
カンタンに解説!
setUp関数では、新規登録ページへのPOST送信を通じてユーザーを作成しています
# signupページでユーザーを作成し、Eメール確認も済にする
def setUp(self):
self.email = "test@itc.tokyo"
self.password = "somepass"
self.res = self.client.post(signup_url, {"email": self.email, "password1": self.password, "password2": self.password})
self.user_obj = User.objects.first()
self.email_obj = self.user_obj.emailaddress_set.first()
self.email_obj.verified = True
self.email_obj.save()
self.○○とすることで他の関数でも使用できるよう属性化しています
- リダイレクトの場合は、「302」ステータスコード
- 通常は、「200」ステータスコード
がそれぞれのページから返ってくることを確認し、正しく動作をするか調べています
#singupページからのレスポンスが正しいか?
def test_signup(self):
self.assertEqual(self.res.status_code, 302)
self.assertEqual(self.res.url, "/accounts/confirm-email/")
#ログインページでのpostが正しく動作するか
def test_login_page(self):
data = {"email": self.email, "password": self.password}
response = self.client.post(login_url, data)
self.assertEqual(response.status_code, 200)
リダイレクトの場合は、.urlプロパティでリダイレクト先のURLもチェックしています
Client()を使い、ログイン機能をチェックしています
# verifiedされているユーザーの場合はきちんとログインできているか?
def test_verified_user_login(self):
c = Client()
res_bool = c.login(email=self.email, password=self.password)
self.assertEqual(res_bool, True)
#verifiedされていないユーザーの場合はログインできない?
def test_not_verified_user_login(self):
res = self.client.post(signup_url, {"email": "not-verifed@itc.tokyo", "password1": "somepassword", "password2": "somepassword"
self.assertEqual(res.status_code, 302)
c = Client()
res_bool = c.login(email="not-verified@itc.tokyo", password="somepassword")
self.assertEqual(res_bool, False)
メールアドレスの「verified」が必須になりますので、ログインの可否を確認しています
c = Client()
c.login(ログインに必要な情報)
ではログイン成功時に「True」、そうでない時に「False」が返ります
まとめ
ユーザー関連のテストプログラムでは、
- ログイン、サインアップなどのページが正しく動作するか?
- ログイン機能が正しく動作するか?
を中心にチェックするプログラムを作りました
「こんなのはどう?」などアイディアがあればそれも足してより良い自動テストプログラムを今のうちに作ってしまうことをオススメします
さて、次回はユーザーモデルクラスを他のモデルクラスを関連付ける「ForeignKey」についての記事とし、さらなる機能の拡張をご紹介していきます