在线建设网站搜索网站关键词
文章目录
- 1. 单元测试简介
- 1.1 本质
- 1.2 单元测试框架
- 1.3 参考资料
- 2. unittest框架
- 2.1 框架介绍
- 2.2 测试原理
- 2.3 测试流程
- 2.4 测试准备
- 2.5 代码
- 3. 参数化
- 3.2 excel读取
- 4. 整体代码
- 5. 测试报告
- 5.1 报告样式
- 5.2 测试报告库文件-HTMLTestRunnerNew.py
1. 单元测试简介
1.1 本质
面向对象:封装->类---类属性+类方法/类函数
单元测试的本质---对类函数/方法进行测试
1.2 单元测试框架
unittest
pytest
ddt ---参数化
1.3 参考资料
https://www.cnblogs.com/fennudexiaoniao/p/7771931.html
2. unittest框架
2.1 框架介绍
1. TestCase(测试用例):编写测试用例2. TestSuite(测试套件):放置测试用例的容器,以备执行3. TestLoder:是用来加载 TestCase到TestSuite中4. TextTestRunner:是来执行测试用例的5. TextTestResult:测试结果会保存到TextTestResult实例中6. TestFixture:测试代码的运行环境,包括setUp和tearDown方法
2.2 测试原理
TestLoader加载TestCase到TestSuite中,然后TestRunner运行测试用例,生成的结果保存到TextTestResult中。整个过程集成在unittest.main模块中
2.3 测试流程
1. 编写TestCase:继承自unittest.TestCase方法须以test开头设置断言:self.assertEqual(res, 0)运行单元测试:unittest.main()2. 由TestLoder加载TestCase到TestSuite3. 然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中。
2.4 测试准备
- HTMLTestRunnerNew.py测试报告模板安装
下载链接:链接:https://pan.baidu.com/s/1bGBh4jyiheIz1YARExUgWA
提取码:z13q。下载完成后将文件放在项目目录下或项目运行环境下的Lib目录中。使用时import HTMLTestRunnerNew即可
2.5 代码
- code.py
class Add:def add(self, a, b):return a + b
- test_case.py
import unittest
from zy.Code import Addclass TestAdd(unittest.TestCase): # 测试用例必须继承自父类def setUp(self): # 初始化测试环境print('Start')self.t = Add()def tearDown(self): # 还原测试环境print('End')def test_add_two_positive(self):r = self.t.add(1, 3)try: # 异常处理self.assertEqual(r, -4) # 添加断言,取自父类except AssertionError as e:print('Fail')raise e # 抛出异常print('测试结果是{}'.format(r))def test_add_two_negative(self):r = self.t.add(-1, -3)self.assertEqual(r, -4)print('测试结果是{}'.format(r))def test_add_two_zero(self):r = self.t.add(0, 0)self.assertEqual(r, 0)print('测试结果是{}'.format(r))# 运行测试用例
if __name__ == '__main__':unittest.main()
- execute_case.py
import unittest
from zy.test_case import TestAdd # 导入测试类# 创建测试套件
suite = unittest.TestSuite() # 实例化即可# 添加用例# 方法一:单一添加用例
suite.addTest(TestAdd('test_add_two_positive'))
suite.addTest(TestAdd('test_add_two_negative'))# 方法二:批量添加用例
from zy import test_caseloader = unittest.TestLoader()suite.addTest(loader.loadTestsFromTestCase(TestAdd)) # 加载测试类里的所有用例
suite.addTest(loader.loadTestsFromModule(test_case)) # 加载模块里的所有用例# 执行用例并生成报告# 方法一:txt格式报告
with open('TestResult.txt', 'w+', encoding='utf-8') as f:runner = unittest.TextTestRunner(f, descriptions='20180929', verbosity=2) # verbosity=1/2,参数2报告更详细runner.run(suite) # 执行测试用例# 方法二:引入HTMLTestRunnerNew模块生成Html格式报告
import HTMLTestRunnerNewwith open('TestResult.html','wb+') as f:runner = HTMLTestRunnerNew.HTMLTestRunner(f, title='zy-TestReport', description='20180929', tester='zy')runner.run(suite)
3. 参数化
利用初始化函数进行参数化
- test_case.py
import unittest
from zy.Code import Addclass TestAdd(unittest.TestCase): # 测试用例必须继承自父类def setUp(self): # 初始化测试环境print('Start')self.t = Add()def __init__(self, a, b, expected, methodName): # 参数化,初始化传参super(TestAdd, self).__init__(methodName) # 超继承self.a = aself.b = bself.expected = expecteddef tearDown(self): # 还原测试环境print('End')def test_add(self):r = self.t.add(self.a, self.b)try: # 异常处理self.assertEqual(r, self.expected) # 添加断言,取自父类except AssertionError as e:print('Fail')raise e # 抛出异常print('测试结果是{}'.format(r))# def test_add_two_negative(self):# r = self.t.add(-1, -3)# self.assertEqual(r, -4)# print('测试结果是{}'.format(r))## def test_add_two_zero(self):# r = self.t.add(0, 0)# self.assertEqual(r, 0)# print('测试结果是{}'.format(r))# 运行测试用例
if __name__ == '__main__':unittest.main()
- execute_case.py
import unittest
from zy.test_case import TestAdd # 导入测试类
import HTMLTestRunnerNew# 测试数据
test_data = [[1, 2, 3, '两个整数相加'],[-1, -2, -3, '两个整数相加'],[0, 0, 0, '两个零相加'],[0, 1, 1, '一正一零相加'],[0, -1, -1, '一负一零相加']]# 创建测试套件
suite = unittest.TestSuite() # 实例化即可# 添加用例# suite.addTest(TestAdd(4, 3, 7, 'test_add'))
for i in test_data:print('正在执行{}'.format(i[3]))suite.addTest(TestAdd(i[0], i[1], i[2], 'test_add'))# 执行用例并生成报告
# 方法二:引入HTMLTestRunnerNew模块生成Html格式报告with open('TestResult.html','wb+') as f:runner = HTMLTestRunnerNew.HTMLTestRunner(f, title='zy-TestReport', description='20180929', tester='zy')runner.run(suite)
3.2 excel读取
import openpyxlclass DoExcel:# 读取测试数据def do_excel(self):wb = openpyxl.load_workbook('zy001.xlsx')sheet = wb['table1']# 读取列表头header = []for i in range(1, 4):n = sheet.cell(1, i).valueheader.append(n)# 读取值data = []for i in range(2,4):dict = {}for j in range(1,4):dict[header[j-1]] = sheet.cell(i, j).valuedata.append(dict)return data# 回写测试结果def write_back(self):wb = openpyxl.load_workbook('zy001.xlsx')sheet = wb['table1']sheet.cell(4, 1).value = 12wb.save('zy001.xlsx')if __name__ == '__main__':test_data=DoExcel().do_excel()r = DoExcel().write_back()print(test_data)
4. 整体代码
## code
class Sub:def sub(self, a, b):return a - b## test_case
import unittest
from zy.code import Sub
from zy.do_excel import DoExcelclass TestSub(unittest.TestCase):def setUp(self):self.t = Sub()self.wb = DoExcel()def __init__(self, a, b, expected, title, case_id, methodName):super(TestSub, self).__init__(methodName) ## 超继承self.a = aself.b = bself.expected = expectedself.title = titleself.case_id = case_id ## 使用case_id避免重复def tearDown(self):passdef test_sub(self):print('用例标题:{}'.format(self.title))res = self.t.sub(self.a, self.b)try:self.assertEqual(res, self.expected)test_result = 'PASS'except AssertionError as e:test_result = 'FAIL'raise efinally:self.wb.write_back(self.case_id+1, res, test_result)## suite
import unittest
from zy.test_case import TestSub
from zy.do_excel import DoExcel
import HTMLTestRunnerNewtest_data = DoExcel().read_data()suite = unittest.TestSuite()
for item in test_data:suite.addTest(TestSub(item['param_a'], item['param_b'], item['ExpectedResult'], item['title'], item['case_id'], 'test_sub'))with open('TestResult.html', 'wb+') as file:runner = HTMLTestRunnerNew.HTMLTestRunner(file, title='减法测试', description='第二轮整体回归测试减法方法的正确性', tester='华杰-zy')runner.run(suite)
## do_excel
import openpyxlclass DoExcel:def read_data(self):wb = openpyxl.load_workbook('test_data.xlsx')sheet = wb['model1']header = []for column in range(1, 6):header.append(sheet.cell(1, column).value)test_data = []for row_id in range(2, 10):row_data = {}for column_id in range(1, 6):row_data[header[column_id-1]] = sheet.cell(row_id, column_id).valuetest_data.append(row_data)return test_datadef write_back(self, row_id, ActualResult, TestResult):wb = openpyxl.load_workbook('test_data.xlsx')sheet = wb['model1']sheet.cell(row_id, 6).value = ActualResultsheet.cell(row_id, 7).value = TestResultwb.save('test_data.xlsx')if __name__ == '__main__':test_data = DoExcel().read_data()print(test_data)
5. 测试报告
5.1 报告样式
5.2 测试报告库文件-HTMLTestRunnerNew.py
下载链接: https://pan.baidu.com/s/1rZ1BFWraqgUKszKzBFpQnw 密码: 9eqt