title: Django单元测试总结

date: 2019/6/18 17:50:00

body: [article]

description: "  在本文中,笔者大致对Django单元测试的基本操作进行了介绍。在阅读完本文后,读者能够运用Django框架提供的单元测试的API对自己的程序编写单元测试文件。"

category:

  • 学习笔记

    tags:
  • Django框架
  • 单元测试
  • Python

Django 单元测试总结

写在前面

  在本文中,笔者大致对Django单元测试的基本操作进行了介绍。在阅读完本文后,读者能够运用Django框架提供的单元测试的API对自己的程序编写单元测试文件。

  此外,笔者开发的环境如下所示。

PyCharm 2019.1.1 (Professional Edition)

Build #PY-191.6605.12, built on April 3, 2019

JRE: 11.0.2+9-b159.34 amd64

JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o

Windows 10 10.0

单元测试基本结构

  Django框架为单元测试基于Python的unittest包封装了test模块。通过继承Django框架提供的测试模板,能够为需要测试的方法或者类构造测试类。对于每一个需要测试的的单元(类或方法)各自构造一个测试类,在每个类中按照被测试单元的功能要求、错误处理要求等分别构造测试样例以及相应的辅助方法。

  如下段代码所示,对于最基本的一个测试单元,需要有一个继承模板、测试准备方法以及若干测试方法。

# 引入Django.test提供的测试模块,这里选用的是TestCase类作为单元测试的模板。
from django.test import TestCase # 引入测试需要的类或方法。
from Function.models import function # 构造单元测试类,继承相应的模板。
class TestUnit(TestCase): def setUp(self):
# 测试前的准备工作:创建对象、数据库环境等。 # 功能正确性测试
def test_function_successful(self):
# 使用被测试提供的类进行一定操作
# 。。。。。。
# 验证操作后产生的结果
# 。。。。。。 # 错误处理测试
def test_function_dail(self):
# 使用被测试的API进行一定操作,产生预期中的错误。
# 。。。。。。
# 检查错误处理的正确性
# 。。。。。。

单元测试API

测试模板类

  Django框架为使用者提供了四种的测试模板,分别为TestCase、LiveServerTestCase、TransactionTestCase、SimpleTestCase。其中SimpleTestCase是Django框架中最基本的模板类是在unittest.TestCase类基础上增加了部分功能构造的子类。在没有数据库操作时可使用该类作为测试模板。TransactionCase和TestCase在此基础之上支持复杂的数据库操作。一般情况下使用TestCase作为测试模板类。

  在模板类中,除用于测试的样例方法之外,使用者还可以重构框架提供的了几种特殊的方法,用于做一些数据准备和销毁的操作

Function Name Info
setUpClass 在每个测试类建立时会被调用
tearDownClass 在运行完测试类中每个样例后被调用
setUp 在执行每个测试样例前被调用
tearDown 在执行完每个测试样例后被调用
setUpTestData TestCase类的方法,类似于setUpClass,执行更快速

请求的发送

  在Django.test模块中定义了Client类用于在测试工程中模拟多种请求的发送。通过使用Client的对象中的不同方法并对相应的参数进行设置便能够使用单元测试的请求发送功能。并且需要调用的方法与需要发送的请求有相同的名称,比如发送Get请求时需要调用Client.get方法。

# 引入客户端模拟类
from Django.test import Client
# 创建客户端模拟对象
c = Client()
# 客户端发送请求
c.get('url')

  Django的单元测试模板类继承了CLient类。能够在构造单元测试类中直接调用Client类的相应方法。

from Django.test import TestCase

class TestUnit(TestCase):
def test(self):
# 调用自身的方法
self.get('url')
pass
Django支持的请求类型

  Django测试模块支持以下类型的请求。

请求类型 调用方法
Post请求 post(path, data=None, content_type=MULTIPART_CONTENT, follow=False, secure=False, **extra)
Get请求 get(path, data=None, follow=False, secure=False, **extra)
Head请求 head(path, data=None, follow=False, secure=False, **extra)
Option请求 options(path, data='', content_type='application/octet-stream', follow=False, secure=False, **extra)
Put请求 put(path, data='', content_type='application/octet-stream', follow=False, secure=False, **extra)
Patch请求 patch(path, data='', content_type='application/octet-stream', follow=False, secure=False, **extra)
Delete请求 delete(path, data='', content_type='application/octet-stream', follow=False, secure=False, **extra)
Trace请求 trace(path, follow=False, secure=False, **extra)
常用参数含义
参数名 含义解释
path 发送请求使用url
data 发送请求时携带的数据
content_type 携带数据的格式

请求数据的接收与处理

  通过Client对象发出的请求在经过被测试单元的一系列操作之后,返回的数据会以返回值的形式返回。一般情况下,后端返回的数据形式为json格式,在接收数据后需要调用json方法进行解析。

c = Client()
response = c.get('/res/')
renponse = response.json()
# 此时response为字典格式的数据

结果的验证

  同其他单元测试类似,Django框架提供了几种断言函数,用于对运行结果进行验证,并且每个模板类都包含了这些函数。

class TestUnit(TestCase):
def test(self):
self.assertEqual(a, b) # 检验a是否等于b
self.assertTrue(a)
self.assertFalse(b)
# ......

  更多的断言函数见官方模板的相应部分


