使用 py.test 对 python 代码进行测试
其实以前我记得有人对我说过,写代码甚至可以先写完测试之后部署好了再开始写逻辑代码。我觉得有点吃惊和奇怪,这不是扯淡吗?
但是这次在完成了积分支付第一阶段开发之后我意识到,这可能并不是开玩笑,特别是项目可能还涉及到以前的代码进行迁移,如何保证代码迁移之后还能继续正常运行?
越是大的项目,在这个上面的维护成本就越高,如果是一人开发,既要负责测试又要负责开发,没有单元测试对这种任务来说简直就是灾难。
之前在编写openapi模块的时候也为那边的代码写过测试,但是对py.test也没有使用什么其它的特性,这次用到感觉比较通用的几个函数和用法所以纪录一下。
上个例子:
import pytest
@pytest.mark.parametrize("package_price, package_ident, begin_time, end_time", [
(-800, 1, datetime.datetime.now(), datetime.datetime.now()+datetime.timedelta(days=30)),
(800, 1, datetime.datetime.now(), datetime.datetime.now()+datetime.timedelta(days=30)),
], ids=["-钱购买爱尝鲜", "+钱购买爱尝鲜"])
来分析一下这个pytest.mark.parametrize("", [])
第一个字符串参数里面可以传你想要初始化的字段name以逗号分隔,注意它们都在一个字符串里。
后面的数组以tuple为一个元素,每个tuple里面可以初始化在前面string里面写的各参数,同样以逗号分隔。
ids是可以指定单组参数也就是一个tuple为一个单位的这组测试用例的id,这个会在测试的时候显示出来就像这样。

