当前位置: 首页 > news >正文

接口自动化-代码实现

接口自动化基础

1、接口自动化测试

  • 接口自动化:使用工具或代码代替人对接口进行测试的技术
  • 测试目的: 防止开发修改代码时引入新的问题
  • 测试时机:
    • 开发进行系统测试转测前,可以先进行接口自动化脚本的编写
    • 开发进行系统测试转测后,优先进行系统测试用例的执行,再进行接口自动化脚本的编写

2、接口自动化测试流程

1)选取自动化测试用例

  • 优先级高(先实现业务流程用例、后实现单接口用例)
  • 功能稳定

2)搭建自动化测试环境

  • 核心技术
    • 编程语言:Python
    • 测试框架:pytest
    • 接口请求:requests
      • 安装:pip3 install requests
      • 验证:pip3 show requests

3)搭建自动化测试框架
4)代码实现自动化
5)输出测试报告
6)实现持续集成

3、接口自动化测试框架

1)接口自动化框架

接口自动化框架就是基于应用服务器和数据库进行case管理,具体包含API封装、数据库封装、测试数据参数化和代码优化断言封装等

2)接口自动化框架设计思路

  1. 搭建集成框架——定义项目目录结构
  2. 通用功能类封装——封装通用功能如:数据库工具等
  3. 接口对象封装与调用——封装接口API对象+PyTest框架编写测试脚本
  4. 测试数据参数化——测试数据json文件设计、参数化实现
  5. 用例组织运行——组织测试用例运行,生成测试报告

3)搭建基础框架—定义项目目录结构

在这里插入图片描述

  • api——封装接口信息
  • scripts——编写测试脚本
  • data——存放测试数据
  • report——存放测试报告
  • common——存放通用工具类
  • config.py——定义项目配置信息
  • pytest.ini——pytest配置文件

Requests库

1.介绍
  • requests库:python中的“浏览器”,基于urllib的HTTP库
  • 安装:pip install requests
  • 操作步骤
    • 导包
    • 发送接口请求
    • 查看响应数据
2.Requests发送请求

1)requests处理json类型

requests.请求方法(url, params=None, data=None, json=None, headers=None)
  • 常见方法:get,post,put,delete
  • url:请求的url地址
  • params:请求的查询参数
  • data:请求体为form表单参数
  • json:请求体为json参数
  • headers:请求头参数

2)requests处理multipart/form-data类型

requests.请求方法(url, data=None, json=None, headers=None, files=None)
  • files:上传的文件
3.Requests查看响应
属性/方法说明
response.status_code状态码
response.json()json形式的响应内容
response.text文本形式的响应内容
response.url请求url
response.encoding查看响应头部字符编码
response.headers头信息
response.cookiescookies信息
登录接口调试-登录
  • 需求:使用requests访问登录接口,并查看响应结果
  • 接口信息
    • url:http://kdtx-test.itheima.net/api/login
    • 方法:post
    • 请求数据
      • 请求头:Content-Type:application/json
      • 请求体:{“username”:“admin”,“password”:“HM_2023_test”,“code”:“2”,“uuid”:“验证码接口返回结果中的数据值”}
# 需求:登录成功# 导包
import requests# 发送请求
url = "http://kdtx-test.itheima.net/api/login"
header_data = {"Content-Type": "application/json"
}
login_data = {"username": "admin","password": "HM_2023_test","code": 2,"uuid": "26bdc08fac934d6b805e49645b2701ae"
}
response = requests.post(url=url, headers=header_data, json=login_data)# 查看响应
print(response.status_code)
print(response.json())

接口对象封装

1、接口自动化代码核心思想?
核心思想:代码分层思想

  • 测试脚本层
    • 重点关注测试数据准备和断言
    • 重点关注业务流程的处理
    • 直接调用接口对象层发送请求
  • 接口对象层
    • 根据接口API文档封装
    • 重点关注如何调用接口
    • 请求参数从测试脚本层传递
    • 接口响应结果返回给脚本层
      2、代码中如何解决接口之间的数据依赖?
      使用python中变量或属性传递接口依赖数据
      例如:
      #提取登录成功之后的token数据并保存在类的属性中TestContractBusniess.token = res_l.json().get("token")
      3、Requests中如何处理multipart/form-data请求数据?
# 读取文件
f = open("test.pdf", "rb")
# 设置请求数据
response = requests.post(url=xxx, files={"file": f}

数据驱动

数据驱动:以测试数据驱动脚本执行,维护焦点从脚本转向测试数据的一种自动化测试设计模式
好处:代码与测试数据分离,增强代码的可维护性

如何实现?

pytest中parametrize装饰器

  • 作用:遍历所有测试数据并运行测试方法
  • 语法
    • @pytest.mark.parametrize(②保存数据参数名, ①测试数据)
      def test_method(self, ③参数名)
      pass
  • 示例
    • test_data=[(“manager”, “123456),(”",“123456”),(“itheima”,“123456”)]
    • @pytest.mark.parametrize(“mobile, password”, test_data)
      def test_method(self, mobile, password)
      pass
json文件实现数据驱动

1)json文件记录测试数据

[{"username": "admin","password": "HM_2023_test","status": 200,"message": "成功","code": 200},{"username": "","password": "HM_2023_test","status": 200,"message": "错误","code": 500},{"username": "admin111","password": "HM_2023_test","status": 200,"message": "错误","code": 500}
]

2)封装读取json文件

# 读取json文件
def build_data(json_file):# 定义一个空列表test_data = []# 打开json文件with open(json_file, "r", encoding="utf-8") as f:# 加载json文件数据json_data = json.load(f)# 循环遍历测试数据for case_data in json_data:# 转换数据格式[{}, {}, {}] ==> [(), (), ()]username = case_data.get("username")password = case_data.get("password")status = case_data.get("status")message = case_data.get("message")code = case_data.get("code")test_data.append((username, password, status, message, code))# 返回处理后的测试数据return test_data

3)测试用例方法中利用参数化取出测试数据

