引言

  关于单元测试的基本知识这里不再讲述,简单一句话:单元测试是用一段代码去测试另一段代码。最常用的框架是unittest,这是python的单元测试框架,而django单元测试框架test.TestCase是继承了python的unittest.TestCase。

TestCase也是对unittest.TestCase进行了进一步的封装,省去了很多重复要写的代码,比如定义一个self.client、Email Service提供了方便的邮件发送的方法。

众所周知django模式是MTV模型,其中T是模板也就是HTML文件,对于HTML来说,没有可测的代码,基本上写死,即使有,并不是重要的逻辑代码。所以在进行单元测试的时候,重点针对M和V展开,也就是models和views。

  方式

单元测试进行的两种方式:

1.使用django框架自带的tests.py文件进行单元测试;
2.自定义创建test.py文件;
这两种是一样,只是运行时所执行目录不一样。

注:我这里只介绍第一种。

  模型测试

首先导入公共使用库:

from django.test import TestCase
from django_web.models import Event,Guest
from django.contrib.auth.models import User
# Create your tests here.
import datetime
get_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

测试模型

class DjangoWebModelTest(TestCase):
"""测试模型"""
def setUp(self) -> None:
Event.objects.create(id=1,name='小米5',status=True,address='深圳',limit=3,start_time=get_now)
Guest.objects.create(id=1,event_id=1,realname='老王',phone=15099925893,email='11@qq.com',sign=False) def test_event_model(self):
"""测试发布会表"""
result = Event.objects.get(name='小米5')
self.assertEqual(result.address,'深圳')
self.assertTrue(result.status) def test_guest_model(self):
"""测试嘉宾表"""
result = Guest.objects.get(phone='15099925893')
self.assertEqual(result.realname,'老王')
self.assertFalse(result.sign)

  视图函数测试

