python自动单元测试框架 unittest :http://www.ibm.com/developerworks/cn/linux/l-pyunit/
类似于Java的Junit,Python语言的开发人员可以使用Steve Purcell编写的PyUnit作为单元测试框架,使得Python程序猿更加容易地增
加、管理和执行测试用例,并对测试结果进行分析。
unittest除了可以进行常规的单元测试,可经常被各种测试框架绑定使用,如web测试框架selenium。
TestCase类:
下面是一个需要被测试的类widget.py,我们想要测试widget控件当前的size和resize函数
例1. widget.py
剩下两个testSize和testResize函数则是核心测试用例部分
完整的单元测试很少只执行一个测试用例,开发人员通常都需要编写多个测试用例才能对某一软件功能进行比较完整的测试,这些相
关的测试用例称为一个测试用例集,在PyUnit中是用TestSuite类来表示的
创建一个unittest的TestSuite,并将上面两个testcase加入suite中,将他们组合起来
测试用例的执行可以有两种方式
第一种是直接调用unittest的TextTestRunner接口
类似于Java的Junit,Python语言的开发人员可以使用Steve Purcell编写的PyUnit作为单元测试框架,使得Python程序猿更加容易地增
加、管理和执行测试用例,并对测试结果进行分析。
unittest除了可以进行常规的单元测试,可经常被各种测试框架绑定使用,如web测试框架selenium。
TestCase类:
下面是一个需要被测试的类widget.py,我们想要测试widget控件当前的size和resize函数
例1. widget.py
# 将要被测试的类
class Widget:
def __init__(self, size = (40, 40)):
self._size = size
def getSize(self):
return self._size
def resize(self, width, height):
if width 0 or height < 0:
raise ValueError, "illegal size"
self._size = (width, height)
def dispose(self):
pass
现在期望能够测试一个widget类的实例的size和resize函数功能,由此创建了widgettestcase类
import unittest
# 执行测试的类
class WidgetTestCase(unittest.TestCase):
def setUp(self):
self.widget = Widget()
def tearDown(self):
self.widget.dispose()
self.widget = None
def testSize(self):
self.assertEqual(self.widget.getSize(), (40, 40))
def testResize(self):
self.widget.resize(100, 100)
self.assertEqual(self.widget.getSize(), (100, 100))
每一个testcase都需要继承unittest类,且包括两个默认函数:setUp和tearDown分别用来做一些初始化工作和收尾工作
剩下两个testSize和testResize函数则是核心测试用例部分
sizeTestCase = WidgetTestCase("testSize")
resizeTestCase = WidgetTestCase("testResize")
最后,需要将他们组织起来执行,这样就引入了testsuite类
完整的单元测试很少只执行一个测试用例,开发人员通常都需要编写多个测试用例才能对某一软件功能进行比较完整的测试,这些相
关的测试用例称为一个测试用例集,在PyUnit中是用TestSuite类来表示的
创建一个unittest的TestSuite,并将上面两个testcase加入suite中,将他们组合起来
def suite():
suite = unittest.TestSuite()
suite.addTest(WidgetTestCase("testSize"))
suite.addTest(WidgetTestCase("testResize"))
return suite
当然,也可以组合多个suitecase,组成一个更庞大的测试用例集合
suite1 = mysuite1.TheTestSuite()
suite2 = mysuite2.TheTestSuite()
alltests = unittest.TestSuite((suite1, suite2))
执行测试用例:
测试用例的执行可以有两种方式
第一种是直接调用unittest的TextTestRunner接口
# 执行测试
runner = unittest.TextTestRunner()
runner.run(suite)
另一种是直接调用main接口,使用它可以很方便地将一个单元测试模块变成可以直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中的测试方法,
并自动执行它们。如果Python程序员能够按照约定(以test开头)来命名所有的测试方法,那就只需要在测试模块的最后加入如下几行代码即可
unittest.main()