Django测试用例

Django默认Python的标准库unittest编写测试用例。Django的单元测试类django.test.TestCase 从unittest.TestCase继承而来。在创建Django应用时,默认已经生成了tests.py测试文件。

setUp()初始化方法创建了2条数据,通过下面的测试方法,查询插入的数据,断言数据是否正确。注意:setUp()初始化方法并不会真正向数据库插入数据,所以不用清理测试数据。

千万不能单独运行tests.py文件。Django执行测试文件的命令为:python manage.py test   

from django.test import TestCase

# Create your tests here.
from .models import Event,Guest class ModelsTest(TestCase): def setUp(self):
Event.objects.create(id = 1,name = 'oneplus 3 event',status = True,limit = 2000,
address = 'shenzhen',start_time = '2016-08-31 02:18:22')
Guest.objects.create(id = 1,event_id = 1,realname = 'alen',phone = '',
email = 'alen@mail.com',sign=False) def test_event_models(self):
result = Event.objects.get(id=1)
self.assertEqual(result.address,'shenzhen')
self.assertTrue(result.status,True) def test_guest_models(self):
result = Guest.objects.get(realname = 'alen')
self.assertEqual(result.phone, '')
self.assertFalse(result.sign, False)

运行测试用例:

运行sign应用下的所有用例:python manage.py test sign

运行sign应用下的tests.py测试文件:python manage.py test sign.tests

运行sign应用下的tests.py测试文件下的ModelTest测试类:python manage.py test sign.tests.ModelTest

使用-p参数模糊匹配测试文件:python manage.py test -p test*.py

客户端测试

django.test.client类充当一个虚拟的网络浏览器。可以测试视图views与django的程序来通过脚本交互。

django.test.client可以模拟GET、POST请求,从HTTP到页面内容。可以检查重定向,再检查每一步的URL和status_code,测试一个reuqest被django模板渲染。

class IndexPageTest(TestCase):
'''测试index登录首页''' def test_index_page_renders_index_teplate(self):
'''测试index视图'''
response = self.client.get('/index/') #通过client.get()方法请求/index/路径。
self.assertEqual(response.status_code,200)
# assertTemplateUsed 断言服务器是否给定的是index.html的相应。
self.assertTemplateUsed(response,'index.html')
from django.test import TestCase
from django.contrib.auth.models import User class LoginActionTest(TestCase):
'''测试登录动作'''
def setUp(self):
User.objects.create_user('admintest','admintest@mail.com','admintest123456') def test_add_admintest(self):
'''测试添加用户'''
user = User.objects.get(username = 'admintest')
self.assertEqual(user.username,'admintest')
self.assertEqual(user.email, 'admintest@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':'','password':'abc'}
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':'admintest','password':'admintest123456'}
response = self.client.post('/login_action/',data=test_data)
self.assertEqual(response.status_code,302)

上面的代码登录成功会自动跳转到特定页面,所以状态码是302重定向而不是200成功。

下面的代码中测试管理页面和搜索页面必须先登录。

class EventMangeTest(TestCase):
'''发布会管理'''
def setUp(self):
User.objects.create_user('admintest','admintest@mail.com','admintest123456')
Event.objects.create(id=1, name='xiaomiplus', status=True, limit=2000,
address='beijing', start_time='2016-08-31 02:18:22')
self.login_user = {'username':'admintest','password':'admintest123456'} def test_event_manage_success(self):
'''测试发布会:xiaomi i5'''
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'xiaomiplus',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':'xiaomiplus'})
self.assertEqual(response.status_code,200)
self.assertIn(b'xiaomiplus',response.content)
self.assertIn(b'beijing',response.content)

嘉宾页面由于需要有发布会和嘉宾的信息,所以不仅要构造和嘉宾的数据而且还需要有发布会的数据。一样要先登录构造登录数据。

class GuestMangeTest(TestCase):
'''嘉宾管理'''
def setUp(self):
User.objects.create_user('admintest','admintest@mail.com','admintest123456')
Event.objects.create(id=1, name='oneplus 3 event', status=True, limit=2000,
address='shenzhen', start_time='2016-08-31 02:18:22')
Guest.objects.create(id=1, event_id=1, realname='alen', phone='',
email='alen@mail.com', sign=False)
self.login_user = {'username':'admintest','password':'admintest123456'} def test_guest_manage_success(self):
'''测试发布会:xiaomi i5'''
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'',response.content) def test_guest_manage_search_success(self):
'''测试发布会搜索'''
response = self.client.post('/login_action/',data=self.login_user)
response = self.client.post('/search_phone/',{'phone':''})
self.assertEqual(response.status_code,200)
self.assertIn(b'alen',response.content)
self.assertIn(b'',response.content)
class SignIndexActionTest(TestCase):
'''发布会签到'''
def setUp(self):
User.objects.create_user('admintest','admintest@mail.com','admintest123456')
Event.objects.create(id=1, name='oneplus 3 event', status=True, limit=2000,
address='shenzhen', start_time='2016-08-31 02:18:22')
Event.objects.create(id=2, name='xiaomi plus', status=True, limit=2000,
address='beijing', start_time='2016-08-31 02:18:22')
Guest.objects.create(id=1, event_id=1, realname='alen', phone='',
email='alen@mail.com', sign=1)
Guest.objects.create(id=2, event_id=2, realname='judywang', phone='',
email='judywang@mail.com', sign=0)
self.login_user = {'username':'admintest','password':'admintest123456'} def test_sign_action_phone_null(self):
'''手机号为空'''
response = self.client.post('/login_action/',data=self.login_user)
response = self.client.post('/sign_index_action/1/',{'phone':''})
self.assertEqual(response.status_code,200)
self.assertIn(b'phone error',response.content) def test_sign_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/2/', {'phone':''})
self.assertEqual(response.status_code, 200)
self.assertIn(b'phone or event_id error', response.content) def test_sign_action_user_sign_has(self):
'''用户已签到'''
response = self.client.post('/login_action/', data=self.login_user)
response = self.client.post('/sign_index_action/1/', {'phone':''})
self.assertEqual(response.status_code, 200)
self.assertIn(b'user has sign in.', response.content) def test_sign_action_sign_success(self):
'''签到成功'''
response = self.client.post('/login_action/', data=self.login_user)
response = self.client.post('/sign_index_action/2/',{'phone':''})
self.assertEqual(response.status_code, 200)
self.assertIn(b'sign in success.', response.content)

