客户端测试(十五)

在Django中,django.test.Client类充当一个虚拟的网络浏览器,可以测试视图(views)与Django的应用程序以编程方式交互。
Django.test.Client类可以做的事情如下:
1.模拟“GET”和“POST”请求,观察响应结果,从HTTP(headers,status code)到页面内容。
2.检查重定向链(如果有的话),再每一步检查URL和status code。
3.用一个包括特定值的模板context来测试一个request被django模板渲染。

1.进入Django shell模式,使用setup_test_environment()用于测试前初始话测试环境。

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

2.测试首页,打开../FirstApp/tests.py文件,编写index视图的测试用例。

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模板响应。

3.测试登陆动作,打开../FirstApp/tests.py文件中编写登陆动作的测试用例。

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。

4.测试发布会管理,打开../FirstApp/tests.py文件,添加发布会管理视图的试用例。

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

嘉宾管理的测试,用户签到的测试等这些,都同上述介绍的一致,不再详细说明。

猜你喜欢

转载自blog.csdn.net/u012127765/article/details/80039710