[Django] 单元测试小记
从前很少写单元测试了,特别是web应用。最近不知不觉喜欢起来这个事情了,发现单元测试对于软件的模块,正交性有很大促进作用,因为函数,模块写的不合理,单元测试写起来就麻烦的多呀。公司的项目一直都是用Django,所以写点django单元测试的小总结,记录为主,备查。
测试的场景
框架Django1.8 测试工具 unittest, 要记得给test设置一个独特的settings。
测试请求 也就是测试整个view部分 官方案例 其中可能会遇到登录,或者时session怎么模拟的问题
测试带有orm的模块
- 需要mock的测试,比较多的情况是有第三方API调用, 发邮件,发短信这种
unittest提供的断言种类挺多,但是经常用的也就几个 self.assertContains, self.assertEqual, self.assertTrue
顺便提下有用的选项(我这里是单独给测试写了一个settings), 为了提高测试速度,可以把用不到的中间件,installed_apps之类的多余配置给去掉。
测试全部用例
python manage.py test --setting settings_test
测试某个APP
python manage.py test appname --setting settings_test
测试某个app下的TeseCase类
python manage.py test alarm.tests.ModelTestCase --setting settings_test
-v {1,2,3} 数字越大,显示的输出越详细,测试的日志信息
python manage.py test --setting settings_test -v3
其他的选项请查看 --help
python manage.py test --help
用请求测试 views函数
DJANGO中提供了Client类来模拟http请求,可以模拟不同的method,然后就是请求参数的模拟,用起来很方面。
#coding:utf-8
from django.test import TestCase, Client
from sendviews import *
from core.tests import create_user
class SendviewsTestCase(TestCase):
def setUp(self):
self.user = create_user()
self.device = Device(hostname="CN-BJ-0000-00",
mac="ff:ff:ff:ff:ff:ff", user=self.user).save()
def test_creat_sms(self):
c = Client()
rep = c.post("/acquireportal/createsms",{"phone": "13988902345",
"ssid": "erya",
"dmac": "ff:ff:ff:ff:ff:ff"})
# 测试http请求的返回码是否正确
self.assertEqual(rep.status_code, 200)
# 测试response的内容是否包含字符串
self.assertContains(rep, "OK")
# 测试response的内容是否包含字符串 方法二
self.assertTrue('OK' in rep.content)
- HTML 文本测试,使用 constants 来判断并不是个好的选择,可以用render之后的字符串对比。
对于需要登陆的view,有client也比较容易操作,还有一些特殊的session的检测等, 我这里做了一个简单的封装
from django.test import Client
def init_client(user):
client = Client()
client.login(username=user.username, password="lzz")
s = client.session
s['cur_user_id'] = user.id
s.save()
return client
带有mock的测试
对模块中的方法mock或者是对一个对象中的方法进行mock。真对测试函数中一些无法直接测试的函数设置默认的返回值, py3标准库中已经有了mock模块,py2需要自己安装, 推荐教程 使用Pyhton Mock进行单元测试1。 下面是个实际的代码片段。
import mock
from django.test import TestCase
from core.models import Tenant
from alarm.models import *
from .controler import TenantAlarm
class ModelTestCase(TestCase):
def setUp(self):
self.tenant = Tenant.objects.create(domainname="erya", comname=u"尔雅")
@mock.patch.object(TenantAlarm, "sendAlarm")
def test_record_alarm(self, mock_method):
# record_alarm 这个中会调用sendAlarm方法
mock_method.return_value = None
content = "ccccc"
atype = 0
rec_uid = 0
Alarm().record_alarm(content=content, atype=0,
rec_tid=self.tenant.id)
class TenantAlarmTestCase(TestCase):
def setUp(self):
self.tenant = Tenant.objects.create(domainname="erya", comname=u"尔雅")
@mock.patch.object(TenantAlarm, "sendSMS", return_value=None)
@mock.patch.object(TenantAlarm, "sendEmail", return_value=None)
def test_send_alarm(self, method1, method2):
content = u"报警了"
ta = TenantAlarm(self.tenant.id, content, {u'SMS': 0, u'EMAIL': 0})
ta.sendAlarm()
@mock.patch('util.sendsms_com.send', return_value=1)
def test_sendsms(self, send):
ta = TenantAlarm(self.tenant.id, self.content, {u'SMS': 0, u'EMAIL': 0})
ta.sendSMS()
self.assertEqual(0, Account.objects.get(tenant=self.tenant).sms_num)
self.account.sms_num = 100
self.account.save()
ta.sendSMS()
self.assertEqual(99, Account.objects.get(tenant=self.tenant).sms_num)
coverage
coverage是一个检查单元测试覆盖率的工具,django的文档中也有简要的说明coverage的集成 文档地址
#测试并收集测试信息
coverage run --source='.' manage.py test --setting mandela.settings_test
#查看测试结果
coverage report -m
Name Stmts Miss Cover Missing
----------------------------------------------------------------------------------------
acquireportal/__init__.py 0 0 100%
acquireportal/controler.py 65 47 28% 22-56, 60-71, 76-79
acquireportal/migrations/0001_initial.py 6 0 100%
acquireportal/migrations/0002_auto_20160622_1059.py 6 0 100%
acquireportal/migrations/0003_auto_20160622_1100.py 5 0 100%
....
----------------------------------------------------------------------------------------
TOTAL 8013 5858 27%
覆盖率挺低的
[Django] 单元测试小记的更多相关文章
- django单元测试
django 单元测试小结 django 测试 从前很少写单元测试了,特别是web应用.最近不知不觉喜欢起来这个事情了,发现单元测试对于软件的模块,正交性有很大促进作用,因为函数,模块写的不合 ...
- 如何进行Django单元测试
如何进行Django单元测试 Django的单元测试使用python的unittest模块,这个模块使用基于类的方法来定义测试.类名为django.test.TestCase,继承于python的un ...
- Django 单元测试
mock 测试 mock 是辅助单元测试的模块,用于测试不方便调用的别人的接口.举个简单的例子,比如说,我们测试django 写的微信登录接口,正常流程下,我们需要前端拉起授权窗口,获取jscode或 ...
- Django单元测试 相关知识
前言 本文,旨在说明python Django如何编写单元测试,从“背景”,“测试要求”,“代码编写”,“如何运行”,“检验测试覆盖度” 这几个方面来说明附上django的官方文档单元测试章节=> ...
- Django 单元测试笔记
引言 关于单元测试的基本知识这里不再讲述,简单一句话:单元测试是用一段代码去测试另一段代码.最常用的框架是unittest,这是python的单元测试框架,而django单元测试框架test.Test ...
- Django单元测试(一)
Django测试框架非常简单,首选方法是使用python标准库中的unittest模块. Writing tests Django的单元测试使用python的unittest模块,这个模块使用基于类的 ...
- django 单元测试错误总结
TestCase django自带有一个TestCase模块来进行测试,我们可以参考官网 来写单元测试的代码.我这里主要是总结一些错误. 用户无法登陆 我们有些api登录后才可以进行测试,所以我们可以 ...
- django 单元测试小结
测试的场景 框架Django1.8 测试工具 unittest, 要记得给test设置一个独特的settings. 测试请求 也就是测试整个view部分 官方案例 其中可能会遇到登录,或者时sessi ...
- Django单元测试中Fixtures用法
在使用单元测试时,有时候需要测试数据库中有数据,这时我们可以使用Django的Fixtures来生成测试数据. 基础配置 在settings.py 中配置如下内容: FIXTURE_DIRS = (' ...
随机推荐
- JavaScript 调试
在编写 JavaScript 时,如果没有调试工具将是一件很痛苦的事情. JavaScript 调试 没有调试工具是很难去编写 JavaScript 程序的. 你的代码可能包含语法错误,逻辑错误,如果 ...
- Python3 输入和输出
输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数.(第三种方式是使用文件对象的 write() 方法; 标准输出文件可以用 sys.stdout 引用.) 如果你希望输 ...
- Jmeter(一)_环境部署
简介: Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试CS/BS的软件.它可以用来测试静态和动态资源的性能,可用于模拟大量负载来测试一台服务器,网络或者对象的健壮性或者分 ...
- 【机器学习】从SVM到SVR
注:最近在工作中,高频率的接触到了SVM模型,而且还有使用SVM模型做回归的情况,即SVR.另外考虑到自己从第一次知道这个模型到现在也差不多两年时间了,从最开始的腾云驾雾到现在有了一点直观的认识,花费 ...
- Java9相关资料(JShell简易教程等)
资源 Java9官网下载地址 Java9官方教程 JShell(Java Shell) 参考资料: JShell User Guide Java9先睹为快:JShell动手实践 以下大部分内容均来自该 ...
- android M Launcher之LauncherModel (三)
通过前两篇的分析,我们已经知道了LauncherModel的初始化及工作流程,如果您还不熟悉的话请看前两篇博文 android M Launcher之LauncherModel (一) android ...
- springMVC源码分析--拦截器HandlerExecutionChain(三)
上一篇博客springMVC源码分析--HandlerInterceptor拦截器调用过程(二)中我们介绍了HandlerInterceptor的执行调用地方,最终HandlerInterceptor ...
- 自制Linux 终端 锁屏防窃助手
很多时候我们不能一直守护在自己的电脑旁边,而且有些文件并不想让别人知道.那么这时候来个锁屏,是再合适不过的了.今天分享一个自制的锁屏工具,如下. 准备 操作系统 : 我这里是ElementaryOS虚 ...
- 11 吐司 Toast 代码案例
package com.qf.day11_toast_demo05; import android.app.Activity; import android.graphics.Color; impor ...
- JDK的安装以及配置
JDK的安装以及配置 JDK(Java Development Kit),顾名思义,是 Java 语言的软件开发工具包(SDK). Android发开使用Java语言,所以装JDK是Android开发 ...