Python单元测试标准库unittest简单学习
1.背景
当需要测试较为复杂的module,class或者系统的功能时,如果一个一个的去测试就会显得很麻烦,如果每项测试又有一定的配置或者设置的话,比如每个测试都要新建一个对象之类的,那就更麻烦了。单元测试的初衷就是使得这些测试自动化,高效率的完成。有人可能会说自己写个程序全部用assert来判断就可以了啊,然而,assert在raise一个exception之后就停止工作了,自己再从头构建一个测试系统当然也可以,但是标准库unittest已经完成了这项工作,有必要了解下,避免重复造轮子。
2.单元测试中的几个重要的概念
(1)test fixture
test fixture是在进行单元测试前后所必须进行的操作,比如在每此测试前,创建数据库,新建文件,或者打开服务器;每次测试后的关闭文件,关闭服务器或者其他清理工作等。更直白的说,就是为单元测试顺利进行及结束所“营造”的一种环境。
(2)test case
test case是单元测试的最基本的要素,即单一场景被测试的正确与否,在单元测试中是以unittest.TestCase的实例来表现的,任何test cases必须是TestCase子类的实例。test case必须是自洽的(self contained),这样才能独立运行或者自由的跟其他test case组合在一起被测试。
(3)test suite
是test case,甚至与test suite的集合,用来进行一起有机的整体的测试。
(4) test runner
test runner 是一个可以有序的进行测试工作,然后把结果反馈给用户的组件,它可以是GUI,或者命令窗口式的,等等。
3.基本操作
以一个简单的例子来说明:
import unittest class TestStringMethods(unittest.TestCase): def test_upper(self): self.assertEqual('foo'.upper(), 'FOO') def test_isupper(self): self.assertTrue('FOO'.isupper()) self.assertFalse('Foo'.isupper()) def test_split(self): s = 'hello world' self.assertEqual(s.split(), ['hello', 'world']) # check that s.split fails when the separator is not a string with self.assertRaises(TypeError): s.split(2) if __name__ == '__main__': unittest.main()
先上一个小的单元测试代码片段(用来测试string类的方法),通过TestStringMethods类(是unittest.TestCase的子类)来创建一个test case,该类的3个方法均以 'test'开头,这个告诉了test runner 哪些方法要被测试。
每个测试的关键是用assertEqual来核查预定结果,用assertTrue或者assertFalse来核查条件,用assertRaises来核查是否既定的exception被捕捉。
之前说test fixture的概念,那么“营造”测试的环境的工作是谁来完成的呢?答案是 setUp() 和 tearDown(),如果每次的测试前都需要 dosomething(),那么就把 dosomething() 放在setUp()方法中,如果每次测试后都需要 doanotherthing(),那么就把 doanotherthing()放在 tearDown()下;需要注意的是如果 setUp()报错了,就不再测试了,如果setUp()没报错,tearDown()都会被执行,不论测试成功与否。
4.启动方法
值得一提的是,最好将测试代码与被测试代码分成不同的文件。在测试时,可以直接运行测试代码,或者通过命令的方法。
python -m unittest test_module1 test_module2 python -m unittest test_module.TestClass python -m unittest test_module.TestClass.test_method python -m unittest tests/test_something.py python -m unittest -v test_module #冗杂模式,即提供更多测试信息
5.更多
详见python 官方文档。