测试Python代码
作为程序员,懂得测试,这是必须的职业技能。很遗憾,我以前从未意识到这点,因此经历了很多叫苦不迭的开发生涯。当然了,期望每个人都成为测试高手也是不可能的,但是最基本的单元测试啥的是不惜的,尤其是现在中小公司测试开发不分家的情况下,懂得测试简直是优秀程序员的标志啊。这篇博客就介绍一下Python的测试方法,主要是单元测试。
mock
在介绍具体的测试方法之前,先介绍一下mock,简单来说,mock的作用就是要达到一种挂羊头卖狗肉的效果。例如,你想测试一个web客户端,如果为了测试去搭建一个真实的web服务器,这个代价就太大了。这时候,我们就可以创建一个mock对象,通过一些接口模拟一个web服务器,从而简化了测试的难度,而且这样一个mock对象,可控性很好,模拟延时、断线等都非常简单,而如果是真实的服务器程序就要麻烦的多了。
Tim Mackinnon总结了一些需要使用mock对象的情况:
1、真实对象具有不可确定的行为(产生不可预测的结果,如股票的行情)
2、真实对象很难被创建(比如具体的web容器)
3、真实对象的某些行为很难触发(比如网络错误)
4、真实情况令程序的运行速度很慢
5、真实对象有用户界面
6、测试需要询问真实对象它是如何被调用的(比如测试可能需要验证某个回调函数是否被调用了)
7、真实对象实际上并不存在(当需要和其他开发小组,或者新的硬件系统打交道的时候,这是一个普遍的问题)
Python中的mock模块就是这个作用,使用pip install mock就可以安装,在3.3之后,这个模块归入了后边要讲的unittest模块,也成了标准库的一部分了。
下面的内容基本都是mock文档中的东西,简单翻译一下放在这里。
Mock和 MagicMock是mock模块中核心的两个类,当你访问这些类的实例对象的某个属性时,这些对象会为你创建这些属性(如果不存在)并且会记录下你使用这些属性的方式。你可以指定这些对象被调用时的返回值或者可用的属性,然后使用断言对结果进行验证。你也可以使用side_effect来抛出异常或者是mock对象被调用时返回不同的值。
>>> from mock import MagicMock
>>> thing = ProductionClass()
# 设定返回值为3
>>> thing.method = MagicMock(return_value=3)
>>> thing.method(3, 4, 5, key='value') # 注意调用参数
# 可以使用断言判断返回值是否为3
3
>>> thing.method.assert_called_with(3, 4, 5, key='value') #验证调用参数是否正确 >>> mock = Mock(side_effect=KeyError('foo'))
>>> mock()
Traceback (most recent call last):
...
KeyError: 'foo' >>> values = {'a': 1, 'b': 2, 'c': 3}
>>> def side_effect(arg):
... return values[arg]
...
>>> mock.side_effect = side_effect
>>> mock('a'), mock('b'), mock('c')
(1, 2, 3)
>>> mock.side_effect = [5, 4, 3, 2, 1]
>>> mock(), mock(), mock()
(5, 4, 3)
使用patch装饰器可以很容易的模拟一个类或者其对象。
>>> from mock import patch
>>> @patch('module.ClassName2')
... @patch('module.ClassName1')
... def test(MockClass1, MockClass2):
... module.ClassName1()
... module.ClassName2() ... assert MockClass1 is module.ClassName1
... assert MockClass2 is module.ClassName2
... assert MockClass1.called
... assert MockClass2.called
...
>>> test()
doctest
doctest是Python中非常基本的一个测试方式,从名字可以看得出来,它是基于文档的测试,那么是这个文档有什么格式要求呢?简单的说就是测试用例都要写的和python交互方式下的输入输出一致,而其他格式的文字这可以当作是注释。假设文件shape.txt的内容如下
我们想要测试一个模块shape,其中有一个类Point和Circle。类Point代表一个二维空间中的点,而Circle这代表一个圆形,其拥有一个方法area返回计算其面积 >>> import shape
>>> circle = shape.Circle(x=5, y=5, radius=5)
>>> circle.x
5
>>> circle.y
5
>>> circle.radius
5
>>> circle.area()
78.53981633974483
运行python -m doctest shape.txt 即可进行doctest。简单来说,doctest就像是个Python的命令行一样,把<<<之后的内容执行,然后与紧随在之后的输出进行对比。如执行circle.x,判断是不是为5,执行circle.area(),看起结果是否等于78.53981633974483
unittest
doctest虽然简单易用,但是当测试用例需要很多准备工作时,就显得力不从心,这是就该unittest大显身手的时候了。关于unittest,这篇文章就不说了,说多了没用,实干出真知。
测试Python代码的更多相关文章
- 交互模式下测试python代码及变量的四则运算
在交互模式下,python代码可以立即执行,所以这很方便我们进行代码测试 1.命令窗口,输入python (如果没配置环境变量则需带python安装目录的绝对路径) >>> 这个就是 ...
- Python代码缩进与测试模块
一.Python代码缩进 Python 函数没有明显的 begin 和 end ,没有标明函数的开始和结束的花括号.唯一的分隔符是一个冒号 ( : ),接着代码本身是缩进的. 例如:缩进 bui ...
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
- 【转】利用Python中的mock库对Python代码进行模拟测试
出处 https://www.toptal.com/python/an-introduction-to-mocking-in-python http://www.oschina.net/transla ...
- 让 Python 代码更易维护的七种武器——代码风格(pylint、Flake8、Isort、Autopep8、Yapf、Black)测试覆盖率(Coverage)CI(JK)
让 Python 代码更易维护的七种武器 2018/09/29 · 基础知识 · 武器 原文出处: Jeff Triplett 译文出处:linux中国-Hank Chow 检查你的代码的质 ...
- 服务器通过微信公众号Token验证测试的代码(Python版)
我在阿里云租了一个云服务器,然后想把这个作为我的微信公众号的后台,启用微信公众号开发者需要正确的响应微信服务器的Token验证,为此把这个验证的Python代码贴出来,只要在服务器上运行这段代码,注意 ...
- if __name__== "__main__" 的意思(作用)python代码复用
if __name__== "__main__" 的意思(作用)python代码复用 转自:大步's Blog http://www.dabu.info/if-__-name__ ...
- ROS系统python代码测试之rostest
ROS系统中提供了测试框架,可以实现python/c++代码的单元测试,python和C++通过不同的方式实现, 之后的两篇文档分别详细介绍各自的实现步骤,以及测试结果和覆盖率的获取. ROS系统中p ...
- [转] Python 代码性能优化技巧
选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...
随机推荐
- Swiper说明&&API手册
最近使用Swipe.js,发现中文的资料很少,试着翻译了一下.能力有限,翻译难免错漏,欢迎指出,多谢! 翻译自:http://www.idangero.us/sliders/swiper/api.ph ...
- Spark 个人实战系列(2)--Spark 服务脚本分析
前言: spark最近非常的火热, 本文不讲spark原理, 而是研究spark集群搭建和服务的脚本是如何编写的, 管中窥豹, 希望从运行脚本的角度去理解spark集群. 研究的spark为1.0.1 ...
- POJ 3176 简单DP
Cow Bowling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16448 Accepted: 10957 Descrip ...
- 如何在一个网站或者一个页面规划JS
规划主要分为两部分:1.JS的分层,2.Js的规划 1.JS的分层(功能) 1-1.底层的库 : jquery 1-2.组件(ui) : 比如拖拽等,模块之间没有必然的联系,可以重复利用 1-3. ...
- python知识点记录(一):
1.如何使print输出不换行: 在print语句末尾加上一个英文逗号. 2.安装第三方模块时,用pip和easy_install是一样的.下载一个setuptools.exe安装好就有easy_in ...
- Oracle学习系列5
Oracle学习系列5 ************************************************************************************ ,掌握 ...
- 黑马程序员——JAVA基础之标准输入输出流
------- android培训.java培训.期待与您交流! ---------- 标准输入输出流: System中的基本字段,in,out 它们各代表了系统标准的输入和输出设备. 默认输入设备是 ...
- Docker SSH+NGHINX+MYSQL
1.添加创建镜像的配置文件 vim Dockerfile 输入以下内容: FROM jdeathe/centos-sshMAINTAINER baxk"xxx@hongh ...
- 完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能
#!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能'''try: a=int(raw_input(" ...
- Alpha版本——Postmortem会议
No Bug 031402401鲍亮 031402402曹鑫杰 031402403常松 031402412林淋 031402418汪培侨 031402426许秋鑫 设想和目标 1.我们的软件要解决什么 ...