首页 > 其他分享 >接口自动化

接口自动化

时间:2022-11-07 09:26:18浏览次数:71  
标签:__ sheet self excel 接口 自动化 import data


接口自动化

本质:通过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中编写测试用例的时候:

  1. 被依赖的接口用例写在上面

  2. 对于依赖的字段设置规则:(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 目录结构创建

image-20221031090520873

操作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

相关文章

  • 自动化框架——pytest
     pytest的用处和学习目的:简单灵活,容易上手支持参数化能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+request......
  • 接口
    抽象方法的集合接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。特性:接口中每一个方法也是隐式抽象......
  • 接口自动化测试用例如何设计
    转载请注明出处❤️作者:测试蔡坨坨原文链接:caituotuo.top/bc90038a.html你好,我是测试蔡坨坨。说到自动化测试,或者说接口自动化测试,多数人的第一反应是该用什么工具,比如:P......
  • stm32cubeIDE STLINK连接SWD接口调试,启动GDB server失败的处理
    stm32cubeIDESTLINK连接SWD接口调试,启动GDBserver失败的处理报警提示Failedtobindtoport61234,errorcode-1:NoerrorFailurestartingGDBserver:TCPpor......
  • stm32cubeIDE STLINK连接SWD接口调试,启动GDB server失败的处理
    stm32cubeIDESTLINK连接SWD接口调试,启动GDBserver失败的处理报警提示Failedtobindtoport61234,errorcode-1:NoerrorFailurestartingGDBserver:TCPpor......
  • 编写一个Httpclient调用第三方接口
    什么是httpClientHttpClient是ApacheJakartaCommon下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版......
  • Map接口常用方法
    packagecom.msb.test10;importjava.util.Collection;importjava.util.HashMap;importjava.util.Map;importjava.util.Set;/***@author:liu*日期:08:4......
  • 云原生之旅 - 7)部署Terrform基础设施代码的自动化利器 Atlantis
    前言前面有几篇文章讲述了如何使用Terraform创建资源(基础设施即代码Terraform快速入门, 使用Terraform创建Kubernetes)以及 Kubernetes时代的包管理工具Helm ......
  • 为什么有公司规定所有接口都用Post?
    看到这个标题,你肯定觉得离谱。怎么会有公司规定所有接口都用Post,是架构菜还是开发菜。这可不是夸大其词,这样的公司不少。在特定的情况下,规定使用Post可以减少不少的麻烦,一起......
  • 复习 - node.js(接口案例)
    其实复习一次的作用真实太大了,真的,自从上次ajax开始其实就开始i有点懵懵懂懂的感觉,一直拖想到了node在去回顾一遍,这一次回去复习,ajax已经很熟练了,node之前搞不懂那些原理也......