【Django】django-allauth テストプログラム|ログイン、ログアウト、サインアップ、

ユーザーモデルクラス, django-allauthのテストプログラムを作ろうDjango

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

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

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

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

当記事では、

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

をご紹介します

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

早速見ていきましょう!

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

accounts > test.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」についての記事とし、さらなる機能の拡張をご紹介していきます

当ブログでは、日報アプリ開発を通じて、Webアプリを一から開発し公開するまでを初学者の方でもわかるようにと記事を連載しています

「Djangoでのアプリ開発を学びたい!」
「Djangoで開発したアプリをWebで公開するにはどうするの?」

という方は必見です!

【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!
タイトルとURLをコピーしました