Django单元测试二三事
零、前言
之前做过一个微信公众平台的开发者后台,功能比较简单,我个人也比较懒,所以就没有写测试。前段时间更新了一下版本,对代码进行了改动。结果昨天收到消息说后台出问题了,一个功能无法使用。我检查了半天,发现是上次更新时候和那个功能有关的数据库不小心删掉了。。。导致功能无法使用。
今天修复了错误之后,痛下决心决定写个测试,保证以后不会出这样弱智的问题。
一、用什么测试
我使用的框架是Django,所以第一反应就是去官网查文档。Django自身带测试功能,封装了Python的unittest,并且提供了连接其他测试框架的API。
简单看了一下介绍,发现Django自带功能已经够用了,就不用其他框架了。
二、迅速上手
来看官方的两个小例子:
第一个:
from django.test import TestCase
from myapp.models import Animal class AnimalTestCase(TestCase):
def setUp(self):
Animal.objects.create(name="lion", sound="roar")
Animal.objects.create(name="cat", sound="meow") def test_animals_can_speak(self):
"""Animals that can speak are correctly identified"""
lion = Animal.objects.get(name="lion")
cat = Animal.objects.get(name="cat")
self.assertEqual(lion.speak(), 'The lion says "roar"')
self.assertEqual(cat.speak(), 'The cat says "meow"')
第二个:
>>> from django.test import Client
>>> c = Client()
>>> response = c.post('/login/', {'username': 'john', 'password': 'smith'})
>>> response.status_code
200
>>> response = c.get('/customer/details/')
>>> response.content
'<!DOCTYPE html...'
OK,看出来什么名堂了吗?
其实就我个人的感觉来说,这两个小例子足以讲清楚Django测试的方法了。
第一个例子,是测试model的,可以创建model并调用model的方法。
第二个例子,是测试view的,可以模拟客户的请求,并对返回的结果进行判断。
几点注意事项:
- Django的测试不会影响项目自身数据库,而是新建一个数据库,并在测试结束之后删除这个数据库。所以请不要担心项目数据的安全。并且,因为是新建的数据库,所以需要在setUp方法中先填充数据,不然是什么都查询不到的哦。看了一眼输出,貌似提供了fixtures,也就是说可以把测试用的数据写入一个fixture文件,然后会在测试开始时把这个文件导入数据库中。不过由于我的测试很小,所以就手动创建数据了。
- 模拟用户的POST请求,默认是关闭CSRF的,如果想开启的话可以加参数。
csrf_client = Client(enforce_csrf_checks=True)
- 模拟请求要用相对路径
- 只能请求本项目,不能对其他网站进行访问。很遗憾。。。。如果能的话可以当做一个headless browser来用了
- 测试时候不用runserver,可以直接测试,加快速度
三、我遇到的问题
遇到了两个问题,简单描述一下。
第一个是文件命名问题,官方给的是test*.py,我就创建了一个test.py,结果死活用不了。后来发现app的文件夹里有一个tests.py,把测试代码放到这个里就可以用了。
第二个是中文问题。我的model需要一个中文的name域,但是用Vim编辑tests.py时候,输入中文就变成乱码,复制粘贴也不行。后来想到一个曲线救国的方法,既然不能写入中文那就写中文对应的unicode码,然后在字符串前面加一个u强制使用unicode编码,试了一下果然可以。
要想获得中文对应的unicode码,可以这样:
>>> print repr(u'哈哈')
u'\u54c8\u54c8'
然后把这个复制到tests.py文件里就可以了。
四、总结
我不喜欢长篇大论,也不喜欢复制粘贴,这篇文章主要是介绍一下Django的测试功能,并记录一下我遇到的问题。如果需要完整的介绍可以自己去官网查看,那比我写的好多了。
总的来说Django的测试功能还是不错的,尤其是模拟用户请求,相当给力。
Django单元测试二三事的更多相关文章
- Django单元测试(二)------测试工具
The test client test client是一个python类,来模拟一个简单的“哑”浏览器,允许你来测试你的view函数.你可以使用test client完成下列事情: 1.模拟&quo ...
- django单元测试
django 单元测试小结 django 测试 从前很少写单元测试了,特别是web应用.最近不知不觉喜欢起来这个事情了,发现单元测试对于软件的模块,正交性有很大促进作用,因为函数,模块写的不合 ...
- [Django] 单元测试小记
从前很少写单元测试了,特别是web应用.最近不知不觉喜欢起来这个事情了,发现单元测试对于软件的模块,正交性有很大促进作用,因为函数,模块写的不合理,单元测试写起来就麻烦的多呀.公司的项目一直都是用Dj ...
- Django框架(二)
一:Django项目创建步骤: 方式1:命令创建: 进入指定目录 C:\Users\bing>F: F:\>cd mysite F:\mysite>django-admin star ...
- Django单元测试 相关知识
前言 本文,旨在说明python Django如何编写单元测试,从“背景”,“测试要求”,“代码编写”,“如何运行”,“检验测试覆盖度” 这几个方面来说明附上django的官方文档单元测试章节=> ...
- Intellij Idea系列之导Jar包与编写单元测试(二)
Intellij Idea系列之导Jar包与编写单元测试(二) 一.初衷 对于很多的初学者来说,Intellij如何导入jar包感到很迷惑,甚至在网上搜过相关文章之后还是云里雾里,本博客通过图文并茂 ...
- Java并发编程二三事
Java并发编程二三事 转自我的Github 近日重新翻了一下<Java Concurrency in Practice>故以此文记之. 我觉得Java的并发可以从下面三个点去理解: * ...
- linux杂记(十二?) 关于账号和密码的二三事
关于密码的二三事 关于账号和密码的二三事 久了不更linux的相关知识,实在是懒得想内容点(纯粹是懒).那么今天就来谈谈关于linux密码和账号的重要概念. 假如你的主机遭到入侵,那么对方的第一个侵入 ...
- MySQL5.7关于密码二三事
MySQL5.7关于密码二三事 第一个:update user set password=password('root') where user='root' and host='localhost' ...
随机推荐
- 新手指导:教你如何查看识别hadoop是32位还是64位
问题导读: 1.从哪些地方可以识别hadoop是32位还是64位?2.hadoop本地库在什么位置? 来源:about云 本文链接:http://www.aboutyun.com/thread-127 ...
- 15个顶级Java多线程面试题及答案
1)现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉.这个多线程问题比 ...
- notepad++汉字突然横过来了
修改notepad++,汉字突然横过来了,如图, 百度了一下,原来是因为选择的字体"@微软雅黑"前面的@符号惹的祸,改成"微软雅黑"就没事了.
- Android问题-新电脑新系统WIN764位上安装简版本的XE8提示“Unit not found: 'System'”
问题现象:电脑太慢,重安新系统,所以要安DELPHIXE8,但安装过程中出现二次杀软件提示,我都选的是通过.但是XE8过程到最后的"Create AVD"时出现一个错误(具体是什么 ...
- DataSnap与FireDAC三层
相交资料: http://blog.csdn.net/shuaihj/article/details/6129131http://www.cnblogs.com/hnxxcxg/p/4007876.h ...
- maven系列(1)-maven的介绍与安装
maven的介绍 maven是大名鼎鼎的Apache下的java构建工具. Apache Maven is a software project management and comprehensio ...
- POJ 3660 Cow Contest (Floyd)
http://poj.org/problem?id=3660 题目大意:n头牛两两比赛经过m场比赛后能判断名次的有几头可转 化为路径问题,用Floyd将能够到达的路径标记为1,如果一个点能 够到达剩余 ...
- 通用FASTREPORT打印模块及接口方法
untFastReport.dfm文件: object frmFastReport: TfrmFastReport OldCreateOrder = False Height = 405 Width ...
- 了解discuz!
discuz!是什么 discuz!是由comsenz出品的,一款使用php编写,以MySQL作为数据存储的社区建站产品,是由戴志康大学时期创始开发,2001年6月发布,如今已被200万网站用做社区建 ...
- UVaLive 6627 First Date (转换时间)
题意:给定两个日期,两种不同算闰年的方法,导致日期不同,给定那个慢的,求你求了那个快的. 析:因为算闰年的方法不同,所以我们就要先从1582算到当前时间,算出差了多少天,再加上就好.注意跨月,跨年的情 ...