在python中可以使用unittest做单元测试。unittest非常强大,本文以计算器的加、减、乘、除四则运算为例简单总结一下unittest的使用框架。
一、准备工作:
按如下方式创建工程:
my_calculator_fun.py :测试类
my_calculator_fun_testcase.py:测试用例类
my_calculator_fun_testsuits.py:测试用例集类
my_calculator_fun_run.py:执行测试并生成报告
TestCase.log、TestResult.html、TestResult.txt :生成的测试报告(执行时使用了3种方法,故生成了3份报告)
二、代码实现
1、my_calculator_fun.py :测试类
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @author: 陈所长
class MathMethod:
def __init__(self,a,b):
self.a = a
self.b = b
def add(self):
"""
定义两个数的加法
:return:
"""
return self.a + self.b
def sub(self):
"""
两个数的差
:return:
"""
return self.a - self.b
def division(self):
"""
两个数的除法,除数不能为0
:return:
"""
try:
return self.a / self.b
except ZeroDivisionError as e:
print("两数相除,除数不可为0")
raise e
def mul(self):
"""
两个数的乘积
:return:
"""
return self.a * self.b
2、my_calculator_fun_testcase.py:测试用例类
# -*- coding: utf-8 -*-
# @author: 陈所长
import unittest
# import inspect
from class_11_unittest.homework_file.my_calculator_fun import MathMethod
class TestMathMethod(unittest.TestCase):
"""
测试数学计算程序
"""
def setUp(self):
"""
重写父类的setUp方法,在每条用例执行之前都会调用
:return:
"""
self.file_name = 'TestCase.log'
self.file = open(self.file_name,mode='a',encoding='utf8')
self.file.write('{:*^40s}\n'.format('开始执行用例'))
def test_two_num_add(self): # 必须用test开头
"""
测试两个数相加
:return:
"""
result = MathMethod(1,2).add()
msg = '测试两个数相加失败'
try:
self.assertEqual(result,4,msg='测试失败') # 使用断言语句,(语气结果,实际结果)进行比较
except AssertionError as e:
self.file.write("{},执行结果为:{}\n具体异常为:{}\n".format(msg, "Fail", e))
raise e
else:
self.file.write("{},执行结果为:{}\n".format(msg, "Pass"))
def test_two_num_sub(self):
result = MathMethod(-1,-2).sub()
msg = '执行两个数相减失败'
try:
self.assertEqual(result,1)
except AssertionError as e:
self.file.write("{},执行结果为:{}\n具体异常为:{}\n".format(msg, "Fail", e))
raise e
else:
self.file.write("{},执行结果为:{}\n".format(msg, "Pass"))
def test_two_num_mul(self):
"""
测试两个数相乘
:return:
"""
result = MathMethod(2,-2).mul()
msg = '执行两个数乘失败'
try:
self.assertEqual(result,2)
except AssertionError as e:
self.file.write("{},执行结果为:{}\n具体异常为:{}\n".format(msg, "Fail", e))
raise e
else:
self.file.write("{},执行结果为:{}\n".format(msg, "Pass"))
def test_two_num_division(self):
"""
测试两个数相除
:return:
"""
result = MathMethod(2,-2).division()
msg = '执行两个数相除失败'
try:
self.assertEqual(result,-1)
except AssertionError as e:
self.file.write("{},执行结果为:{}\n具体异常为:{}\n".format(msg, "Fail", e))
raise e
else:
self.file.write("{},执行结果为:{}\n".format(msg, "Pass"))
def tearDown(self):
"""
重写父类的tearDown方法,每条用例执结束时会调用
:return:
"""
self.file.write('{:*^40s}\n\n'.format('执行用例结束'))
self.file.close()
if __name__ == '__main__':
unittest.main()
# 在一个测试类中,用例执行的顺序是按照实例方法名的ascii从小到大进行排序执行
# 鼠标点击在哪条用例上就执行哪条用例
# 如果使用try...catch...进行异常捕获,则所有的异常都会被统计,需要手动使用raise抛出异常
# unittest中的断言类型的种类
3、my_calculator_fun_testsuits.py:测试用例集类
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @author: 陈所长
import unittest
from class_11_unittest.homework_file.my_calculator_fun_testcase import TestMathMethod
# step1:创建测试套件
my_suit = unittest.TestSuite()
# step2:测试套件加载测试用例
# 第1种方法:通过测试对象加载
my_suit.addTest(TestMathMethod('test_two_num_add'))
# 第2种方法:通过测试类批量添加
my_suit.addTest(unittest.TestLoader().loadTestsFromTestCase(TestMathMethod))
# 第3种方法:通过测试模块批量进行加载
from class_11_unittest.homework_file import my_calculator_fun_testcase as test_module
my_suit.addTest(unittest.TestLoader().loadTestsFromModule(test_module))
# 第4种方法:通过测试用例名称添加
my_suit.addTest(unittest.TestLoader().loadTestsFromName('test_two_num_sub',test_module))
# 第5种方法:通过discover进行覆盖
my_suit.addTest(unittest.TestLoader().discover(r'D:\PythonPro\free_lemon_Python\class_11_unittest\homework_file',
pattern='test_*',top_level_dir=None)
)
4、my_calculator_fun_run.py:执行测试并生成报告
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @author: 陈所长
import unittest
# HTMLTestRunnerNew 需要自己从网上下载,下载完成之后放到 C:\Python37\Lib 下
import HTMLTestRunnerNew
import class_11_unittest.homework_file.my_calculator_fun_testsuits as suit_1
# 1.直接执行,把日志打印在控制台
# runner_1 = unittest.TextTestRunner()
# runner_1.run(suit_1.my_suit)
# 2.生成TXT测试测试报告
# with open('TestResult.txt','w+') as ResultTxt:
# runner_2 = unittest.TextTestRunner(ResultTxt,'这个是第二种方式生成的测试报告',2)
# runner_2.run(suit_1.my_suit)
# 3.生成HTML报告
with open('TestResult.html','wb+') as f:
runner_3 = HTMLTestRunnerNew.HTMLTestRunner(f,2,title='计算器测试报告',description='单元测试第一次',\
tester='陈所长')
runner_3.run(suit_1.my_suit)
三、生成的测试报告
使用的HTMLTestRunnerNew生成的测试报告截图如下:
按照以上方式即可把玩一下python的unittest,做一个简单的单元测试。
年轻人多吃泡面少说话。