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