django 学习(十七)—— 客户端测试
在Django中,django.test.Client类充当一个虚拟的网络浏览器,可以测试视图(views)与Django的应用程序以编程方式交互。
django.test.Client类可以做的事情如下:
- 模拟get和post请求,观察响应结果,从http(headers、status codes)到内容页面
- 检查重定向链(如果有的话),再进一步检查url和status code
- 用一个包括特定值模板context来测试一个request被django模版渲染
进入Django shell 模式:

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修饰,所以要想测试这两个功能,必须要先登录成功,并且需要构造登录用户的数据。所以你会看到在每个用例的开始先调用登录函数。
四、测试嘉宾管理
继续在.../sign/tests.py文件中编写嘉宾管理的测试用例
class GuestManageTest(TestCase): '''嘉宾管理''' def setUp(self) -> None: User.objects.create_user('admin', 'admin@mail.com', 'admin123456') Event.objects.create(id=4, name="xiaomi9", limit=2000, address='beijing', status=1, start_time='2020-8-10 12:30:00') Guest.objects.create(realname="alen", phone=18611001100, email='alen@mail.com', sign=0, event_id=4) self.login_user = {'username': 'admin', 'password': 'admin123456'} def test_event_mange_success(self): ''' 测试嘉宾信息: alen ''' response = self.client.post('/login_action/', data=self.login_user) response = self.client.post('/guest_manage/') self.assertEqual(response.status_code, 200) self.assertIn(b"alen", response.content) self.assertIn(b"18611001100", response.content) def test_guest_mange_sreach_success(self): ''' 测试嘉宾搜索 ''' response = self.client.post('/login_action/', data=self.login_user) response = self.client.post('/search_guest_name/', {"name": "alen"}) self.assertEqual(response.status_code, 200) self.assertIn(b"alen", response.content)
五、测试用户签到
最后,在.../sign/tests.py文件中编写用户签到的测试用例
class SignIndexActionTest(TestCase): ''' 发布会签到 ''' def setUp(self): User.objects.create_user('admin', 'admin@mail.com', 'admin123456') Event.objects.create(id=6, name="xiaomi5", limit=2000, address='beijing', status=1, start_time='2017-8-10 12:30:00') Event.objects.create(id=7, name="oneplus4", limit=2000, address='shenzhen', status=1, start_time='2017-6-10 12:30:00') Guest.objects.create(realname="alen", phone=18611001100, email='alen@mail.com', sign=0, event_id=6) Guest.objects.create(realname="una", phone=18611001101, email='una@mail.com', sign=1, event_id=7) self.login_user = {'username': 'admin', 'password': 'admin123456'} def test_sign_index_action_phone_null(self): ''' 手机号为空 ''' response = self.client.post('/login_action/', data=self.login_user) response = self.client.post('/sign_index_action/6/', {"phone": ""}) self.assertEqual(response.status_code, 200) self.assertIn(b"phone error.", response.content) def test_sign_index_action_phone_or_event_id_error(self): ''' 手机号或发布会id错误 ''' response = self.client.post('/login_action/', data=self.login_user) response = self.client.post('/sign_index_action/7/', {"phone": "18611001100"}) self.assertEqual(response.status_code, 200) self.assertIn(b"event id or phone error.", response.content) def test_sign_index_action_user_sign_has(self): ''' 用户已签到 ''' response = self.client.post('/login_action/', data=self.login_user) response = self.client.post('/sign_index_action/7/', {"phone": "18611001101"}) self.assertEqual(response.status_code, 200) self.assertIn(b"user has sign in.", response.content) def test_sign_index_action_sign_success(self): ''' 签到成功 ''' response = self.client.post('/login_action/', data=self.login_user) response = self.client.post('/sign_index_action/6/', {"phone": "18611001100"}) self.assertEqual(response.status_code, 200) self.assertIn(b"sign in success!", response.content)


浙公网安备 33010602011771号