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

再说这几个类之前,我们先来回顾一下自动化测试的步骤:

  1. 编写用例 TestCase
  2. 执行用例 TestSuite存储用例 TestLoader 加载用例
  3. 对比结果 期望结果 判定是否通过 assert
  4. 出具测试报告 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)

 

posted @ 2020-02-22 14:43  caixinxinog  阅读(247)  评论(0编辑  收藏  举报