参考资料:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140137128705556022982cfd844b38d050add8565dcb9000
今天学习了Python支持的两种测试模式:单元测试和文档测试。
1、单元测试。单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。Python提供了编写和运行单元测试用例的机制。
(1)为了编写单元测试,我们需要引入Python自带的unittest模块。
(2)编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承。
(3)以test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行。对每一类测试都需要编写一个test_xxx()方法。
(4)由于unittest.TestCase提供了很多内置的条件判断,我们只需要调用这些方法就可以断言输出是否是我们所期望的。常用的断言包括:
assertEquals(表达式1,表达式2):如果表达式1=表达式2,则测试通过,否则抛出异常。
with assertRaises(错误类型):
...
如果执行...部分代码时能抛出指定的错误类型则测试通过,否则抛出异常。
(5)一旦编写好单元测试,我们就可以运行单元测试。最简单的运行方式是测试代码的最后加上两行代码:
(2)编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承。
(3)以test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行。对每一类测试都需要编写一个test_xxx()方法。
(4)由于unittest.TestCase提供了很多内置的条件判断,我们只需要调用这些方法就可以断言输出是否是我们所期望的。常用的断言包括:
assertEquals(表达式1,表达式2):如果表达式1=表达式2,则测试通过,否则抛出异常。
with assertRaises(错误类型):
...
如果执行...部分代码时能抛出指定的错误类型则测试通过,否则抛出异常。
(5)一旦编写好单元测试,我们就可以运行单元测试。最简单的运行方式是测试代码的最后加上两行代码:
if __name__ == '__main__':
unittest.main()
这样就可以把测试代码当作正常的Python脚本运行。
另一种更常见的方法是在命令行通过参数-m unittest直接运行单元测试。
(6)此外,可以在单元测试中编写两个特殊的setUp()和tearDown()方法。这两个方法会分别在每调用一个测试方法的前后分别被执行。
另一种更常见的方法是在命令行通过参数-m unittest直接运行单元测试。
(6)此外,可以在单元测试中编写两个特殊的setUp()和tearDown()方法。这两个方法会分别在每调用一个测试方法的前后分别被执行。
2、文档测试。Python支持直接在要测试的代码注释中给出测试范例,然后以文档测试模式运行待测试的代码。
下面是我的学习代码:
#定义一个待测试的类
class MyDict(dict):
'''
Simple dict but also support access as x.y style.
>>> d1 = MyDict()
>>> d1['x'] = 100
>>> d1.x
100
>>> d1.y = 200
>>> d1['y']
200
>>> d2 = MyDict(a=1, b=2, c='3')
>>> d2.c
'3'
>>> d2['empty']
Traceback (most recent call last):
...
KeyError: 'empty'
>>> d2.empty
Traceback (most recent call last):
...
AttributeError: 'MyDict' object has no attribute 'empty'
'''
def __init__(self, **kw):
super(MyDict, self).__init__(**kw)
def __getattr__(self, key):
try:
return self[key]
except KeyError:
raise AttributeError(r"'MyDict' object has no attribute '%s'" % key)
def __setattr__(self, key, value):
self[key] = value
#加入下面的代码后,运行该代码文件时,即可执行在注释中给出的测试范例
if __name__ == '__main__':
#引用文档测试模块
import doctest
doctest.testmod()
下面的代码,定义了一个针对MyDict类的单元测试。
import unittest
import time
from day8 import MyDict
class MyDictTest(unittest.TestCase):
def setUp(self):
print 'start TestCase at ', time.strftime('%Y-%m-%d %H:%M:%S:%',time.localtime(time.time()))
def tearDown(self):
print 'end TestCase at ', time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
#测试用例1 测试继承自dict的基本操作
def test_init(self):
d = MyDict(a = 1, b = 'test')
self.assertEquals(d.a, 1)
self.assertEquals(d.b, 'test')
self.assertTrue(isinstance(d, dict))
#测试用例2 测试继承自dict的属性用法
def test_key(self):
d = MyDict()
d['key'] = 'value'
self.assertEquals(d.key, 'value')
#测试用例3 测试MyDict的属性用法
def test_attr(self):
d = MyDict()
d.key = 'value'
self.assertEquals(d['key'], 'value')
#测试用例4 测试继承自dict的属性访问不存在的情况
def test_keyerror(self):
d = MyDict()
with self.assertRaises(KeyError):
value = d['empty']
#测试用例5 测试MyDict的属性访问不存在的情况
def test_attrerror(self):
d = MyDict()
with self.assertRaises(AttributeError):
value = d.empty
if __name__ == '__main__':
unittest.main()
有点疑问,在上面代码的setUp和tearDown定义中,怎么能知道当前执行的是哪个测试用例呢?
今天就学到这里啦,下一节从IO编程学起。