# 登录成功@pytest.mark.parametrize("username, password, status, message, code", build_data(json_file=config.BASE_PATH + "/data/login.json"))def test01_login_success(self, username, password, status, message, code):login_data = {"username": username,"password": password,"code": 2,"uuid": TestLoginAPI.uuid}response = self.login_api.login(test_data=login_data)# 断言响应状态码为200assert status == response.status_code# 断言响应数据包含’成功‘assert message in response.text# 断言响应json数据中的code值assert code == response.json().get("code")

项目配置文件

用于维护项目相关的基本信息,如:URL、项目路径等

# 导包
import os
# 定义环境域名
BASE_URL = "http://kdtx-test.itheima.net"
# 统一文件路径
BASE_PATH = os.path.dirname(__file__)
print(BASE_PATH)

当测试用例代码中需要用到url或项目路径时,如:

self.url_verify = config.BASE_URL + "/api/captchaImage"
json_file=config.BASE_PATH + "/data/login.json"

Allure测试报告

  • 介绍
    • 能生成美观易读的报告
    • 支持多种开发语言,如java、python等
    • 能快速上手
  • 操作步骤
    • 生成测试结果文件(json文件)
    • 使用allure命令生成在线报告
  • 帮助文档:https://docs.qameta.io/allure
1)生成测试结果文件

使用步骤:

  1. 将pytest配置文件中的命令行参数加上如下代码

    --alluredir report
    
  2. 编写好测试脚本后,在命令行行中运行pytest

    [pytest]
    addopts =-s --alluredir report
    testpaths=./scripts
    python_files = test*.py
    python_classes = Test*
    python_functions = test*
    
  3. 程序运行结束后,会在项目的report目录中生成一些json文件

2)使用allure命令生成在线报告

安装:
1.https://github.com/allure-framework/allure2/releases 下载 allure
2.解压缩安装包到一个不包含中文路径的目录
3.将压缩包内的 bin 目录配置到 path 系统环境变量
4.右键我的电脑 - 属性 - 高级设置 - 环境变量 - 找到系统环境变量的path项 - 增加 allure到bin目录
5.在命令行中输入 allure--version 命令,能显示allure版本信息,即为成功

总结:
1)终端输入 pytest 运行
2)终端输入 allure serve report 命令 得到报告

在这里插入图片描述
一些问题:
①allure依赖于jdk环境,需要先安装jdk1.8.0并配置环境变量(按照csdn上的文章配置了半天都没用,最后是直接将bin文件的绝对路径添加到path环境变量中才成功)
②如果在pycharm终端输入allure serve report 报错提示“allure不是内部或外部命令”,可以直接使用allure路径+serve report,即D:\software\allure-2.30.0\bin\allure serve report

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringBoot 设置传入参数非必要
  • leetcode每日一题49
  • 微信小程序的四种弹窗使用
  • 【计算机操作系统】段页式管理方式
  • 【网络安全】IDOR之邮箱银行报价
  • 全面讲解Vue中的toRaw函数
  • Go第一个程序
  • 高性能web服务器2——Nginx概述
  • STM32 —— TIM(基本定时器)详解_stm32的tim
  • 实验十 编写子程序《汇编语言》- 王爽
  • 设计者模式:深度解析及应用
  • DC-DC 转换器中的压电谐振器:当前状态和限制
  • Ps:首选项 - 性能
  • RabbitMQ集群 - 普通集群搭建、宕机情况
  • 控制阶段在DMAIC中的主要目标是什么?
  • 【个人向】《HTTP图解》阅后小结
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • 30秒的PHP代码片段(1)数组 - Array
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Java IO学习笔记一
  • js ES6 求数组的交集,并集,还有差集
  • Linux各目录及每个目录的详细介绍
  • Redis学习笔记 - pipline(流水线、管道)
  • WebSocket使用
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 检测对象或数组
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 深度学习入门:10门免费线上课程推荐
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 学习Vue.js的五个小例子
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #vue3 实现前端下载excel文件模板功能
  • #微信小程序:微信小程序常见的配置传值
  • $ git push -u origin master 推送到远程库出错
  • (1)SpringCloud 整合Python
  • (1)虚拟机的安装与使用,linux系统安装
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (175)FPGA门控时钟技术
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (黑马C++)L06 重载与继承
  • (篇九)MySQL常用内置函数
  • (转) Android中ViewStub组件使用
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)重识new
  • (自用)gtest单元测试
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core 和 .NET Framework 中的 MEF2
  • .Net Core和.Net Standard直观理解
  • .net 调用海康SDK以及常见的坑解释
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .Net插件开发开源框架