AnndyR 2020-02-22
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中最核心的四部分是:TestCase,TestSuite,TestRunner,TestFixture
再说这几个类之前,我们先来回顾一下自动化测试的步骤:
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()
下面我们一条一条去执行:
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)