mock 测试

mock 是辅助单元测试的模块,用于测试不方便调用的别人的接口。举个简单的例子,比如说,我们测试django 写的微信登录接口,正常流程下,我们需要前端拉起授权窗口,获取jscode或其他数据。而这一部分操作,我们在单元测试的时候没办法模拟出来。此时,我们希望假设调用微信的接口,正常返回了我们需要的数据,在这种情况下,我们便需要简单的mock 函数,假设已经该函数正常返回了我们的结果,让流程更通畅。

代码demo

from rest_framework.test import APITestCase
from unittest import mock class AdviserTest(APITestCase):
# mock.patch 中指定我们需要mock的函数路径(使用时的路径)
@mock.patch("adviser.views.jscode2session")
def test_small_app_login(self, mock_jscode2session):
# 添加mock 函数的返回值,指定之后,所有的调用到该函数的地方,统一返回
mock_jscode2session.return_value = {
"openid": 123,"session_key":123
} url = "/api/small_app_login/"
data = { "jscode": "string",
"name": "string",
"avatar": "string",
"gender": 0 }
ret = self.client.post(url, data=data)
self.assertEqual(ret.status_code, 200)

单元测试 unittest

python自己带了一个单元测试框架,unittest,可以方便的实现测试环境初始化,测试用例编写(以test_开头,能自动执行 ),环境清除, 返回校验的功能,可以很方便的使用, 在这只做简单介绍。

在单元测试运行完之后,成功会打印一个".",失败会显示断言失败的地方。

import unittest

class MyTest(unittest.TestCase):  # 继承unittest.TestCase
def setUp(self):
# 每个测试用例执行之前做操作
print('22222') def tearDown(self):
# 每个测试用例执行之后做操作
print('111') @classmethod
def tearDownClass(self):
# 所有test运行完后运行一次
print('4444444')
@classmethod
def setUpClass(self):
# 所有test运行前运行一次
print('33333') def run(self):
print("00000") # 不是以test_开头,所以不会执行 def test_a_run(self):
self.assertEqual(1, 1) # test_开头, 所以是测试用例 def test_b_run(self):
self.assertEqual(2, 2) # test_开头, 所以是测试用例 if __name__ == '__main__':
unittest.main()#运行所有的测试用例

django 单元测试框架

django的单元测试是基于unittest 编写,所以整个流程和unittest的完全一致。

为了方便使用django test 有一个client,可以方便我们发出请求,使用用法如下, 我们可以根据自己接口的实际情况,编写相对应的单元测试代码,检查我们的接口是否正常返回

from django.test import Client
c = Client()
response = c.post('/login/', {'username': 'john', 'password': 'smith'})
print(response.status_code)
response = c.get('/customer/details/')

在运行的时候,我们不在单独运行test文件,而是通过django的命令去启动测试 python manage.py test [app name] ,启动的时候,会根据已有的model 去创建新的test数据库,也就是说整个测试数据库初始的时候是空的,并且整个测试run完,数据库会被摧毁。

Tips:

  • 在django的单元测试中,每次测试用例执行完,都会恢复数据库,所以我们如果在一个用例中,修改了某个model的值,并不会影响后面的使用。

  • 有时候,我们期望的是在一个有数据的数据库里执行我们的测试,所以,我们可以加上 --keepdb 选项,这样在每次运行完之后, 数据库已有的数据还是存在的。

  • 我们希望跑单元测试的数据库是单独的一个,和线上分离,所以需要在数据库配置(settings.py 文件中) 指定

    DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.postgresql',
    'NAME': '',
    'USER': '',
    'HOST':'',
    'PASSWORD': '',
    'PORT': '',
    'TEST': {# 配置对应的测试数据库
    'NAME': 'mdw_pre',
    }
    }
    }
  • 在运行过程中,可能会打印出一些项目的log 记录, 我们可以通过

-v {0,1,2,3}, --verbosity {0,1,2,3}

Verbosity level; 0=minimal output, 1=normal output,

2=verbose output, 3=very verbose output

```

  • 至此,我们可以比较完整的编写我们自己项目单元测试了

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

  1. django单元测试

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

  2. [Django] 单元测试小记

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

  3. 如何进行Django单元测试

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

  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. Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) F. Substrings in a String

    http://codeforces.com/contest/914/problem/F 以前做过一个类似的,但是查询的子串长度最多是10,这个时候就是用bit + hash做了.这是因为改变一个字符, ...

  2. EOF是什么

    我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file) ...

  3. centOS和redHat防火墙开放端口

    发现在CentOS 7上开放端口用iptables没效果(或者是sodino没找到正确的命令,传说Centos7 下默认的防火墙是 Firewall,替代了之前的 iptables)… 使用firew ...

  4. informix(南大通用)sql语法的差异

    1.create view  444(...)  as select ...from... 2.insert into select.......union  select     不支持 请分开写 ...

  5. CharacterController控制的物体移动

    CharacterController控制的物体移动: public class playerMove  : MonoBehaviour { public float Speed; private C ...

  6. Python 多继承(新式类) 的mro算法

    转载自:http://www.cnblogs.com/panyinghua/p/3283831.html mro即method resolution order,主要用于在多继承时判断调的属性的路径( ...

  7. 计算机为什么要区别C盘,D盘,E盘等?

      为什么要区分C盘,D盘,E盘,F盘? 1)各盘出现背景 在计算机刚诞生的年代,还没有硬盘,那时数据存储主要靠软盘.软盘驱动器按照顺序占据了A和B盘符的位置,后来随着硬盘的应用,就出现了C盘及以后的 ...

  8. GitKraken使用教程-基础部分(6)

    4) 放弃本次文件的改动 有些情况下,由于更改代码造成了编译无法通过等错误时,想要放弃这次对文件的修改,将文件还原成上一次提交后的状态,一种简单的恢复文件的方法就是,在Unstaged Files 列 ...

  9. 排序 & 常用算法

    一.快速排序QuickSort 快速排序和归并排序都使用分治法来设计算法,区别在于归并排序把数组分为两个基本等长的子数组,分别排好序之后还要进行归并(Merge)操作,而快速排序拆分子数组的时候显得更 ...

  10. yield关键字的使用

    yield的中文是什么意思呢? 在金山词霸上面的翻译是: vt.屈服,投降: 生产: 获利: 不再反对 vi.放弃,屈服: 生利: 退让,退位 n.产量,产额: 投资的收益: 屈服,击穿: 产品 个人 ...