1 单元测试框架
1.1 认识单元测试
Unittest提供了全局的main()方法,使用他可以方便地将一个单元测试模块变成可以直接运行的测试脚本。Main()方法使用testloader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行它们。
If __name__ == “___main__”:直接使用
1.1.1 Test case
一个完整的测试流程,包括测试前准备环境的搭建(setUP)、实现测试过程中的代码(run)、以及测试后环境的还原(tearDown)。单元测试(unit test)的本质也在这里,一个测试用例就是一个完整的测试单元。
1.1.2 Test suite
把多个测试用例集合在一起执行,就产生了测试套件testsuite的概念,test suite用来组装单个测试用例,可以通过addtest加载testcase到testsuite中,从而返回一个testsuite实例。
1.1.3 Test runner
在unittest单元测试框架中,通过texttestrunner类提供的run()方法来执行test suite/test case。Test runner可以使用图形界面、文本界面,或返回一个特殊的值等方式来表示测试执行的结果。
1.1.4 Test fixture
对于一个测试环境的搭建和销毁,就是一个fixture, 通过覆盖testcase的setUP()和tearDown()方法来实现。有什么用呢,比如说在这个测试用例中需要访问数据库,那么可以通过setup()中通过建立数据库连接来进行初始化,在teardown()中清除数据库产生的数据,然后关闭连接等。
1.2 断言方法
# 0517005:AssertTest import unittest class test(unittest.TestCase): def setUp(self): print ('') print ('test:assert:start') def test_case1(self): self.assertEqual(10,8,msg='assertEqual:相等。结果:不相等') def test_case2(self): self.assertNotEqual(10,8,msg='assertNotEqual:不相等。结果:OK') def test_case3(self): self.assertIs('aa','bb',msg='assertIs:是。结果:不是') def test_case4(self): self.assertIsNot('aa','bb',msg='assertIsNot:不是。结果:OK') def test_case5(self): self.assertIn('aa','aabb',msg='assertIn:存在。结果:OK') def test_case6(self): self.assertNotIn('aa','aabb',msg='assertNotIn:不存在。结果:存在') def tearDown(self): print ('test:assert:OVER') pass if __name__ == '__main__': unittest.main() ''' assertIsNone:为空 assertIsNotNone:不为空 assertIsInstance(a,b):a为b的一个实例 assertIsNotInstance(a,b):a不为b的一个实例 '''
1.3 测试套件
调用的calculator.py
#0517006:calculator:add test # 计算器类 class count: def __init__(self,a,b): self.a = int(a) self.b = int(b) def add(self): return self.a + self.b
1.3.1 含一个用例
测试集包含1个用例:suite.addTest()
#0517007:suite:just one from calculator import count import unittest class testcount(unittest.TestCase): def setUp(self): print('Test Start') def test_add1(self): j = count(2,3) self.assertEqual(j.add(),5,msg= '错了1') def test_add2(self): j = count(3,3) self.assertEqual(j.add(),5,msg= '错了2') def test_add3(self): j = count(3,8) self.assertEqual(j.add(),11,msg= '错了3') def tearDown(self): print('Test Over') if __name__ == '__main__': #构造测试集 suite = unittest.TestSuite() #测试集包含1个用例:suite.addTest() suite.addTest(testcount('test_add3')) suite.addTest(testcount('test_add2')) #执行测试 runner = unittest.TextTestRunner() runner.run(suite)
执行结果:
>>> RESTART: C:\Users\tians\AppData\Local\Programs\Python\Python36\example-JLL\modules\002-calculator\test-suite.py Test Start Test Over .Test Start Test Over F ====================================================================== FAIL: test_add2 (__main__.testcount) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\Users\tians\AppData\Local\Programs\Python\Python36\example-JLL\modules\002-calculator\test-suite.py", line 58, in test_add2 self.assertEqual(j.add(),5,msg= '错了2') AssertionError: 6 != 5 : 错了2 ---------------------------------------------------------------------- Ran 2 tests in 0.064s FAILED (failures=1) >>>
1.3.2 含多个用例
测试集包含多个用例suite.addTests()
#0517006:suite:many from calculator import count import unittest class testcount(unittest.TestCase): def setUp(self): print('Test Start') def test_add1(self): j = count(2,3) self.assertEqual(j.add(),5,msg= '错了1') def test_add2(self): j = count(3,3) self.assertEqual(j.add(),5,msg= '错了2') def test_add3(self): j = count(3,8) self.assertEqual(j.add(),11,msg= '错了3') def tearDown(self): print('Test Over') if __name__ == '__main__': #构造测试集 suite = unittest.TestSuite() #测试集包含多个用例suite.addTests() tests = [testcount('test_add1'), testcount('test_add2')] suite.addTests(tests) # 或直接写入:suite.addTests([testcount('test_add1'), testcount('test_add2')]) #执行测试 runner = unittest.TextTestRunner() runner.run(suite)
执行结果:
>>> RESTART: C:\Users\tians\AppData\Local\Programs\Python\Python36\example-JLL\modules\002-calculator\test-suite.py Test Start Test Over .Test Start Test Over F ====================================================================== FAIL: test_add2 (__main__.testcount) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\Users\tians\AppData\Local\Programs\Python\Python36\example-JLL\modules\002-calculator\test-suite.py", line 16, in test_add2 self.assertEqual(j.add(),5,msg= '错了2') AssertionError: 6 != 5 : 错了2 ---------------------------------------------------------------------- Ran 2 tests in 0.066s FAILED (failures=1) >>>