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. python 进程池Pool以及Queue的用法

    import os,time,random from multiprocessing import Pool def task(name): print('正在运行的任务:%s,PID:(%s)'%( ...

  2. 表单注册及自定义validate手机验证码验证实例

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  3. Technical Committee Weekly Meeting 2016.06.21

    Meeting time: 2016.June.21 1:00~2:00 Chairperson:  Thierry Carrez Meeting summary: 1.Add current hou ...

  4. jQuery OCUpload一键上传文件

    1 引入相关的js文件 <!--引入OCUpload的js文件,之前需要引入jQuery的js文件 --> <script type="text/javascript&qu ...

  5. POJ 3164——Command Network——————【最小树形图、固定根】

    Command Network Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 15080   Accepted: 4331 ...

  6. 在Java中VO , PO , BO , QO, DAO ,POJO是什么意思

    在Java中VO , PO , BO, DAO ,POJO是什么意思 最近在项目中,遇到VO,我的天...那就一起学习回忆一下 首先简单说明下: O/R  Mapping是Object Relatio ...

  7. 【Python学习一】使用Python+selenium实现第一个自动化测试脚本

    1.Python的下载 python官方下载地址:https://www.python.org/downloads/ 这边安装的3.6.5为最新版本以适应未来的需求 进入页面就有两个版本的下载选择,2 ...

  8. web页面实时刷新之browser sync

    web开发对实时刷新的需求 在刚开始学习前端时每次修改文件内容后都需要手工刷新下浏览器来看效果,做的次数多了就特别难受,有时仅仅修改了一个字母都需要刷新下页面查看 之后接触到编写边看的集成IDE,文件 ...

  9. Kindeditor单独调用多图上传

    html代码: <input type="button" id="J_selectImage" value="图片上传" />& ...

  10. canvas制作倒计时炫丽效果

    <!DOCTYPE html> <head> <title>canvas倒计时</title> <style> .canvas{ displ ...