Django 测试开发5 unittest测试用例的更多相关文章

  1. django测试开发-1.开始Hello django!

    用python开发出一个web页面的时候,需要找一个支持python语言的web框架.django框架有丰富的文档和学习资料,也是非常成熟的web开发框架,本篇写一个简单的“hello django! ...

  2. Django 测试开发4 Django 模板和分页器

    Django结合前端框架Bootstrap来开发web页面.pip install django-bootstrap3 在setting.py添加‘bootstrap3’. 继承模板. 在base页面 ...

  3. Django 测试开发2

    1.get方法和post方法 get方法  post方法 直接把method修改成post,报错如下,Django针对CSRF的保护措施是在生成的每个表单放置一个自动生成的令牌,通过这个令牌判断POS ...

  4. Django 测试开发1

    笔者用的版本的是django==1.8.2,这个版本的学习资料最多,文档最完整.首先创建项目:django-admin startproject 项目名. guest/__init__.py 一个空的 ...

  5. Django 测试开发3 数据模型models和admin管理工具

    参考:https://blog.csdn.net/weixin_44510615/article/details/89425412 1.Django模型字段常用类型: IntegerField : 整 ...

  6. python3的unittest中使用test suite(测试套件)执行指定测试用例

    示例代码 module.py class baidumodule(): def __init__(self,driver,): self.dr = driver #不能在类中再次导入webdriver ...

  7. 测试开发:Python+Django实现接口测试工具

    Python+Django接口自动化 引言: 最近被几个公司实习生整自闭了,没有基础,想学自动化又不知道怎么去学,没有方向没有头绪,说白了其实就是学习过程中没有成就感,所以学不下去.出于各种花里胡哨的 ...

  8. 测试开发中Django和Flask框架

    Python测试开发中Django和Flask框架 为了更好地阐述这个问题,我们把开发一个应用的过程进行类比,往往开发一个应用(web应用.系统应用)跟建造房子的过程一样,需要先打地基,搭好骨架,然后 ...

  9. 《自动化平台测试开发-Python测试开发实战》新书出版了

    首先 第一本书,当初在百度阅读初步写了个电子版,刚一上线不久即收到了数百位读者朋友阅读收藏购买,于是顺利成章就出版了纸质书. <软件自动化测试开发>认真看过的读者应该都知道,介绍的主要是自 ...

随机推荐

  1. 第六篇:Python函数进阶篇

    在了解完了 Python函数基础篇之后,本篇的存在其实是为了整合知识,由于该篇的知识是否杂乱,故大家可以通过点开点连接直接进入其详细介绍,该篇主要大致的介绍一下几个知识点:  一.Python的迭代器 ...

  2. window.addEventListener('error')监听页面是否更新版本

    因本司更新迭代的速度很快,有时候更改一个BUG就要马上更新版本,就会引起用户在应用当中,页面点击无反应,其实是打包的js和css的包名称更改,找不到以前的包的缘故.我现在用一个小方法,判断js或css ...

  3. extern "C" 分析 -转

    1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同.作为一种欲与C兼容的语言,C++保留了一部分过程式语 ...

  4. 虚拟dom应用

    vdom如何应用,核心api是什么 1.介绍snabbdom(开源社区用的多,vue2用的是他) 首先回顾下之前的vdom格式 真实的dom <body> <ul id=" ...

  5. Paper Reading:Deep Neural Networks for YouTube Recommendations

    论文:Deep Neural Networks for YouTube Recommendations 发表时间:2016 发表作者:(Google)Paul Covington, Jay Adams ...

  6. RF 中一条用例执行失败,终止其他用例执行

    1. 需求: 执行某个测试套时,某条用例执行失败,则该用例下其他关键字不在执行(RF自带功能): 但实际情况下是 某条用例执行失败后,下面的用例再执行就没有意义了: 想满足某条用例执行失败,下面的用例 ...

  7. Mybatis配置文件中#{ }和${ }的区别

    #{ }和${ }都可以从map中取到相对应的值, 但是 #{ }采取的是预编译的方式(PreparedStatement)来执行sql语句,有效防止了sql注入问题 select * from bo ...

  8. Python Django 版本对应表

  9. socket、端口、进程的关系

    本文属网络编程部分.socket的引入是为了解决不同计算机间进程间通信的问题. 端口是TCP/IP协议中的概念,描述的是TCP协议上的对应的应用,可以理解为基于TCP的系统服务,或者说系统进程!如下图 ...

  10. IAR平台移植TI OSAL到STC8A8K64S4A12单片机中

    玩过TI 的ZigBee或者BLE的人,都会接触到OSAL.OSAL是什么?OSAL英文全称:operating system abstraction layer(操作系统抽象层).基于OSAL的调度 ...