27. Python脚本学习笔记二十七 测试及测试工具
本篇名言:“累了请将心靠岸;错了请不要后悔;苦了才懂得满足;受伤了才明白坚强;醉了才知道难忘;笑了才体会美丽;闲了想想我吧!”
程序员总是在做着3样事情“编辑,编译,运行”。
当然Python程序员不要进行编译操作了,就是编辑和运行。
对程序的各个部分建立测试是非常重要的,称为单元测试。
极限编程的,先测试后编码方法也被称为测试驱动编程。
1. 精确的需求说明
开发软件的某部分时,必须知道软件要解决什么问题,写一份需求说明来明确程序的目标。需求说明是描述程序必须满足的需求文档。
程序设计的理念是以编写测试程序开始,便后编写可以通过测试的程序。测试程序是你的需求说明,帮助在开发程序时候不偏离需求。
测试程序类似如下:
from area import rect_area
height = 3
width = 4
correct_answer = 12
answer = rect_area(height, width)
if answer == correct_answer:
print 'Test passed '
else:
print 'Test failed '
我们输入一个长和宽,期望得到12.
2. 为改变而计划
程序员要随时做好修改代码的准备,而不是固守程序。当然如果程序设计的足够好,改变产生的影响应该是局部的,并且只影响代码的一小部分。
3. 驱动测试过程
l 指出需要的新特性,记录下来,并编写一个测试
l 编写特性的概要代码,没有语法错误即可。在试图测试成功前,先要看到它失败。
l 为特性的概要编写虚设代码,满足测试要求即可。
l 重写或重构代码,保证测试一直成功。
4. 测试工具
标准库中的模块可以帮助我们一臂之力,有两个很棒的模块
unites:通用测试框架。
doctest:简单一些的模块,是检查文档用的,对于编写单元测试也很在行。
4.1 doctest
例如定义一个文件如下test.py:
def square(x):
'''
Squares a number and returns the result.
>>> square(2)
4
>>> square(3)
9
'''
return x*x
if__name__=='__main__':
importdoctest,Chapter1
doctest.testmod(Chapter1)
执行python test.py -v
输出如下:
E:\ >python test.py -v
Trying:
square(2)
Expecting:
4
ok
Trying:
square(3)
Expecting:
9
ok
1 items had no tests:
Chapter1
1 items passed all tests:
2tests in Chapter1.square
2 tests in 2 items.
2 passed and 0 failed.
Test passed.
可见,testmod函数检查模块的文档字符串以及函数的文档字符串。
4.2 unittest
doctest简单易用,unittest是基于Java的流行测试框架JUnit,更灵活和强大。利用unittest能更加结构化的方式编写大型且周祥的测试组。
示例:
importunittest, my_math
class ProductTestCase(unittest.TestCase):
def testIntegers(self):
for x in xrange(-10, 10):
for y in xrange(-10, 10):
p = my_math.product(x, y)
self.failUnless(p ==x*y, 'Integer multiplication failed')
def testFloats(self):
for x in xrange(-10, 10):
for y in xrange(-10, 10):
x = x/10.0
y = y/10.0
p = my_math.product(x, y)
self.failUnless(p ==x*y, 'Float multiplication failed')
if__name__ == '__main__': unittest.main()
def product(x,y):
return x*y
运行输出如下:
..
----------------------------------------------------------------------
Ran 2tests in 0.003s
OK
unittest.main函数负责运行测试。它会实例化所有TestCase的子集,运行所有名字以test开头的方法。如果定义了setUp和setDown的方法,就会在所有测试提供一般的初始化和清理代码,这被称为测试夹具。
一些有用的TestCase方法
关于unittest的GUI,可以参看PyUnit