[译]PyUnit—Python单元测试框架(1)
1. 原文及参考资料
原文链接:http://docs.python.org/2/library/unittest.html#
参考文档:
http://pyunit.sourceforge.net/pyunit_cn.html
http://www.oschina.net/question/12_27127
2. PyUnit介绍
PyUnit是Python 2.1版本新增功能。
(如果你已经熟悉了测试的基本概念,你可以直接跳到the list of assert methods.)
Python单元测试框架,又叫PyUnit。是JUnit的Python实现,是由Kent Beck和Erich Gamma共同开发的。同样,JUnit是Kent的Smalltalk测试框架的Java实现。PyUnit和JUnit都是各自怨言的标准测试框架。
PyUnit模块支持自动化测试,通用的setup和shutdown的代码,测试用例整合为测试集,还有独立的测试报告框架。PyUnit提供的类能够很容易的使以上特性应用于测试。PyUnit是借由以下概念支持单元测试的:
测试固件
测试固件是指运行测试前的准备工作和运行测试后的清理工作。例如,创建临时或代理数据库、目录,或者启动服务进程。
测试用例
测试用例是最小的测试单元,检查特定的输入会产生预期的结果。PyUnit提供一个测试用例几类TestCase,继承基类可以创建新的测试用例。
测试集
测试集是测试用例的集合,同时也可以是其他测试集的结合,或者是测试用例和测试集的混合集合。用于批量执行测试用例。
执行器
执行器用来执行测试用例,并且把测试结果呈现给用户。执行器可以使用图形界面,文本界面,甚至特殊值来显示测试结果。
测试用例和测试固件通过TestCase和FunctionTestCase两个类来实现的。TestCase用来创建新的测试用例,而FunctionTestCase是用来把已有测试用例整合为PyUnit结构用例的(译者注:项目原来已经有测试用例了,后来想改用PyUnit测试框架,这时候就要用到FunctionTestCase了)。使用TestCase类创建新测试用例,需要覆盖setUp()和tearDown()方法,他们分别用来初始化固件和清理固件。而要使用FunctionTestCase类为已有函数创建测绘用例,需要符合以下条件:我们不关心已有函数的测试结果,只关心正确的测试流程固件初始化->执行测试步骤->测试固件清理。每个TestCase只能执行一个测试方法,所以最好每个测试用例有单独的测试固件(译者注:我任务这一条不用严格执行,多个用例使用相同的测试固件时我一般会写到一个TestCase里)。
TestSuite类实现测试套件功能,可以整合单独的测试用例或者其他测试套件。执行测试套件,测试套件中所有的测试用例和子测试套件都会被执行。
执行器提供一个方法run(),该方法接受TestCase或者TestSuite对象最为参数,并且返回TestResult结果对象。PyUnit提供一个使用TextTestRunner执行器的例子,该例子汇报默认的标准错误流测试结果。想要更改其他环境的执行器(例如图形界面环境)并不需要派生自特定的类。
另请参阅:
Module doctest
Another test-support module with a very different flavor.
unittest2: A backport of new unittest features for Python 2.4-2.6
Many new features were added to unittest in Python 2.7, including test discovery. unittest2 allows you to use these features with earlier versions of Python.
Simple Smalltalk Testing: With Patterns
Kent Beck’s original paper on testing frameworks using the pattern shared by unittest.
Third-party unittest frameworks with a lighter-weight syntax for writing tests. For example, assert func(10) == 42.
The Python Testing Tools Taxonomy
An extensive list of Python testing tools including functional testing frameworks and mock object libraries.
Testing in Python Mailing List
A special-interest-group for discussion of testing, and testing tools, in Python.
3. 基本例子
PyUnit模块提供了大量的工具来构造和运行测试,本部分的例子可以满足大部分用户的需求。
以下脚本是测试random模块的3个函数的例子:
import random
import unittest class TestSequenceFunctions(unittest.TestCase): def setUp(self):
self.seq = range(10) def test_shuffle(self):
# make sure the shuffled sequence does not lose any elements
random.shuffle(self.seq)
self.seq.sort()
self.assertEqual(self.seq, range(10)) # should raise an exception for an immutable sequence
self.assertRaises(TypeError, random.shuffle, (1,2,3)) def test_choice(self):
element = random.choice(self.seq)
self.assertTrue(element in self.seq) def test_sample(self):
with self.assertRaises(ValueError):
random.sample(self.seq, 20)
for element in random.sample(self.seq, 5):
self.assertTrue(element in self.seq) if __name__ == '__main__':
unittest.main()
通过继承unittest.TestCase类来创建测试用例,测试用例中3个独立的测试函数以"test"为开头命名。通过使用这种命名方式,执行器可以知道哪些方法是测试方法。
需要注意的是,3个测试方法分别调用assertEqual()函数来检查预期结果;调用assertTrue()函数来判断条件;调用assertRaises()函数来验证是否触发了预期的异常。这3个方法作为断言语句判断用例执行正确性,以便于执行器收集测试结果并产生测试报告。
如果定义了setUp()方法,每个测试用例执行前都会执行setUp();同样的,如果定义了tearDown()方法,每个测试用例执行完后都会执行tearDown()方法。在上面的例子中,setUp()方法用来为每个用例创建一个新序列。
例子最后一段介绍了一种简单调用测试用例的方法—unittest.main()。它为用例提供了命令行界面运行,脚本运行完成后会输出如下内容
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s OK
(译者注:连续的3个点"..."表示3个测试用例都运行通过,如果运行失败显示"F",例如".FF"表示后2个用例运行失败)
有许多更易管理,输出信息更简洁,并且不在命令行运行的方法来替代unittest.main()方法运行测试用例。例如以下方法,替换例子的最后一行unittest.main():
suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)
unittest.TextTestRunner(verbosity=2).run(suite)
改进后的脚本运行后输出如下:
test_choice (__main__.TestSequenceFunctions) ... ok
test_sample (__main__.TestSequenceFunctions) ... ok
test_shuffle (__main__.TestSequenceFunctions) ... ok ----------------------------------------------------------------------
Ran 3 tests in 0.110s OK
上面的例子展示了unittest模块的基本用法,掌握它们足够我们应对日常的测试需求了。本文剩余部分将对unittest所有特性逐一探索。
Copyright © 2014 Xavier Wang. All rights reserved.
转载请注明出处:http://www.cnblogs.com/Xavierr/p/3604898.html
[译]PyUnit—Python单元测试框架(1)的更多相关文章
- python单元测试框架 pyunit
概况 系统要求 使用PyUnit构建自己的测试 安装 测试用例介绍 创建一个简单测试用例 复用设置代码:创建固件 包含多个测试方法的测试用例类 将测试用例聚合成测试套件 嵌套测试用例 测试代码的放置位 ...
- Python单元测试框架
目录 概况 系统要求 使用PyUnit构建自己的测试 安装 测试用例介绍 创建一个简单测试用例 复用设置代码:创建固件 包含多个测试方法的测试用例类 将测试用例聚合成测试套件 嵌套测试用例 测试代码的 ...
- Python单元测试框架之pytest 4 -- 断言
From: https://www.cnblogs.com/fnng/p/4774676.html Python单元测试框架之pytest -- 断言 2015-08-31 23:57 by 虫师, ...
- Python单元测试框架之pytest 3 -- fixtures
From: https://www.cnblogs.com/fnng/p/4769020.html Python单元测试框架之pytest -- fixtures 2015-08-29 13:05 b ...
- Python单元测试框架之pytest 2 -- 生成测试报告
From: https://www.cnblogs.com/fnng/p/4768239.html Python单元测试框架之pytest -- 生成测试报告 2015-08-29 00:40 by ...
- Python单元测试框架unittest使用方法讲解
这篇文章主要介绍了Python单元测试框架unittest使用方法讲解,本文讲解了unittest概述.命令行接口.测试案例自动搜索.创建测试代码.构建测试套件方法等内容,需要的朋友可以参考下 概 ...
- 【转】nose-parameterized是Python单元测试框架实现参数化的扩展
原文地址: http://www.cnblogs.com/fnng/p/6580636.html 相对而言,Python下面单元测试框架要弱上少,尤其是Python自带的unittest测试框架,不支 ...
- Python单元测试框架:unittest(一)
Python单元测试框架unittest使用方法讲解 主要介绍了Python单元测试框架unittest使用方法讲解,本文讲解了unittest概述.命令行接口.测试案例自动搜索.创建测试代码.构建测 ...
- Python单元测试框架unittest之深入学习
前言 前几篇文章该要地介绍了python单元测试框架unittest的使用,本篇文章系统介绍unittest框架. 一.unittest核心工作原理 unittest中最核心的四个概念是:test c ...
随机推荐
- 代C语言上机实践
这已经是开学第十二周了,个人感觉严老师教的这批学生效果不是很好,有的竟然毫不知道main函数前边的 int是做什么的.只知按照书本上给的样例程序一个字一个字的敲到编译器中,然后点击运行.有错误也不知道 ...
- lnmp 虚拟主机配置及重写
lnmp安装与调试,请看 http://www.cnblogs.com/lin3615/p/4376224.html 虚拟主机的配置编辑nginx配置文件 nginx.conf此为主配置文件 vim ...
- xml simpleXML_load_file(), simpleXML_load_string()
xml.xml文件 <?xml version='1.0'?><man> <att> <name>lin3615</name& ...
- hdu 5654 xiaoxin and his watermelon candy 树状数组维护区间唯一元组
题目链接 题意:序列长度为n(1<= n <= 200,000)的序列,有Q(<=200,000)次区间查询,问区间[l,r]中有多少个不同的连续递增的三元组. 思路:连续三元组-& ...
- Unity3d Shader开发(三)Pass(Fog )
雾参数用于雾命令控制. 雾化是通过混合已生成的像素的颜色和基于到镜头的距离来确定的一个不变色来完成.雾化不会改变已经混合的像素的透明度值,只是改变RGB值. Syntax 语法 Fog { Fog C ...
- SQL 返回数量一定的行
1. 限制返回的行 select top 10 * from tablename 2. 返回随机n行 select top n * from tablename order by newid()
- Hibernate 一对多自身双向关联关系 用于类别表的实现
分类:一对多自身双向关联关系 Java持久化类: package com.hyy.hibernate.one_to_many.domain; import java.util.HashSet; imp ...
- 中国版dropbox“坚果云”和它背后的团队故事(大的优势就在于他为用户提供了设定多个文件夹的权利)
(速途网专栏 作者:娄昊川)坚果云是一款中文存储服务,前身是“坚果铺子”,提供免费的云空间,与dropbox类似,用户可以直接把档案同步到坚果云,供自己和伙伴用任何设备访问.自上线以来,几乎所有用户都 ...
- Android 各个版本WebView
转载请注明出处 http://blog.csdn.net/typename/ powered by miechal zhao : miechalzhao@gmail.com 前言: 根据Googl ...
- Android ListView动态更新数据
ListView就是可以显示一行行Item的控件,有时候数据非常多,通常需要分页显示,但为了减少用户的输入,我们可以动态更新ListView,把下一页要显示的数据的添加到当前ListView中. 先看 ...