Uinttest +excel结合使用--详细讲解 ----放到csdn上去哈
两种方式:1、超继续 2、ddt(推荐使用)
测试类:
unittest 单元测试,通过单元测试,实现对自己写的类的测试
TestCase self.assert 异常处理
参数化:
用Excel 写成类,有三种方法:
1、excel 无表头,一次性加载所有数据
2、excel无表头,使用的时候,再加载数据
3、excel有表头,按表头去加载数据
一、使用DDT的方式
注意:使用ddt的话,不能通过【suite.addTest】--这种创建实例的方式加载用例
代码实现如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File : test_suite.py
import HTMLTestRunner
import unittest
from ddt_excel.test_http import TestHttp
# 使用ddt的话,不能通过【suite.addTest】--这种创建实例的方式加载用例
suite = unittest.TestSuite()
loader = unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(TestHttp))
# 执行用例
with open("test_summer.html", "wb") as file:
testrunner = HTMLTestRunner.HTMLTestRunner(stream=file, verbosity=2, title=None, description=None)
testrunner.run(suite)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File : test_http.py
import unittest
from test_excel_case import GetData
from test_excel_case.http_request import HttpRequest
from ddt import ddt, data, unpack
from ddt_excel.do_excel import DoExcel
# test_data = DoExcel("test.xlsx", 'test').get_data()
test_data = DoExcel("test.xlsx", 'test').get_data([1, 2])
@ddt
class TestHttp(unittest.TestCase):
def setUp(self):
pass
@data(*test_data)
def test_api(self, item):
res = HttpRequest().http_request(item['url'], item['data'], item['method'])
if res.cookies: # 如果cookie有的话,那么就更新cookie
setattr(GetData, 'Cookie', res.cookies) # 反射
try:
self.assertEqual(item['expected'], res.json()['code'])
except AssertionError as e:
print("test_api's error is {}".format(e))
raise e
print(res)
def tearDown(self):
pass
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File : do_excel.py
from openpyxl import load_workbook
class DoExcel:
def __init__(self, file_name, sheet_name):
self.file_name = file_name
self.sheet_name = sheet_name
self.sheet_obj = load_workbook(self.file_name)[self.sheet_name] # 获取一个表单对象
def get_data(self, mode='all'):
'''mode 控制是否执行所有的用例,默认值:all,为all就执行所有用例
如果不等于all的话就进入分值判断
mode,只能输入 all 、列表 这两种类型的参数
'''
wb = load_workbook(self.file_name)
sheet = wb[self.sheet_name]
test_data = []
for i in range(2, sheet.max_row + 1):
sub_data = {}
sub_data['case_id'] = sheet.cell(i, 1).value
sub_data['module'] = sheet.cell(i, 2).value
sub_data['title'] = sheet.cell(i, 3).value
sub_data['method'] = sheet.cell(i, 4).value
sub_data['url'] = sheet.cell(i, 5).value
sub_data['data'] = sheet.cell(i, 6).value
sub_data['expected'] = sheet.cell(i, 7).value
test_data.append(sub_data)
print(test_data)
# 根据mode的值去进行判断
if mode == 'all': # 执行所有用例
final_data = test_data
else: # [1,2,3,4]和case_id
final_data = []
for item in test_data: # 对test_data所有的用例进行遍历
if item['case_id'] in mode:
final_data.append(item)
print(final_data)
return final_data # 返回取到的数据
if __name__ == '__main__':
DoExcel("test.xlsx", 'test').get_data()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File : http_request.py
import requests
class HttpRequest:
def http_request(self, url, data, method):
headers = {'Content-Type': 'application/json;charset=UTF-8'}
result = None
if method.lower() == 'post':
result = requests.request("POST", url, data=data, headers=headers)
elif method.lower() == 'get':
result = requests.request("GET", url, data=data, headers=headers)
else:
print("错误")
return result
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File : GetData.py
class GetData:
Cookie = None
二、 超级继承方式
(这个使用的excel文件是没有带表头的)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/4/13 15:53
# @File : test_suite.py
import HTMLTestRunner
import unittest
from test_excel_case.do_excel import DoExcel
from test_excel_case.test_http import TestHttp
# test_data = [{"url": "https://xxx.xx.com/xxxapi/login",
# "data": {"username": "testlxm", "password": "testlxm"}, "expected": 1000, "method": "post"},
# {"url": "https://xxx.xx.com/xxxapi/login",
# "data": {"username": "testlxm", "password": "123456"}, "expected": 1000, "method": "post"}]
# 方法一:一次性将用例从exel中读取出来
test_data = DoExcel("test.xlsx", 'test').get_data()
suite = unittest.TestSuite()
# 实例的方式加载用例
for item in test_data:
suite.addTest(TestHttp('test_api', item['method'], item['url'], item['data'],
item['expected']))
# 执行用例
with open("test_summer.html", "wb") as file:
testrunner = HTMLTestRunner.HTMLTestRunner(stream=file, verbosity=2, title=None, description=None)
testrunner.run(suite)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File : test_http.py
import unittest
from test_excel_case import GetData
from test_excel_case.http_request import HttpRequest
class TestHttp(unittest.TestCase):
def setUp(self):
pass
def __init__(self, methodName, method, url, data, expected): #通过初始化函数传参
super(TestHttp, self).__init__(methodName) # 父类的方法保留了
self.url = url
self.data = data
self.method = method
self.expected = expected
def test_api(self):
res = HttpRequest().http_request(self.url, self.data, self.method)
if res.cookies:#如果cookie有的话,那么就更新cookie
setattr(GetData,'Cookie',res.cookies) #反射
try:
self.assertEqual(self.expected,res.json()['code'])
except AssertionError as e:
print("test_api's error is {}".format(e))
raise e
print(res)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File : do_excel.py
from openpyxl import load_workbook
class DoExcel:
def __init__(self, file_name, sheet_name):
self.file_name = file_name
self.sheet_name = sheet_name
self.sheet_obj = load_workbook(self.file_name)[self.sheet_name] # 获取一个表单对象
def get_data(self):
wb = load_workbook(self.file_name)
sheet = wb[self.sheet_name]
test_data = []
for i in range(1, sheet.max_row + 1):
sub_data = {}
sub_data['method'] = sheet.cell(i, 1).value
sub_data['url'] = sheet.cell(i, 2).value
sub_data['data'] = sheet.cell(i, 3).value
sub_data['expected'] = sheet.cell(i, 4).value
test_data.append(sub_data)
print(test_data)
return test_data # 返回取到的数据,获取一个表单对象
if __name__ == '__main__':
DoExcel("test.xlsx", 'test').get_data()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File : http_request.py
import requests
class HttpRequest:
def http_request(self, url, data, method):
headers = {'Content-Type': 'application/json;charset=UTF-8'}
result = None
if method.lower() == 'post':
result = requests.request("POST", url, data=data, headers=headers)
elif method.lower() == 'get':
result = requests.request("GET", url, data=data, headers=headers)
else:
print("错误")
return result
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File : GetData.py
class GetData:
Cookie = None
注意:使用的excel表是不带表头的