class IndexPageTest(TestCase):
"""测试index登录首页""" def test_index_page(self):
"""测试index视图"""
response = self.client.get('/index/')
self.assertEqual(response.status_code,200)
self.assertTemplateUsed(response,'index.html') class LoginAction(TestCase):
"""测试登录动作"""
def setUp(self) -> None:
"""创建用户数据:两种不同的方式创建用户"""
User.objects.create(username='admin')
User.objects.create_user(username='admin2',email='admin@11.com',password='123456') def test_add_admin(self):
"""添加用户admin测试"""
user = User.objects.get(username='admin')
self.assertEqual(user.username,'admin') def test_add_admin2(self):
"""添加用户admin2测试"""
user = User.objects.get(username='admin2')
self.assertEqual(user.username,'admin2')
self.assertEqual(user.email,'admin@11.com') def test_login_username_password_null(self):
"""用户名密码为空"""
test_data = {'username':'','password':''}
response = self.client.post('/login_action/',data=test_data)
self.assertEqual(response.status_code,302) def test_login_username_password_error(self):
"""用户名密码错误"""
test_data = {'username':'test','password':'123456'}
response = self.client.post('/login_action/',data=test_data)
self.assertEqual(response.status_code,302) def test_login_action_success(self):
"""登录成功"""
test_data = {'username':'admin2','password':'123456'}
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@qq.com','123456')
Event.objects.create(name='小米3',limit=3,address='深圳',status=True,start_time=get_now)
self.login_user = {'username':'admin','password':'123456'}
#预先登录
self.client.post('/login_action/', data=self.login_user) def test_add_event_data(self):
""" 测试添加发布会:小米3 """
event = Event.objects.get(name="小米3")
self.assertEqual(event.address, "深圳") def test_event_success(self):
"""测试发布会:小米3"""
response = self.client.post('/event_manager/')
self.assertEqual(response.status_code,200)
self.assertIn("小米3".encode('utf-8'),response.content) def test_event_search_success(self):
"""测试发布会搜索"""
response = self.client.post('/search_name/')
self.assertEqual(response.status_code,200)
self.assertIn('小米3'.encode('UTF-8'),response.content) class GuestManageTest(TestCase):
"""嘉宾管理"""
def setUp(self) -> None:
User.objects.create_user('admin','admin@qq.com','123456')
Event.objects.create(id=1,name='小米2',limit=3,address='深圳',status=True,start_time=get_now)
Guest.objects.create(realname='小李子',phone=15099925798,email='11@qq.com',sign=0,event_id=1)
self.login_user = {'username':'admin','password':'123456'}
#预先登录
self.client.post('/login_action/',data=self.login_user) def test_add_guest(self):
"""测试添加嘉宾:小李子"""
guest =Guest.objects.get(realname='小李子')
self.assertEqual(guest.realname,'小李子')
self.assertEqual(guest.phone,'15099925798')
self.assertEqual(guest.email,'11@qq.com')
self.assertFalse(guest.sign) def test_guest_success(self):
"""测试嘉宾列表:小李子"""
response = self.client.post('/guest_manager/')
self.assertEqual(response.status_code,200)
self.assertIn('小李子'.encode('UTF-8'),response.content)
self.assertIn('15099925798'.encode('utf-8'),response.content) def test_guest_search_success(self):
"""测试嘉宾搜索"""
response = self.client.post('/search_phone/')
self.assertEqual(response.status_code,200)
self.assertIn('小李子'.encode('utf-8'),response.content)
self.assertIn('15099925798'.encode('utf-8'),response.content) class SignIndexActionTest(TestCase):
"""发布会签到"""
def setUp(self) -> None:
User.objects.create_user('admin','admin@qq.com','123456')
Event.objects.create(id=1, name='小米1', limit=3, address='广州', status=True, start_time=get_now)
Event.objects.create(id=2, name='小米9', limit=3, address='北京', status=True, start_time=get_now)
Guest.objects.create(realname='老张', phone=15099925798, email='11@qq.com', sign=0, event_id=1) #未签到
Guest.objects.create(realname='老周', phone=15099925700, email='22@qq.com', sign=1, event_id=2) #未签到
self.login_user = {'username':'admin','password':'123456'}
self.client.post('/login_action/',data=self.login_user) def test_phone_null(self):
"""测试手机号码为空"""
response =self.client.post('/sign_index_action/1/',{"phone":""})
self.assertEqual(response.status_code,200)
self.assertIn('请输入电话号码.'.encode('utf-8'),response.content) def test_phone_error(self):
"""手机号码错误"""
response = self.client.post('/sign_index_action/2/',{"phone":"15099925732398"})
self.assertEqual(response.status_code,200)
self.assertIn("电话号码错误.".encode('UTF-8'),response.content) def test_phone_or_eventid_error(self):
"""电话号码所属嘉宾不属于该发布会"""
response = self.client.post('/sign_index_action/2/',{"phone":"15099925798"})
self.assertEqual(response.status_code,200)
self.assertIn("电话号码所属嘉宾不属于该发布会.".encode('UTF-8'),response.content) def test_already_sign(self):
"""用户已签到"""
response = self.client.post('/sign_index_action/2/',{"phone":"15099925700"})
self.assertEqual(response.status_code,200)
self.assertIn("您已经签到!.".encode('utf-8'),response.content) def test_sign_success(self):
"""签到成功"""
response = self.client.post('/sign_index_action/1/',{"phone":"15099925798"})
self.assertEqual(response.status_code,200)
self.assertIn("签到成功!".encode('utf-8'),response.content)

  运行单元测试代码

"""
运行所有用例:
python3 manage.py test 运行django_web应用下的所有用例:
python3 manage.py test django_web 运行sign应用下的tests.py文件用例:
python3 manage.py test django_web.tests 运行django_web应用下的tests.py文件中的 DjangoWebModelTest 测试类:
python3 manage.py test django_web.tests.DjangoWebModelTest 运行django_web应用下DjangoWebModelTest 测试类中的测试方法(用例):
python3 manage.py test django_web.tests.DjangoWebModelTest.test_event_model 模糊匹配测试文件
运行python3 manage.py test django_web -p test*.py
...... """

  执行结果

D:\my_django_guest>python3 manage.py test django_web
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
...................
----------------------------------------------------------------------
Ran 19 tests in 3.080s OK
Destroying test database for alias 'default'...

  

