【Django】allauthテストの書き方|ログイン、ログアウト

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2021年12月)

「ログイン、ログアウト、サインアップ機能がエラーなく動作しているか調べたい!」

「ユーザー関連のテストプログラムのサンプルコードがほしい!」

というDjango初学者の方へ向けた記事となります

当記事では、

  • ユーザー関連のテストプログラムのサンプルコード

をご紹介します

ユーザー関連テストがスムーズに進めるようお手伝いができれば幸いです

早速見ていきましょう!

✔YouTube解説動画

当記事の内容は動画を見ながら進めると、約15分程度で完了します。

動画ならではの情報も解説しているので、記事と一緒にご覧ください。

動画の概要欄には、単元ごとのコードを紹介しているgithubページも載せています。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

コード紹介【コピペ可!】

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」が返ります

まとめ

ユーザー関連のテストプログラムでは、

  1. ログイン、サインアップなどのページが正しく動作するか?
  2. ログイン機能が正しく動作するか?

を中心にチェックするプログラムを作りました

「こんなのはどう?」などアイディアがあればそれも足してより良い自動テストプログラムを今のうちに作ってしまうことをオススメします

さて、次回はユーザーモデルクラスを他のモデルクラスを関連付ける「ForeignKey」についての記事とし、さらなる機能の拡張をご紹介していきます

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