在Django中,django.test.Client类充当一个虚拟的网络浏览器,可以测试视图(views)与Django的应用程序以编程方式交互。
Django.test.Client类可以做的事情如下:
1.模拟“GET”和“POST”请求,观察响应结果,从HTTP(headers,status code)到页面内容。
2.检查重定向链(如果有的话),再每一步检查URL和status code。
3.用一个包括特定值的模板context来测试一个request被django模板渲染。
测试index视图。Client类提供了get()和post()方法模拟GET/POST请求。通过get()请求“/index/”路径,即为登陆页面,打印HTTP返回的状态码为200,表示请求成功。
from django.test import TestCase
from FirstApp.models import Event, Guest
from django.contrib.auth.models import User
# Create your tests here.
# class ModelTest(TestCase):
# def setUp(self):
# Event.objects.create(id=1,name='tom1',status=True,limit=2000,
# address='beijing',start_time='2017-04-19 20:00:01')
# Guest.objects.create(id=1,event_id=1,realname='tom2',
# phone='13500001111',email='[email protected]',sign=False)
# def test_event_models(self):
# result=Event.objects.get(name='tom1')
# self.assertEqual(result.address, "beijing")
# self.assertTrue(result.status)
# def test_guest_models(self):
# result=Guest.objects.get(phone='13500001111')
# self.assertEqual(result.realname,"tom2")
# self.assertFalse(result.sign)
class IndexPagetest(TestCase):
"""测试index登陆首页"""
def test_index_page_renders_index_template(self):
'''测试index视图'''
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模板响应。
from django.contrib.auth.models import User
........
class LoginActionTest(TestCase):
"""测试登陆动作"""
def setUp(self):
User.objects.create_user('admin','[email protected]', 'admin123456')
def test_add_admin(self):
'''测试添加用户'''
user = User.objects.get(username='admin')
self.assertEqual(user.username, "admin")
self.assertEqual(user.email, "[email protected]")
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':'abc', 'password':'123'}
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)
在setUp()初始化中,调用User.objects.create_user()创建登陆用户数据。test_add_admin()用于测试添加的用户数据是否正确。在其他测试用例中,通过post()方法请求”/login_action/“路径测试登陆功能。test_data定义用户参数{‘username’:’admin’,’password’:’admin123456’}。assertIn()方法断言返回的HTML页面中是否包含”username or password error!”提示字符串。HTTP返回的状态码是302的原因是,当用户登陆验证成功后,通过HttpResponseRedirect()跳转到了”/event_manage/“路径,这是一个重定向,所以登陆成功之后的HTTP返回码是302。
from FirstApp.models import Event, Guest
.......
class EventManageTest(TestCase):
'''发布会管理'''
def setUp(self):
User.objects.create_user('admin', '[email protected]', 'admin123456')
Event.objects.create(name='xiaomi5',limit=2000,address='beijing',
status=1,start_time='2018-4-22 14:00: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修饰,所以想要测试这两个功能,必须要先登陆成功,并且需要构造登陆用户的数据。所以你会看到在每个用例的开始调用登陆函数。
嘉宾管理的测试,用户签到的测试等这些,都同上述介绍的一致,不再详细说明。