接口自动化
本质:通过requests和Excel(数据库)对用例进行批量的自动化回归测试。
关于Excel
操作Excel:https://www.cnblogs.com/Neeo/articles/11650149.html
import xlrd
from conf import settings
book = xlrd.open_workbook(settings.FILE_PATH)
sheet = book.sheet_by_index(0)
# book.sheet_by_name('通用接口')
# print(sheet.nrows, sheet.ncols) # 获取所有行和列数
# 获取指定行
# print(sheet.row_values(0))
# print(sheet.row_values(1))
# 获取指定列
# print(sheet.col_values(0))
l = []
title = sheet.row_values(0)
print(title)
for row in range(1, sheet.nrows):
l.append(dict(zip(title, sheet.row_values(row))))
print(l)
如何处理数据依赖
依赖:当条测试用例要完成的话需要上面的一条测试用例为基础(比如cookie 依赖于上面测试成的cookie)
在Excel中编写测试用例的时候:
-
被依赖的接口用例写在上面
-
对于依赖的字段设置规则:(case_001>request_data>token 依赖于case_001用例的request_data字段的token的键)
-
{"user":"admin", "token":"xxxxadsasdads"}
-
{"token":"${case_001>request_data>token}$"}
-
test_case.py:
import os
import shutil
import pytest
import allure
from deepdiff import DeepDiff
from utils.ExcelHandler import ExcelOperate
from utils.RequestsHandler import RequestsOperate
from utils.LogHandler import logger
from conf import settings
excel_data_list = ExcelOperate(settings.FILE_PATH, 3).get_excel()
class TestCase(object):
# @classmethod
# def setup_class(cls):
# cls.excel_data_list = ExcelOperate(settings.FILE_PATH, 0).get_excel()
@pytest.mark.parametrize('item', excel_data_list)
def test_case(self, item):
logger().info('正在进行断言.....')
# 请求数据 读取excel
except_date, result = RequestsOperate(current_case=item, all_excel_data_list=excel_data_list).get_response_msg()
# print(DeepDiff(except_date, result))
allure.dynamic.title(item['title'])
allure.dynamic.description(
"<b style='color:red'>请求的url:</b>{}<hr />"
"<b style='color:red'>预期值: </b>{}<hr />"
"<b style='color:red'>实际执行结果: </b>{}<hr />".format(item['url'], item['except'], result)
)
assert not DeepDiff(except_date, result).get('values_changed', None)
logger().info('完成断言,{}'.format(except_date, result))
RequestsHandler.py:
# --------------- 没有依赖的写法 -------------------------------
# class RequestsOperate(object):
#
# def __init__(self, current_case):
# 当前的case
# self.current_case = current_case
#
# def get_response_msg(self):
# """ 发送请求并且获取结果 """
# self._send_msg()
#
#
# def _send_msg(self):
# """ 发请求 """
# response = requests.request(
# method=self.current_case['method'],
# url=self.current_case['url'],
# data=self._check__request_data(),
# params=self._check__request_params(),
# )
# print("------------- 请求结果 ----------------", response.json(), '\n', "------------- 请求结果 ----------------")
#
# def _check__request_data(self):
# """ 处理 请求的 data 参数,检查是否有依赖 """
# data = self.current_case['data']
# if data:
# # print(data, type(data))
# return json.loads(data)
# else:
# return {}
#
# def _check__request_params(self):
# """ 处理 请求的 params 参数,检查是否有依赖 """
# params = self.current_case['params']
# if params:
# return json.loads(params)
# else:
# return {}
if __name__ == '__main__':
from utils.ExcelHandler import ExcelOperate
from conf import settings
# 获取excel
excel_data_list = ExcelOperate(settings.FILE_PATH, sheet_by_index=3).get_excel()
# 读每条测试用例
for item in excel_data_list:
RequestsOperate(current_case=item, all_excel_data_list=excel_data_list).get_response_msg()
# print(item)
单元测试框架
pytest 目录结构创建
操作excel表格
settings.py:关于Ecel配置
import os
import datetime
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# -------------------- 关于Ecel配置-------------
# data的excel的路径
FILE_NAME = "接口测试示例-2.xlsx"
FILE_PATH = os.path.join(BASE_DIR, 'data', FILE_NAME)
utils/ExcelHandler.py:操作excel
"""
处理Excel
"""
import xlrd
from conf import settings
from utils.LogHandler import logger
class ExcelOperate(object):
def __init__(self, file_path, sheet_by_index=0):
self.file_path = file_path
# excel操作拿到sheet的索引默认0
self.sheet_by_index = sheet_by_index
# 打开excel路径
book = xlrd.open_workbook(self.file_path)
self.sheet = book.sheet_by_index(self.sheet_by_index)
def get_excel(self):
""" 获取Excel数据 """
# l = []
# 取第一行的title
title = self.sheet.row_values(0)
# print(title)
# 拿到所有的行和第一行的title对应上
# for row in range(1, self.sheet.nrows):
# 通过拉链处理excel数据一条数据是一个个字典放到列表里
# l.append(dict(zip(title, self.sheet.row_values(row))))
# return l
# print(1111, self.sheet.nrows)
l = [dict(zip(title, self.sheet.row_values(row))) for row in range(1, self.sheet.nrows)]
logger().info('读取Excel 成功,数据已返回')
return l
if __name__ == '__main__':
excel_data_list = ExcelOperate(settings.FILE_PATH, 2).get_excel()
print(excel_data_list)
test_case.py:
import os
import shutil
import pytest
import allure
from deepdiff import DeepDiff
from utils.ExcelHandler import ExcelOperate
from utils.RequestsHandler import RequestsOperate
from utils.LogHandler import logger
from conf import settings
excel_data_list = ExcelOperate(settings.FILE_PATH, 3).get_excel()
class TestCase(object):
@pytest.mark.parametrize('item', excel_data_list)
def test_case(self, item):
logger().info('正在进行断言.....')
except_date, result = RequestsOperate(current_case=item, all_excel_data_list=excel_data_list).get_response_msg()
# print(DeepDiff(except_date, result))
allure.dynamic.title(item['title'])
allure.dynamic.description(
"<b style='color:red'>请求的url:</b>{}<hr />"
"<b style='color:red'>预期值: </b>{}<hr />"
"<b style='color:red'>实际执行结果: </b>{}<hr />".format(item['url'], item['except'], result)
)
assert not DeepDiff(except_date, result).get('values_changed', None)
logger().info('完成断言,{}'.format(except_date, result))
关于cookies处理
第一种
借鉴postman的cookies管理器,即每个请求都监测响应结果是否有cookies返回,如果有,就保存,以域名的形式保存该cookies
如果有同域名的请求,就自动在headers中携带该cookies
第二种
我们在请求中,判断响应结果中是否返回了cookies,如果返回了,就保存到当前的用例对象中,该对象就是一个大的字典。将cookies和值保存为一个key value 谁要用,就来拿该参数
关于urllib
取域名用
参考:https://www.cnblogs.com/Neeo/articles/11520952.html
如何删除一个非空目录
用shuitil
import shutil
'''
shutil模块对文件和文件集合提供了许多高级操作。特别是,提供了支持文件复制和删除的功能
'''
# shutil.copy(src, dst) # 拷贝文件
# shutil.move(src, dst) # 移动目录或者文件
# shutil.rmtree(path) # 递归删除目录,无法直接删除文件
# shutil.make_archive(base_name, format('zip')) # 将目录或者文件以指定格式压缩
# shutil.unpack_archive(filename, extract_dir) # 解压缩
# see also: https://docs.python.org/3/library/shutil.html
关于生成测试报告的命令
参考:https://docs.python.org/zh-cn/3/library/subprocess.html
关于打包
参考:https://www.cnblogs.com/Neeo/articles/11934072.html
日志
参考:https://www.cnblogs.com/Neeo/articles/10951734.html#%E7%A4%BA%E4%BE%8B
标签:__,sheet,self,excel,接口,自动化,import,data From: https://www.cnblogs.com/erhuoyuan/p/16864881.html