文章目录
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到TestSuite
3. 然后由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 Add
class 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_case
loader = 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 HTMLTestRunnerNew
with 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 Add
class 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 = a
self.b = b
self.expected = expected
def 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 openpyxl
class 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).value
header.append(n)
# 读取值
data = []
for i in range(2,4):
dict = {}
for j in range(1,4):
dict[header[j-1]] = sheet.cell(i, j).value
data.append(dict)
return data
# 回写测试结果
def write_back(self):
wb = openpyxl.load_workbook('zy001.xlsx')
sheet = wb['table1']
sheet.cell(4, 1).value = 12
wb.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 DoExcel
class 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 = a
self.b = b
self.expected = expected
self.title = title
self.case_id = case_id ## 使用case_id避免重复
def tearDown(self):
pass
def 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 e
finally:
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 HTMLTestRunnerNew
test_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 openpyxl
class 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).value
test_data.append(row_data)
return test_data
def write_back(self, row_id, ActualResult, TestResult):
wb = openpyxl.load_workbook('test_data.xlsx')
sheet = wb['model1']
sheet.cell(row_id, 6).value = ActualResult
sheet.cell(row_id, 7).value = TestResult
wb.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