这样我们就能通过自己手动构造参数愉快的开始测试了。
但是其实除了这种简单的参数,真正在测试的时候是比较难构造的是指定的obejct对象。
这里可以引入一个叫mock的库
下面看个例子
from mock import MagicMock
order = MagicMock(id=order_id, shop_id=shop_id, user_id=user1.id, finish_time=order_finish_time)
gio = MagicMock(id=gio_id, order_id=order_id, goods_id=goods_id, goods_type=goods_type,
user_id=user1.id, shop_id=shop_id,
is_allowed_to_review=lambda: True, is_reviewed=lambda: False, order=order,
goods_paid_cash_amount=goods_paid_cash_amount)
gio.__class__ = GoodsInOrder
你用一个叫mock的库来轻易构造那些看似复杂的需要传递大量参数的对象。上面那些参事可以在parametrize里面构造好然后传入MagicMock里要初始化的对象里面去,就能按照你的想法初始化出这个对象。给测试带来极大便利。
mock库在python3.4中已加入标准库。不过在python2.7里面还需要通过pip install mock安装。
下面贴上一个完整的例子.
@pytest.mark.parametrize("package_price, package_ident, begin_time, end_time", [
(-800, 1, datetime.datetime.now(), datetime.datetime.now()+datetime.timedelta(days=30)),
(800, 1, datetime.datetime.now(), datetime.datetime.now()+datetime.timedelta(days=30)),
], ids=["-钱买不起爱尝鲜", "+钱也买不起爱尝鲜"])
def test_can_not_buy_fresh_member(package_price, package_ident, begin_time, end_time, user4):
with pytest.raises(NoEnoughAvailablePoints):
decrease_points_by_fresh_member(user4.id, package_price, package_ident, begin_time, end_time)
Reference:
https://wangshunping.gitbooks.io/testing_python/content/chapter3/Mock_and_Patch.html Mock和Patch小技巧
使用 py.test 对 python 代码进行测试的更多相关文章
- ROS系统python代码测试之rostest
ROS系统中提供了测试框架,可以实现python/c++代码的单元测试,python和C++通过不同的方式实现, 之后的两篇文档分别详细介绍各自的实现步骤,以及测试结果和覆盖率的获取. ROS系统中p ...
- 将自己写的Python代码打包放到PyPI上
如果是开源的Python代码,为了能够让大家更方便的使用,放到PyPI上也许是个非常不错的主意(PyPI:Python Package Index).刚开始我以为要将代码打包放到PyPI上是一件非常复 ...
- 让 Python 代码更易维护的七种武器——代码风格(pylint、Flake8、Isort、Autopep8、Yapf、Black)测试覆盖率(Coverage)CI(JK)
让 Python 代码更易维护的七种武器 2018/09/29 · 基础知识 · 武器 原文出处: Jeff Triplett 译文出处:linux中国-Hank Chow 检查你的代码的质 ...
- 交互模式下测试python代码及变量的四则运算
在交互模式下,python代码可以立即执行,所以这很方便我们进行代码测试 1.命令窗口,输入python (如果没配置环境变量则需带python安装目录的绝对路径) >>> 这个就是 ...
- Python代码缩进与测试模块
一.Python代码缩进 Python 函数没有明显的 begin 和 end ,没有标明函数的开始和结束的花括号.唯一的分隔符是一个冒号 ( : ),接着代码本身是缩进的. 例如:缩进 bui ...
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
- zookeeper与Kafka集群搭建及python代码测试
Kafka初识 1.Kafka使用背景 在我们大量使用分布式数据库.分布式计算集群的时候,是否会遇到这样的一些问题: 我们想分析下用户行为(pageviews),以便我们设计出更好的广告位 我想对用户 ...
- 来自ebay内部的「软件测试」学习资料,覆盖GUI、API自动化、代码级测试及性能测试等,Python等,拿走不谢!...
在软件测试领域从业蛮久了,常有人会问我: 刚入测试一年,很迷茫,觉得没啥好做的-- 测试在公司真的不受重视,我是不是去转型做开发会更好? 资深的测试架构师的发展路径是怎么样的?我平时该怎么学习? 我 ...
- if __name__== "__main__" 的意思(作用)python代码复用
if __name__== "__main__" 的意思(作用)python代码复用 转自:大步's Blog http://www.dabu.info/if-__-name__ ...
随机推荐
- 2018-2019-2 20165302程上杰 Exp6 信息搜集与漏洞扫描
1,实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.,实验内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测. ...
- PAT A1112 Stucked Keyboard (20 分)——字符串
On a broken keyboard, some of the keys are always stucked. So when you type some sentences, the char ...
- mysql基础讲解
- linux问题总结
编写后台进程的管理脚本,使用service deamon-name stop的时候,出现如下提示:/sbin/service: line 66: 23299 Terminated env -i LAN ...
- C语言程序设计II—第八周教学
第八周教学总结(15/4-21/4) 教学内容 本周的教学内容为: 8.4 电码加密 知识点:指针与字符串,重难点:字符指针与字符串的关联和区别: 8.5 任意个整数求和 知识点:动态内存分配的概念和 ...
- mysql分表操作
一般分表操作有垂直拆分和水平拆分.顾名思义. 1. 垂直拆分是指,这个表的列,即字段,要拆分成两个或多个表. 这个应用场景比如:这个表字段,几个都是int.datetime等,有那么一个是text类 ...
- HDMI传输原理:TMDS
参考资料:http://blog.sina.com.cn/s/blog_679686370100vgg1.html: http://www.eeworld.com.cn/mndz/2011/0818/ ...
- IIR数字滤波器的实现(C语言)
经典滤波器和数字滤波器 一般滤波器可以分为经典滤波器和数字滤波器. 经典滤波器:假定输入信号中的有用成分和希望去除的成分各自占有不同的频带.如果信号和噪声的频谱相互重迭,经典滤波器无能为力.比如 FI ...
- 开源的mqtt服务器
看介绍挺强大,开源,可运行在Linux和Windows,文档中有相关测试工具,及客户端介绍. 希望有机会应用.http://www.emqtt.com/
- .net获取excel表的内容(OleDB方法)
首先引用组件和命名空间 using Microsoft.Office.Interop.Excel; using System.Data.OleDb; 然后把excel上传到指定路径 上传文件方法省略 ...