Django 单元测试笔记的更多相关文章

  1. django单元测试

        django 单元测试小结 django 测试 从前很少写单元测试了,特别是web应用.最近不知不觉喜欢起来这个事情了,发现单元测试对于软件的模块,正交性有很大促进作用,因为函数,模块写的不合 ...

  2. Django 学习笔记之四 QuerySet常用方法

    QuerySet是一个可遍历结构,它本质上是一个给定的模型的对象列表,是有序的. 1.建立模型: 2.数据文件(test.txt) 3.文件数据入库(默认的sqlite3) 入库之前执行 数据库同步命 ...

  3. Django 学习笔记之三 数据库输入数据

    假设建立了django_blog项目,建立blog的app ,在models.py里面增加了Blog类,同步数据库,并且建立了对应的表.具体的参照Django 学习笔记之二的相关命令. 那么这篇主要介 ...

  4. Django学习笔记(五)—— 表单

    疯狂的暑假学习之  Django学习笔记(五)-- 表单 參考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path         ...

  5. Django学习笔记(三)—— 型号 model

    疯狂暑期学习 Django学习笔记(三)-- 型号 model 參考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'defaul ...

  6. Django入门笔记

    Django入门笔记 **文档包含Django安装包.学习的笔记.代码等 安装 Django参考附件,只需要把附件拷贝到你需要的目录就行.Django是1.8.16版本 Python:在附件中,其中有 ...

  7. Django 学习笔记(二)

    Django 第一个 Hello World 项目 经过上一篇的安装,我们已经拥有了Django 框架 1.选择项目默认存放的地址 默认地址是C:\Users\Lee,也就是进入cmd控制台的地址,创 ...

  8. Django 学习笔记(五)模板标签

    关于Django模板标签官方网址https://docs.djangoproject.com/en/1.11/ref/templates/builtins/ 1.IF标签 Hello World/vi ...

  9. Django 学习笔记(四)模板变量

    关于Django模板变量官方网址:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/ 1.传入普通变量 在hello/Hell ...

随机推荐

  1. php 基础系列之 php快速入门

    ·插补操作 将简单变量写入一个由双引号引用的字符串中,就叫插补操作.例如: $test = 'xx'; echo "你好:$test"; 注意:插补操作只是双引号引用字符串的特性. ...

  2. 阿里云ECS服务器CentOS7配置vsftps及其问题解决

    前言 之前只在虚拟机中配过FTP服务器,今天买了云服务器,发现安装vsftpd后就是连不上,通过搜索了很多资料,最后找到了解决办法,系统是CentOS7,服务器类型是ECS 阿里云安全组配置 首先进入 ...

  3. bbs论坛登录相关功能(2)

    昨天把注册功能页面做出来,接下来就是登录页面 登录功能: 1,用户账号,密码后台效验,错误信息在登录按钮右边显示 2.验证码,根据图片生成,点击图片刷新产生新的验证码 修改密码 注册 先把前端页面lo ...

  4. 1015 Reversible Primes

    1. 题目 2. 抽象建模 无 3. 方法 无 4. 注意点 素数判断(1不是素数) 数值的倒转 5. 代码 #include<stdio.h> #include<math.h> ...

  5. Rabbitmq consumer端超时报错

    0x01 应用场景: 使用rabbitmq的exchange模式,type为direct,消费端不需要向生产端返回结果no_ack=True 其中某个consumer任务耗时较长(5min以上),结果 ...

  6. 【做题笔记】洛谷P1036 选数

    作为一个 DFS 初学者这题真的做得很惨...其实窝学 DFS 一年多了,然后一开始就学不会最近被图论和数据结构打自闭后才准备好好学一学233 一开始,直接套框架,于是就有 #include < ...

  7. centos7也支持service命令启动服务吗,对于centos7 中的systemctl和旧的service命令的区别和联系

    一.centos7也支持service命令启动服务吗 CentOS 7.0中一个最主要的改变,就是切换到了systemd.它用于替代红帽企业版Linux前任版本中的SysV和Upstart,对系统和服 ...

  8. CDH安装时,无法纳管全部的节点的一个bug

      问题描述: 使用CDH 5.2版本安装时,agent节点有12个.按照安装说明,在各个节点启动cm-agent之后,发现只有6个节点能被纳管.其它的节点总是无法加入纳管中. 在确认防火墙已经关闭后 ...

  9. hadoop SecondNamenode详解

    SecondNamenode名字看起来很象是对第二个Namenode,要么与Namenode一样同时对外提供服务,要么相当于Namenode的HA. 真正的了解了SecondNamenode以后,才发 ...

  10. Mysq的安装

    1.安装包下载 2.安装教程 (1)配置环境变量 (2)生成data文件 (3)安装MySQL (4)启动服务 (5)登录MySQL (6)查询用户密码 (7)设置修改用户密码 (8)退出 1.安装包 ...