单元测试的运行

运行单元测试

  在Terminal中输入以下指令即可运行单元测试文件。其中Module_name为需要运行的模块的名称。

py manage.py test Module_name

覆盖率的统计

  笔者开发使用的IDE是PyCharm,其中自带覆盖率统计插件。以run with coverage的方式运行单元测试能够自动地获取到被测试单元的覆盖率。


参考资料

  1. Django文档

Django单元测试总结的更多相关文章

  1. 【Django单元测试方法】

    一.前言/准备 测Django的东西仅限于在MTV模型.哪些可以测?哪些不可以. 1.html里的东西不能测.①Html里的HTML代码大部分都是写死的②嵌套在html中的Django模板语言也不能测 ...

  2. 使用maven执行单元测试总结

    maven本身没有单元测试框架,但是maven的default生命周期的test阶段绑定了maven-surefire-plugin插件,该插件可以调用Junit3.Junit4.TestNG等Jav ...

  3. Spring对Controller、Service、Dao进行Junit单元测试总结

    测试类注解 @RunWith(SpringRunner.class) @SpringBootTest(classes={DemoApplication.class}) 以Controller层的的单元 ...

  4. Controller、Service、Dao进行Junit单元

    原文链接:http://blog.csdn.net/u013041642/article/details/71430293 Spring对Controller.Service.Dao进行Junit单元 ...

  5. Android单元测试

    安卓单元测试总结文章,目测主要会cover以下的主题: 什么是单元测试 为什么要做单元测试 JUnit Mockito Robolectric Dagger2 一个具体的app例子实践 神秘的bonu ...

  6. 高并发秒杀系统--Service事务管理与继承测试

    [Spring IoC的类型及应用场景]  [Spring事务使用方式] [Spring事务的特性] [Spring事务回滚的理解] [Service声明式事务的配置] 1.配置事务管理器 2.配置基 ...

  7. 1405ST软件测试课的要求补充说明

    期末成绩由考勤.测试小结报告.实验报告.课堂问答.测试总结报告.(暂不安排笔试) 分数分配:考勤10%,测试小结(双周结)报告10%,实验报告30%,课堂问答20%,​测试报告30% 考勤:任选10次 ...

  8. 整理六百篇web前端知识混总

    9个有用的和免费的工具来支持动态网页开发 8个基本的引导工具的网页设计师 11款CSS3动画工具的开发 2016年某前端群题目答案参考 9最好的JavaScript压缩工具 创建响应式布局的10款优秀 ...

  9. 【Python】unittest-3

    一.@unittest.skip("skipping this case") # 无条件忽略该测试方法 二.@unittest.skipIf(a > 5, "con ...

随机推荐

  1. redis 缓存问题汇总

    前言:在使用redis的时候,特别是大型应用,会碰到不少问题,下面就来总结一下使用redis时的常见问题 一.redis为缓存的问题 1.缓存和数据库双写一致性问题 分析:一致性问题是分布式常见问题, ...

  2. 2019-11-29-C#-字典-Dictionary-的-TryGetValue-与先判断-ContainsKey-然后-Get-的性能对比

    原文:2019-11-29-C#-字典-Dictionary-的-TryGetValue-与先判断-ContainsKey-然后-Get-的性能对比 title author date CreateT ...

  3. 使用Docker Compose 部署Nexus后提示:Unable to create directory /nexus-data/instance

    场景 Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/ ...

  4. 基础系列(1)-- html

    (随笔杂谈,自己做的笔记) 网页的组成 结构  ------  xhtml,xml 表现  ------  css 行为  ------  bom,dom,ECMAScript html5结构 < ...

  5. vue底部导航的精准显示

    让底部导航只显示在一级页面: 路由中的写法: import Vue from 'vue' import Router from 'vue-router' //import HelloWorld fro ...

  6. Android调用系统相机和相册并解决data为空,OOM,图片角度不对的问题

    最近公司项目用到手机拍照的问题,好不容易在网上copy了一些代码,但是运行起来一大堆bug,先是三星手机上运行程序直接崩掉,debug了一下原来是onActivityResult中data返回为空,找 ...

  7. Android源码分析(十三)----SystemUI下拉状态栏如何添加快捷开关

    一:如何添加快捷开关 源码路径:frameworks/base/packages/SystemUI/res/values/config.xml 添加headset快捷开关,参考如下修改. Index: ...

  8. Android源码分析(十二)-----Android源码中如何自定义TextView实现滚动效果

    一:如何自定义TextView实现滚动效果 继承TextView基类 重写构造方法 修改isFocused()方法,获取焦点. /* * Copyright (C) 2015 The Android ...

  9. [转]【Servlet】Servlet的访问过程

    创建时间:6.15 Servlet的访问过程 1. 画图描述整个访问过程: *每次访问service()方法都会创建一对新的request和response对象,都不一样 2. 访问过程2: 问题:对 ...

  10. Jupyter 中的 10 个魔法函数

    1)%pwd 于显示Jupyter当前的工作空间. 2)%hist 显示当前Jupyter中,所有运行过的历史代码. 3)%who 显示当前Jupyter环境中的所有变量或名称. 4)%reset 删 ...