[gist]How to use Mock testing Python

本文介绍如何使用Mock和NoseTests为Bottle应用进行测试,包括patch方法、装饰器、非存在模块的mock以及使用TravisCI进行持续集成的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

from http://oyanglul.us

最近在用 nosetests 和 mock1 为 bottle 应用测试, 发现几个使用nosetests 要注意的地方:

1 patch method of module

patch 一个导入 module 的 method, 因为 method 已经被导入到目标文件, 因此必须要 patch 目标文件的 该方法, 而不是原 module.

# wsgi.py
from db import get_db

def insert_something():
    get_db().insert(something)

# test.py
import wsgi

# @patch('db.get_db') # this won't work
@patch('wsgi.get_db') # should patch wsgi
def test_insert(mock_get_db):
    mock_get_db.return_value = Database()
    ...

2 patch decorator

Scenario : bottle 的 views 是用 decorator 来定义的, 也就是说当我们测试 bottle 中得 action 时其实这个 action 是被 views 包住的. return 的 dict 会被 bottle 的 views 函数 render 成 html 并返回. 而我们并不需要测试 views 返回的 html, 而只需要测试 return 的 dict 是否正确.

这种情况太适合 mock 的 patch 来干了.

  1. patch bottle.view
  2. 让其返回一个神马都没干的函数
  3. 启动这个patch
  4. 导入需要测试的应用代码

注意 这里的patch必须在 import 你的 application 之前, 比如我的应用是 wsgi.py

完整过程是这样的

from mock import patch, Mock
import bottle
v = patch("bottle.view",return_value = lambda x : x)
v.start() ** 使用 local config 来存放你的密匙
import wsgi

3 mock module that may not exist

Scenario: 一些带有密匙的配置文件(比如 google api key 之类的)并不希望被上传到 github public 上, 但是测试又需要引入这些文件.(后来我发现了更 elegant 的解决方式 使用 local config 来存放你的密匙). 假设现在含密匙的配置文件叫 config.py, 目标文件是 wsgi.py

这样的话用 patch 不会起任何作用, 因为在你 patch 的时候, 必须要首先引入目标文件, 因此目标文件中的import config 会先抛异常.

好吧, 现在我们必须在引入 wsgi 之前就 patch config. 我们将直接让系统的 config 模块等于 mock 的 config. 这样再引入 wsgi 就没有任何问题了.

import sys
config_mock = Mock(spec=['config'])
config_mock.__name__ = 'config'
sys.modules['config'] = config_mock

4 使用 travis ci 持续集成

持续集成最简单的配置当然是 Travis CI. 只需要 增加配置文件 .travis.yml, 只需要定义4个东西. 下面是我的 .travis.yml

language: python
python:
  - "2.7" # version

install: "pip install -r requirements.txt --use-mirrors"  # requirements

script: nosetests  # test or build command

5 使用 local config 来存放你的密匙

这种方式源于 django. 突然想到 django 的 settings.py 最后几行

try:
    from local_settings import *
except:
    pass

意思是从 local_settings 里的所有设置导入, 因此可以把真的带密匙的真是配置写到 local_settings 中.

Footnotes:

1

: mock is now part of the python 3 now. Whee…..

view raw 2013-06-11-use-mock-in-python.markdown hosted with ? by GitHub
一、综合实战—使用极轴追踪方式绘制信号灯 实战目标:利用对象捕捉追踪和极轴追踪功能创建信号灯图形 技术要点:结合两种追踪方式实现精确绘图,适用于工程制图中需要精确定位的场景 1. 切换至AutoCAD 操作步骤: 启动AutoCAD 2016软件 打开随书光盘中的素材文件 确认工作空间为"草图与注释"模式 2. 绘图设置 1)草图设置对话框 打开方式:通过"工具→绘图设置"菜单命令 功能定位:该对话框包含捕捉、追踪等核心绘图辅助功能设置 2)对象捕捉设置 关键配置: 启用对象捕捉(F3快捷键) 启用对象捕捉追踪(F11快捷键) 勾选端点、中心、圆心、象限点等常用捕捉模式 追踪原理:命令执行时悬停光标可显示追踪矢量,再次悬停可停止追踪 3)极轴追踪设置 参数设置: 启用极轴追踪功能 设置角度增量为45度 确认后退出对话框 3. 绘制信号灯 1)绘制圆形 执行命令:"绘图→圆→圆心、半径"命令 绘制过程: 使用对象捕捉追踪定位矩形中心作为圆心 输入半径值30并按Enter确认 通过象限点捕捉确保圆形位置准确 2)绘制直线 操作要点: 选择"绘图→直线"命令 捕捉矩形上边中点作为起点 捕捉圆的上象限点作为终点 按Enter结束当前直线命令 重复技巧: 按Enter可重复最近使用的直线命令 通过圆心捕捉和极轴追踪绘制放射状直线 最终形成完整的信号灯指示图案 3)完成绘制 验证要点: 检查所有直线是否准确连接圆心和象限点 确认极轴追踪的45度增量是否体现 保存绘图文件(快捷键Ctrl+S)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值