为了提高驾驭更多代码的能力,非常有必要在编写代码的过程中,引入测试,特别是单元测试。这正好也是TDD(测试驱动开发)的思想。要修改一个被很多地方调用的函数,先写这个函数的单元测试,测试通过后修改函数,再重新测试,确保函数功能没有发生变化或异常。
python标准的unittest模块,可以很好的支持代码编写过程中随时都要用到的单元测试,支持TDD的落地。本文介绍简单实用unittest进行单元测试基本技巧。
假设有一个文件misc.py,里面有两个函数ehex和ebin,现在要给这两个函数编写单元测试用例。我们创建一个test.py文件,这个test.py文件中的代码如下:
import unittest
from misc import ehex, ebin
class Test(unittest.TestCase):
def test_ehex(self):
self.assertEqual(ehex(1), '0x01')
self.assertEqual(ehex(123), '0x7B')
self.assertEqual(ehex(255), '0xFF')
self.assertEqual(ehex(567), '0x0237')
self.assertEqual(ehex(5678), '0x162E')
self.assertEqual(ehex(123456789), '0x075BCD15')
with self.assertRaises(ValueError):
ehex(-1)
def test_ebin(self):
self.assertEqual(ebin(1), '0b00000001')
self.assertEqual(ebin(123), '0b01111011')
self.assertEqual(ebin(255), '0b11111111')
with self.assertRaises(ValueError):
ebin(-1)
self.assertRaises(ValueError, ebin, 256)
if __name__ == '__main__':
unittest.main()
首先import unittest模块,然后引入要测试的函数。编写一个自己的类,继承自unittest.TestCase。然后开始写测试代码,每个测试成员函数,都必须以test_开头,否则unittest库就检测不到,就不能自动运行测试代码。self.assertEqual用来进行是否相等的判断,self.assertRaises用来进行是否有异常抛出的判断。这类assert*函数还有很多。
最后就是调用unittest.main()。运行单元测试的方法:
$ python3 test.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK
$ python3 test.py -v
test_ebin (__main__.Test) ... ok
test_ehex (__main__.Test) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK
我喜欢加上-v参数,输入更详细一些。
以上就是unittest模块的基本实用框架,这个模块还有很多其它的assert*函数可以实用,用来进行更复杂的函数返回的判断,还有更多更丰富的功能。请参考python官方的详细介绍:https://docs.python.org/3/library/unittest.html
重要的基础函数,任何一代修改都很关键,如果有单元测试代码支撑,修改起来会更加有信心。
-- EOF --