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. PyCharm5 破解汉化

    作者博文地址:https://www.cnblogs.com/liu-shuai/ 破解: 将下列序列号复制到软件激活界面即可破解. 43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0 ...

  2. 换晶振导致stm32串口数据飞码的解决办法(补充)

    今天(2014.4.21)把stm32f107的程序下载到stm32f103的板子上,发现串口收不到数据,突然想起晶振频率没有修改,#define HSE_VALUE    ((uint32_t)13 ...

  3. asp.net 单元测试(转)

    最早接触单元测试是看了极限编程相关资料里边讲的测试驱动开发,然后下载了Nunit研究了一下,但并没产生多大的触动,因为那个时候做的都是些时间紧任务重的事情,对于单元测试的直接感觉就是有可能比较费时间. ...

  4. C#用委托实现异步,异步与多线程的异同

    异步与多线程的区别(转) 一.异步和多线程有什么区别?其实,异步是目的,而多线程是实现这个目的的方法.异步是说,A发起一个操作后(一般都是比较耗时的操作,如果不耗时的操作就没有必要异步了),可以继续自 ...

  5. intellijidea课程 intellijidea神器使用技巧 6-1 Spring的关联

    待学完spring之后再来看 Spring的关联位置:菜单->File->Project Structure->Facets功能:帮助管理Spring容器.还提供了很多其他的管理,比 ...

  6. GET和POST区别(转)

    作者:silence链接:https://www.zhihu.com/question/28586791/answer/153556269来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  7. IntelliJ IDEA详细配置和使用教程(转)

    http://blog.csdn.net/m_m254282520/article/details/78900238 关闭Intellij IDEA自动更新 在File->Settings-&g ...

  8. (生产)better-scroll - 下拉刷新

    Options 参数 startX: 0 开始的X轴位置 startY: 0 开始的Y轴位置 scrollY: true 滚动方向为 Y 轴 scrollX: 'true' 滚动方向为 X 轴 cli ...

  9. SaaS “可配置”和“多租户”架构的几种技术实现方式

    1.数据存储方式的选择 多租户(Multi-Tenant ),即多个租户共用一个实例,租户的数据既有隔离又有共享,说到底是要解决数据存储的问题. 常用的数据存储方式有三种. 方案一:独立数据库   一 ...

  10. SPFieldLookupValue class

    using System; using Microsoft.SharePoint; namespace ConsoleApp { class Program { static void Main(st ...