iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0
Modern Web

Flask系列 第 17

Day 17 實作測試 (3)

前言

今天要來看看最後的 admin_bp 的測試。一樣,我們不會做完全每個頁面的測試,就大概展示一下就好。

test_admin

話不多說,我們一樣一個一個測試來看,前面說過的就不再多贅述了。


from flask import url_for
from tests.helper import TestModel


class DashboardPageTest(TestModel):
    def setUp(self) -> None:
        super().setUp()
        self.route = url_for("admin.admin_dashboard_posts_page")

    def test_get_with_no_auth(self):
        res = self.get()
        self.assertEqual(res.status_code, 200)
        self.assertIn(b"Login", res.data)

    def test_get_with_user_auth(self):
        res = self.get(login="user")
        self.assertEqual(res.status_code, 403)

    def test_get_with_admin_auth(self):
        res = self.get(login="admin")
        self.assertEqual(res.status_code, 200)
        self.assertIn(b"Admin Dashboard", res.data)

這是管理員控制台的測試,但這是給貼文的 (admin_dashboard_posts_page),給留言的也同理 (admin_dashboard_comments_page),就不特別再寫了。當然它會有很多功能,但我們就先跳過。因為這是管理員的頁面,所以我們用 test_get_with_admin_auth 來測試一個用管理員登入之後再抓這個頁面,他的 assertIn 一樣是判斷 navbar。而如果只是一般使用者跑來這個頁面的話,他會回傳 403。在這邊他在沒有登入的狀況下抓這個控制台頁面他會回傳 200,這是因為我們到時候會把 401 處理掉,變成重新導向到登入頁面之類的。

接下來是使用者管理介面的測試。

class ManageUserPageTest(TestModel):
    def setUp(self) -> None:
        super().setUp()
        self.route = url_for("admin.manage_user_page")
        self.data_ok = {
            "username": "user3",
            "password": "password",
            "email": "user3@a.a",
            "is_admin": False,
        }
        self.data_bad_empty_field = {"username": "user3"}

    def test_get_with_no_auth(self):
        res = self.get()
        self.assertEqual(res.status_code, 200)
        self.assertIn(b"Login", res.data)

    def test_get_with_user_auth(self):
        res = self.get(login="user")
        self.assertEqual(res.status_code, 403)

    def test_get_with_admin_auth(self):
        res = self.get(login="admin")
        self.assertEqual(res.status_code, 200)
        self.assertIn(b"Admin Dashboard", res.data)

    def test_post_ok(self):
        res = self.post(login="admin", data=self.data_ok)
        self.assertEqual(res.status_code, 200)
        self.assertIn(b"Add user successfully.", res.data)

    def test_post_bad_empty_field(self):
        res = self.post(login="admin", data=self.data_bad_empty_field)
        self.assertEqual(res.status_code, 200)
        self.assertIn(b"This field is required.", res.data)

setUp 裡面我們放了一個 OK 的資料和一個有欄位留空的資料,這兩筆資料都是用來新增一個使用者的,我們之後會把一個新增使用者的表單放在這裡,讓管理員可以快速新增帳號。這個判斷空欄位一樣是 Flask-WTF 處理的,也當然可以自訂這個錯誤訊息。在測試 OK 的資料裡面,我們也加了一個訊息,這是到時候新增使用者成功時會 flash 出來的,同樣的道理,在登入、註冊等等頁面也都可以加入類似的訊息來判斷。

後記

到這邊為止,我們就把簡略的測試寫好了。當然有很多頁面根本沒測試到,也有很多功能也都沒有去特別處理,但這就是展示,如果需要的話可以自己想想覺得還缺甚麼,然後慢慢補齊。

我們在寫測試的最一開始有在 manage.py 裡面加入一個 flask test 的指令,現在全部寫完了,可以來跑跑看。沒有意外的話應該會噴出一堆 error (基本上都是路徑抓不到的問題) 跟 failed,我們最後的目標就是把他們修到好。


上一篇
Day 16 實作測試 (2)
下一篇
Day 18 實作表單 (1)
系列文
Flask30

尚未有邦友留言

立即登入留言