Python单元测试()
在Python的单元测试(一)中,我们讲了单元测试的概念以及一个简单的单元测试例子。
在这个例子中,只有三个函数,于是可以把每个函数的输出结果打印到屏幕上,再用肉眼去看结果是否符合预期。然而假设有一个程序,有二十个类,每个类又有几十个函数,有些函数的输出结果还多达几十行,在这种情况下,肉眼如何看得出?
当然你可以使用if判断
if 输出结果 == 预期结果: return Trueelse: print u'不相等'
这个时候,你发现,程序有几个函数,后三行就要重复几次,本着代码简洁的原则,你把这个判断的过程写到一个函数中:
def isequal(output,right_output):
if output == right_output: return True
else: print u'不相等'
那么恭喜你,你步入正规了,然而,这一切已经有人为你做好了。欢迎unittest模块出场。
unittest supports test automation, sharing of setup and shutdown code for tests, aggregation of tests into collections, and independence of the tests from the reporting framework. The unittest module provides classes that make it easy to support these qualities for a set of tests.
Python的官方文档这样写到,unittest支持自动化测试,测试的安装分享和关闭代码……
一句话说来,就是,unittest很好用。
还是用上一次的readandadd.py来演示unittest的基本用法,首先介绍unittest的一个函数,assertEqual(first,second),这个函数的作用是检查变量first的值与second的值是否相等,如果不相等就抛出错误。
先创建utest.py文件,输入以下代码并运行:
#-*-coding:utf-8-*-
import unittest import readandadd class basictest(unittest.TestCase): #类名可以随便取
def testread(self): #每个函数都要以test开头
output = readandadd.read('1.txt')
self.assertEqual(output,'2,3') def testgetnum(self):
output = readandadd.getnum('2,3')
self.assertEqual(output,['2', '3']) def testaddnum(self):
output = readandadd.addnum([2,3])
self.assertEqual(output,5) if __name__ == '__main__':
unittest.main()
运行结果如下:
...
----------------------------------------------------------------------
Ran 3 tests in 0.001s
OK
你也许会说,就一个ok,什么都没有啊。那我先把testread()函数下面的
self.assertEqual(output,'2,3')
改为
self.assertEqual(output,'2,4')
在运行utest.py看看输出结果如何:
..F
======================================================================
FAIL: testread (__main__.basictest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "E:/mystuff/unitest/utest.py", line 8, in testread
self.assertEqual(output,'2,4')
AssertionError: '2,3' != '2,4'
----------------------------------------------------------------------
Ran 3 tests in 0.000s
FAILED (failures=1)
这里准确的找出了错误的位置和错误的具体内容。注意看最上面,有个
..F
猜测它可能是标示错误的位置。保持testread的错误不改,再把testgetnum()函数中的以下内容
self.assertEqual(output,['2', '3'])
改为
self.assertEqual(output,['2', '6'])
再运行utest.py程序,输出结果如下:
.FF
======================================================================
FAIL: testgetnum (__main__.basictest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "E:/mystuff/unitest/utest.py", line 12, in testgetnum
self.assertEqual(output,['2', '6'])
AssertionError: Lists differ: ['2', '3'] != ['2', '6']
First differing element 1: 3
6
- ['2', '3']
? ^
+ ['2', '6']
? ^
======================================================================
FAIL: testread (__main__.basictest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "E:/mystuff/unitest/utest.py", line 8, in testread
self.assertEqual(output,'2,4')
AssertionError: '2,3' != '2,4'
----------------------------------------------------------------------
Ran 3 tests in 0.001s
FAILED (failures=2)
可以看出,这里分别把两个错误显示了出来。并且第一行变成了
.FF
所以,第一行的内容应该从右往左读,它标明错误函数在所有函数的相对位置。
现在再把testread()和testgetnum()改回去,再看看全部正确的输出:
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
印证了那句话,没有消息就是最好的消息。
这篇文章介绍了单元测试模块unittest的assertEqual的基本用法,下一篇文章将要更加全面的介绍unittest模块。
本文首发地址:http://kingname.info/2015/03/04/pythonunittest2/
- iPhone的Wi-Fi芯片漏洞利用POC公布,赶紧更新系统吧
- No.003 Longest Substring Without Repeating Characters
- 【Spark研究】极简 Spark 入门笔记——安装和第一个回归程序
- 通常Java开发人员如何进行数据排序?
- 消息服务框架使用案例之--大文件上传(断点续传)功能
- Java中三种Set类型用法、性能大比拼
- Android基础总结(5)——数据存储,持久化技术
- 如何突破Windows环境限制打开“命令提示符”
- 【Spark研究】Spark之工作原理
- Java中泛型使用的必要性
- “一切都是消息”--MSF(消息服务框架)之【发布-订阅】模式
- Android基础总结(4)——广播接收器
- “一切都是消息”--MSF(消息服务框架)之【请求-响应】模式(点对点)
- “老坛泡新菜”:SOD MVVM框架,让WinForms焕发新春
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
- PHP pthreads v3使用中的一些坑和注意点分析
- php ActiveMQ的安装与使用方法图文教程
- ThinkPHP5与单元测试PHPUnit使用详解
- php实现通过stomp协议连接ActiveMQ操作示例
- PHP pthreads v3下的Volatile简介与使用方法示例
- php实现根据身份证获取精准年龄
- php 使用ActiveMQ发送消息,与处理消息操作示例
- php使用gearman进行任务分发操作实例详解
- laravel框架select2多选插件初始化默认选中项操作示例
- PHP pthreads v3在centos7平台下的安装与配置操作方法
- laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
- PHP Beanstalkd消息队列的安装与使用方法实例详解
- 解决windows上php xdebug 无法调试的问题
- php7 图形用户界面GUI 开发示例