django 学习(十七)—— 客户端测试

在Django中,django.test.Client类充当一个虚拟的网络浏览器,可以测试视图(views)与Django的应用程序以编程方式交互。

django.test.Client类可以做的事情如下:

  1. 模拟get和post请求,观察响应结果,从http(headers、status codes)到内容页面
  2. 检查重定向链(如果有的话),再进一步检查url和status code
  3. 用一个包括特定值模板context来测试一个request被django模版渲染

进入Django shell 模式:

django 学习(十七)—— 客户端测试

 

 setup_test_environment()用于测试前初始化测试环境

 测试index视图。Client类提供了get()和post()方法模拟GET/POST请求。通过get()请求“/index/”路径,即为登录页面,打印HTTP返回的状态码为200,表示请求成功。

 

一、测试首页

打开.../sign/tests.py文件,编写index视图的测试用例

 

from django.test import TestCase
from sign.models import Event, Guest


# Create your tests here.
class IndexPageTest(TestCase):
    '''测试index登录首页'''
    def test_index_page_renders_index_template(self):
        response = self.client.get('/index/')
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'index.html')

 

虽然这里没有导入django.test.Client类,但self.client最终调用的依然是django.test.Client类的方法,通过client.get()方法请求“/index/”路径。status_code获取HTTP返回的状态码,使用assertEqual()断言状态码是否为200。

assertTemplateUsed()断言服务器是否用给定的是index.html模板响应。

 

二、测试登录动作

在.../sign/tests.py文件中编写登录动作的测试用例

 

class LoginActionTest(TestCase):
    '''测试登录动作'''
    def setUp(self) -> None:
        User.objects.create_user('admin', 'admin@mail.com','admin123456')  # 调用User.objects.create_user()创建登录用户数据

    def test_add_admin(self):
        '''测试添加用户'''
        user = User.objects.get(username='admin')
        self.assertEqual(user.username, 'admin')
        self.assertEqual(user.email, 'admin@mail.com')

    def test_login_action_username_password_null(self):
        '''用户密码为空'''
        test_data = {'username':"", 'password':""}
        response = self.client.post('/login_action/', data=test_data)
        self.assertEqual(response.status_code, 200)
        self.assertIn(b"username or password error!", response.content)

    def test_login_action_username_password_error(self):
        '''用户名密码错误'''
        test_data = {'username':"admin111", "password":"123456"}
        response = self.client.post('/login_action/', data=test_data)
        self.assertEqual(response.status_code, 200)
        self.assertIn(b"username or password error!", response.content)

    def test_login_action_success(self):
        '''登录成功'''
        test_data = {'username':'admin', 'password':'admin123456'}
        response = self.client.post('/login_action/', data=test_data)
        self.assertEqual(response.status_code, 302)

 

三、测试发布会管理

 

 

class EventManageTest(TestCase):
    '''发布会管理'''

    def setUp(self) -> None:
        User.objects.create_user('admin', 'admin@mail.com', 'admin123456')
        Event.objects.create(name="xiaomi5", limit=2000, address='beijing', status=1, start_time='2021-8-10 12:30:00')
        self.login_user = {'username': 'admin', 'password': 'admin123456'}

    def test_event_manage_success(self):
        '''测试发布会:xiaomi5'''
        response = self.client.post('/login_action/', data=self.login_user)
        response = self.client.post('/event_manage/')
        self.assertEqual(response.status_code, 200)
        self.assertIn(b"xiaomi5", response.content)
        self.assertIn(b"beijing", response.content)

    def test_event_manage_search_success(self):
        '''测试发布会搜索'''
        response = self.client.post('/login_action/', data=self.login_user)
        response = self.client.post('/search_name/', {"name": "xiaomi5"})
        self.assertEqual(response.status_code, 200)
        self.assertIn(b"xiaomi5", response.content)
        self.assertIn(b"beijing", response.content)

 

由于发布会管理event_manage和发布会名称搜索search_name两个视图函数被@login_required修饰,所以要想测试这两个功能,必须要先登录成功,并且需要构造登录用户的数据。所以你会看到在每个用例的开始先调用登录函数。

 

上一篇:django


下一篇:K8S网络插件-calico安装