使用 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__ ...
随机推荐
- 使用RMAN Active duplicate创建异地auxiliary Database
1g的RMAN duplicate 可以通过Active database duplicate和Backup-based duplicate两种方法实现.这里的测试使用的是Active databas ...
- <数据结构与算法分析>读书笔记--数学知识复习
数学知识复习是<数据结构与算法分析>的第一章引论的第二小节,之所以放在后面,是因为我对数学确实有些恐惧感.不过再怎么恐惧也是要面对的. 一.指数 基本公式: 二.对数 在计算机科学中除非有 ...
- (转)60s快速分析Linux性能
之前在地铁上看到过一篇快速分析Linux系统性能的文章,觉得以后有用,今天就找了一下,转载过来. 原文出处:http://techblog.netflix.com/2015/11/linux-perf ...
- 使用HttpClient和Jsoup实现一个简单爬虫
一直很想了解一下爬虫这个东西的,完全是出于兴趣,其实刚开始是准备用python的,但是由于种种原因选择了java,此处省略很多字... 总之,如果你想做一件事情的话就尽快去做吧,千万不要把战线拉得太长 ...
- co模块源码学习笔记
// Sorrow.X --- 添加注释,注释纯属个人理解 /** * slice变量 引用 数组的 slice方法 */ var slice = Array.prototype.slice; /** ...
- Omi框架学习之旅 - 获取DOM节点 及原理说明
虽然绝大部分情况下,开发者不需要去查找获取DOM,但是还是有需要获取DOM的场景,所以Omi提供了方便获取DOM节点的方式. 这是官网的话,但是我一直都需要获取dom,对dom操作,所以omi提供的获 ...
- BZOJ4237 JOISC2014 稻草人 CDQ分治、单调栈
传送门 题意:给出平面上$N$个点,求满足以下两个条件的矩形:①左下角与右上角各有一个点:②矩形内部没有点.$N \leq 2 \times 10^5$,所有数字大于等于$0$,保证坐标两两不同 最开 ...
- Java 面试题 == 和 equals 的区别
int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引 ...
- OpenBLAS简介及在Windows7 VS2013上源码的编译过程
OpenBLAS(Open Basic Linear Algebra Subprograms)是开源的基本线性代数子程序库,是一个优化的高性能多核BLAS库,主要包括矩阵与矩阵.矩阵与向量.向量与向量 ...
- .Net架构篇:思考如何设计一款实用的分布式监控系统?
前言 无论从最早期的unix操作系统,还是曾经大行其道的单体式应用,还是现在日益流行的微服务架构,始终都离不开监控的身影.如windows的任务管理器,linux的top命令,都可以看作是监控的面板. ...