python单元测试之unittest框架
python单元测试之unittest框架
一、什么是单元测试
单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。
比如对于函数abs(),我们可以编写的测试用例为:
(1)输入正数,比如1、1.2、0.99,期待返回值与输入相同
(2)输入复数,比如-1、-1.2、-0.99,期待返回值与输入相反
(3)输入0,期待返回0
(4)输入非数值类型,比如None、[]、{}、期待抛出TypeError
把上面这些测试用例放到一个测试模块里,就是一个完整的单元测试
我们先写一个需要测试的类:
1 import unittest 2 class MathFunc: 3 def __init__(self,a,b): 4 self.a = a 5 self.b = b 6 7 def add(self): 8 return self.a + self.b 9 10 def multi(self): 11 return self.a * self.b
二、unittest工作原理
unittest中最核心的四部分是:TestCase,TestSuite,TestRunner,TestFixture
再说这几个类之前,我们先来回顾一下自动化测试的步骤:
- 编写用例 TestCase
- 执行用例 TestSuite存储用例 TestLoader 加载用例
- 对比结果 期望结果 判定是否通过 assert
- 出具测试报告 TextTestRunner
1 class TestMathMulti(unittest.TestCase): 2 # 一个用例就是一个函数 不能传参数 只有一个实例self 3 # 所有用例都是test开头 否则unittest无法识别 4 5 def test_Multi_positive(self): 6 #测试两个正数相加 7 res = MathFunc(1,2).multi() 8 print(res) 9 10 def test_Multi_zero(self): 11 # 测试两个0相加 12 res = MathFunc(0,0).multi() 13 print(res) 14 15 def test_Multi_negative(self): 16 #测试两个负数相加 17 res = MathFunc(-1,-2).multi() 18 print(res) 19 20 if __name__ == '__main__': 21 unittest.main()
下面我们一条一条去执行:
1 import unittest 2 from Prepares.class_01 import TestMathFunc 3 from HTMLTestRunner import HTMLTestRunner 4 # A class whose instances are single test cases. 5 # 这个类的实例是一个单独的用例 6 suite = unittest.TestSuite() # 存储用例 7 suite.addTest(TestMathFunc("test_add_positive")) 8 # 执行 9 runner =unittest.TextTestRunner() runner.run(suite)
第二种方法:加载全部用例
1 from Prepares import class_01 2 loader = unittest.TestLoader() 3 suite.addTest(loader.loadTestsFromModule(class_01))
生成txt版本测试报告:
with open('UnittestTextReport.txt', 'a') as f: runner = unittest.TextTestRunner(stream=f, verbosity=2) runner.run(suite)
生成HTML版的测试报告:
1 with open('HTMLReport.html', 'wb') as f: 2 runner = HTMLTestRunner(stream=f, 3 title='MathFunc Test Report', 4 description='generated by HTMLTestRunner.', 5 verbosity=2 ) 6 runner.run(suite)