编写函数或类时,还可以为其编写测试。通过测试,可确定代码面对各种输入都能够按照要求那样工作。
单元测试和测试用例:
单元测试用于核实蛮熟的某个方面没有问题;测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求。
良好的测试用例考虑到了函数可能收到的各种输入,包含针对这些所有情形的测试。
全覆盖测试用例包含一整套单元测试,涵盖了各种可能的函数使用方式。对于大型项目,要实现覆盖可能很难。所以通常,最初只要针对
代码的重要行为编写测试即可,等项目被广泛使用率再考虑全覆盖。
范例代码:
#!/usr/bin/env python
#filename = name_function.py
def get_formated_name(first,last):
full_name = first + ‘ ‘ + last
return full_name
定义了一个函数模块,叫做get_formated_name
编写一个测试代码,对这个函数进行测试!
#!/usr/bin/env python
import unittest
from name_function import get_formated_name
class Test_names(unittest.TestCase): ①
def test_first_last_name(self):
formated_name = get_formated_name(‘xue‘,‘lingming‘) ②
self.assertEqual(formated_name , ‘xue lingming‘) ③
unittest.main()
首先,导入模块unittest(这是个class),和需要测试的函数get_formatted_name
在1处,创建一个类,这个类的名字叫做Test_names(可以随意定义),在这个类中必须继承unittest的一个子类
unittest.TestCase,这个类中只包含一个方法,用于测试get_formatted_name是否可以正确格式化名字。
在unittest模块的测试代码下,所有test_开始的方法都是自动运行的。
在3处,我们使用了unittest类最有用的功能之一:断言
用来核实得到的结果是否与期望的结果一直。
代码self.assertEqual(formated_name , ‘xue lingming‘) 的意思是说:“将formated_name的值与‘xue lingming‘进行比较
如果相等就万事大吉,如果不同就报告’’”
运行这个测试脚本的结果:
"test_name_function.py" 11L, 291C written
[[email protected] Alben-PY]# ./test_name_function.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
修改上面的函数,让其可以处理中间名:
#!/usr/bin/env python
#filename = name_function.py
def get_formated_name(first,middle,last):
full_name = first + ‘ ‘ + middle + ‘ ‘ + last
return full_name
再次测试:
报错了!!!
[[email protected] Alben-PY]# ./test_name_function.py
E """"""""这个E代表Error""""""""
======================================================================
ERROR: test_first_last_name (__main__.Test_names)
----------------------------------------------------------------------
Traceback (most recent call last):
File "./test_name_function.py", line 8, in test_first_last_name
formated_name = get_formated_name(‘xue‘,‘lingming‘)
TypeError: get_formated_name() missing 1 required positional argument: ‘last‘ 这一行提示我们少一个实参‘last‘
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
解读——
因为在函数name_function中,我们定义了三个形参“first,middle,last”而测试代码中,只传递了2个位置实参,导致形参‘last’没有获取到实参,进而报错了。
处理方法:把形参middle定义为可选形参,并且微调主体脚本
#!/usr/bin/env python
#filename = name_function.py
def get_formated_name(first,last,middle=‘‘):
if middle:
full_name = first + ‘ ‘ + middle + ‘ ‘ + last
else:
full_name = first + ‘ ‘ + last
return full_name
只需注意一下,带有默认值的可选形参必须放在最后一个。
测试效果:
[[email protected] Alben-PY]# ./test_name_function.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK