从前很少写单元测试了,特别是web应用。最近不知不觉喜欢起来这个事情了,发现单元测试对于软件的模块,正交性有很大促进作用,因为函数,模块写的不合理,单元测试写起来就麻烦的多呀。公司的项目一直都是用Django,所以写点django单元测试的小总结,记录为主,备查。

测试的场景

框架Django1.8 测试工具 unittest, 要记得给test设置一个独特的settings。

  1. 测试请求 也就是测试整个view部分 官方案例 其中可能会遇到登录,或者时session怎么模拟的问题

  2. 测试带有orm的模块

  3. 需要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] 单元测试小记的更多相关文章

  1. django单元测试

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

  2. 如何进行Django单元测试

    如何进行Django单元测试 Django的单元测试使用python的unittest模块,这个模块使用基于类的方法来定义测试.类名为django.test.TestCase,继承于python的un ...

  3. Django 单元测试

    mock 测试 mock 是辅助单元测试的模块,用于测试不方便调用的别人的接口.举个简单的例子,比如说,我们测试django 写的微信登录接口,正常流程下,我们需要前端拉起授权窗口,获取jscode或 ...

  4. Django单元测试 相关知识

    前言 本文,旨在说明python Django如何编写单元测试,从“背景”,“测试要求”,“代码编写”,“如何运行”,“检验测试覆盖度” 这几个方面来说明附上django的官方文档单元测试章节=> ...

  5. Django 单元测试笔记

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

  6. Django单元测试(一)

    Django测试框架非常简单,首选方法是使用python标准库中的unittest模块. Writing tests Django的单元测试使用python的unittest模块,这个模块使用基于类的 ...

  7. django 单元测试错误总结

    TestCase django自带有一个TestCase模块来进行测试,我们可以参考官网 来写单元测试的代码.我这里主要是总结一些错误. 用户无法登陆 我们有些api登录后才可以进行测试,所以我们可以 ...

  8. django 单元测试小结

    测试的场景 框架Django1.8 测试工具 unittest, 要记得给test设置一个独特的settings. 测试请求 也就是测试整个view部分 官方案例 其中可能会遇到登录,或者时sessi ...

  9. Django单元测试中Fixtures用法

    在使用单元测试时,有时候需要测试数据库中有数据,这时我们可以使用Django的Fixtures来生成测试数据. 基础配置 在settings.py 中配置如下内容: FIXTURE_DIRS = (' ...

随机推荐

  1. leetcode刷题笔记326 3的幂

    题目描述: 给出一个整数,写一个函数来确定这个数是不是3的一个幂. 后续挑战:你能不使用循环或者递归完成本题吗? 题目分析: 既然不使用循环或者递归,那我可要抖机灵了 如果某个数n为3的幂 ,则k=l ...

  2. Linux 虚存 linux2.6内核特性

    一.大型页面的支持 当代计算机体系结构大都支持多种页面大小,例如,IA-32体系结构支持4KB或4MB的页面, Linux操作系统只是将大型页面用于映射实际的内核映像.大型页面的使用主要是为了改进高性 ...

  3. 安卓7.1 新特性Shortcut

    介绍 Shortcut 是谷歌在API25提出来的 类似苹果3D touch 但是没有压力感应.在安卓中完全就是长按. 来看下效果吧: 是不是很赞? 那么请随本文一起学习吧 更新 新建项目 在你项目下 ...

  4. JVM性能参数调优实践,不会执行Full GC,网站无停滞

    原文来自:http://bbs.csdn.net/topics/310110257 本文只做整理记录,供个人学习. 1 JVM参数调优是个很头痛的问题,设置的不好,JVM不断执行Full GC,导致整 ...

  5. Android studio 中引用jar的其实是Maven?(二)

    上一篇:Android studio 中引用jar的其实是Maven?(一) 搭建maven仓库: 去了解一个新的事物的时候,最好的方式就是去使用它.例如去了解一座城市的时候,最好的方式就是乘坐公共交 ...

  6. 有一台机器,上面有m个储存空间。然后有n个请求,第i个请求计算时需要占 R[i]个空间,储存计算结果则需要占据O[i]个空间(据O[i]个空间(其中O[i]<R[i])。问怎么安排这n个请求的顺序,使

    有一台机器,上面有m个储存空间.然后有n个请求,第i个请求计算时需要占 R[i]个空间,储存计算结果则需要占据O[i]个空间(据O[i]个空间(其中O[i]<R[i]).问怎么安排这n个请求的顺 ...

  7. Android 网络图片加载之cude 框架

    偶然发现了这个框架,阿里图片加载用的这个框架.非常简单操作步骤. 1.首先下载软件包,直接搜Cube ImageLoader 这个. 2.加入jar文件 3.使用前的配置: public class ...

  8. Nginx的负载均衡 - 加权轮询 (Weighted Round Robin) 上篇

    Nginx版本:1.9.1 我的博客:http://blog.csdn.net/zhangskd 算法介绍 来看一个简单的Nginx负载均衡配置. http { upstream cluster { ...

  9. #VSTS日志# Xamarin构建支持和一大波更新

    距离上次更新#VSTS日志#已经有将近3个月的时间了,赶上最近Xamarin开源免费的消息,VSTS也推出了更多跨平台的支持和许多其他功能.这里列出一些小编觉得比较重要. 1. Xamarin 构建模 ...

  10. (NO.00005)iOS实现炸弹人游戏(十一):怪物之火精灵

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 从本篇开始我们一次介绍一下游戏中敌人的制作过程.看过第一篇的小 ...