在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修饰,所以要想测试这两个功能,必须要先登录成功,并且需要构造登录用户的数据。所以你会看到在每个用例的开始先调用登录函数。