主流接口测试框架对比,究竟哪个更好用
公司计划系统的开展接口自动化测试,需要我这边调研一下主流的接口测试框架给后端测试(主要测试接口)的同事介绍一下每个框架的特定和使用方式。后端同事根据他们接口的特点提出一下需求,看哪个框架更适合我们。
需求
1、接口编写方便。
2、方便调试接口。
3、支持数据初始化。
4、生成测试报告。
5、支持参数化。
### robot framework
优点
-
关键字驱动,自定义用户关键字。
-
支持测试日志和报告生成。
-
支持系统关键字开发,可扩展性好。
-
支持数据库操作。
缺点
-
接口测试用例写起来不简洁。
-
需要掌握特定语法。
-
*** Settings ***
-
Library RequestsLibrary
-
Library Collections
-
*** Test Cases ***
-
test_get_event_list # 查询发布会(GET请求)
-
${payload}= Create Dictionary eid=1
-
Create Session event http://127.0.0.1:8000/api
-
${r}= Get Request event /get_event_list/ params=${payload}
-
Should Be Equal As Strings ${r.status_code} 200
-
log ${r.json()}
-
${dict} Set variable ${r.json()}
-
#断言结果
-
${msg} Get From Dictionary ${dict} message
-
Should Be Equal ${msg} success
-
${sta} Get From Dictionary ${dict} status
-
${status} Evaluate int(200)
-
Should Be Equal ${sta} ${status}
结果:不考虑,没人愿意这么写接口用例。
###JMeter
优点
-
支持参数化
-
不需要写代码
缺点
缺点:
-
创建接口用例效率不高。
-
不能生成查看每一个接口执行情况的测试报告。
总结:不考虑,接口编写不方便,最主要是不能生成测试报告,如果做接口性能的话可以考虑。
###HttpRunner
优点:
-
基于YAML/JSON格式,专注于接口本身的编写。
-
接口编写简单
-
没有编辑器插件对语法校验,容易出错。
-
官方文档没有详细的说明。
-
扩展不方便。
-
生成测试报告
-
接口录制功能。
-
[
-
{
-
"config": {
-
"name": "testcase description",
-
"variables": [],
-
"request": {
-
"base_url": "http://127.0.0.1:5000",
-
"headers": {
-
"User-Agent": "python-requests/2.18.4"
-
}
-
}
-
}
-
},
-
{
-
"test": {
-
"name": "test case name",
-
"request": {
-
"url": "/api/get-token",
-
"headers": {
-
"device_sn": "FwgRiO7CNA50DSU",
-
"user_agent": "iOS/10.3",
-
"os_platform": "ios",
-
"app_version": "2.8.6",
-
"Content-Type": "application/json"
-
},
-
"method": "POST",
-
"date": {"sign": "958a05393efef0ac7c0fb80a7eac45e24fd40c27"}
-
},
-
"validate": [
-
{"eq": ["status_code", 200]},
-
{"eq": ["headers.Content-Type", "application/json"]},
-
{"eq": ["content.success", true]},
-
{"eq": ["content.token", "baNLX1zhFYP11Seb"]}
-
]
-
}
-
}]
总结:可以考虑,至于接口数据的初始化可能需要单独处理。
###gauge
BDD行为驱动测试框架。
优点:
-
行为文件与脚本文件分离,本质上实现了数据驱动。
-
功能强大灵活,本质上还用Python写接口用例。
-
自动生成测试报告。
-
VS Code有支持插件
缺点:
-
门槛略高,需要了解BDD的用法。
-
需要会markdworn语法
行为描述文件:
-
## test post request
-
* post "http://httpbin.org/post" interface
-
|key | status_code|
-
|------|-----------|
-
|value1|200 |
-
|value2|200 |
-
|value3|200 |
测试脚本:
-
……
-
@step("post <url> interface <table>")
-
def test_get_request(url, table):
-
values = []
-
status_codes = []
-
for word in table.get_column_values_with_name("key"):
-
values.append(word)
-
for word in table.get_column_values_with_name("status_code"):
-
status_codes.append(word)
-
for i in range(len(values)):
-
r = requests.post(url, data={"key": values[i]})
-
result = r.json()
-
assert r.status_code == int(status_codes[i])
总结:推荐使用,BDD有一定门槛,看测试人员的学些能力和接受速度。
###Unittest+Request+HTMLRunner
利用现有的框架和库自己定制。
优点:
- 足够灵活强大: 分层测试、数据驱动、测试报告,集成CI...
缺点:
- 有一定的学习成本
数据文件:
-
{
-
"test_case1": {
-
"key": "value1",
-
"status_code": 200
-
},
-
"test_case2": {
-
"key": "value2",
-
"status_code": 200
-
},
-
"test_case3": {
-
"key": "value3",
-
"status_code": 200
-
},
-
"test_case4": {
-
"key": "value4",
-
"status_code": 200
-
}}
测试用例:
-
import requests
-
import unittest
-
from ddt import ddt, file_data
-
@ddtclass InterfaceTest(unittest.TestCase):
-
def setUp(self):
-
self.url = "http://httpbin.org/post"
-
def tearDown(self):
-
print(self.result)
-
@file_data("./data/test_data_dict.json")
-
def test_post_request(self, key, status_code):
-
r = requests.post(self.url, data={"key": key})
-
self.result = r.json()
-
self.assertEqual(r.status_code, status_code)
总结:推荐使用,代码相对简单,功能足够灵活。
-
我花了两天时间整理这些框架,其实重点就是了解HttpRunner 和 gauge 。
-
yg
-
HttpRunner 没有编辑器插件,本身就是一个YAML/JSON配置文件,所以配置写错了,但只要是合法的YAML/JSON格式,也看不出来,只有运行的过后才知道。就像你用记事本写代码一样,只有运行了才知道代码有没有写错。
-
另外,扩展起来也不是特别方便,单独用python实现一些函数:在json文件中
-
```{"device_sn": "${gen_random_string(15)}"}```
-
以这样的方式引用```gen_random_string()``` 函数。
-
gauge我已经分享过两篇基础文章了,虽然用BDD拿来做接口理念不搭,但并不是不可以,唯一的缺点是用BDD来描述接口行为不合适,其他的都没毛病,可以参数化,断言写起来也简单,测试报告也漂亮,本质上还是用Python实现一些功能,所以非常灵活。
-
unittest + requests + HTMLTestRunner是我最熟悉的方案,几乎没什么短板。以前通过这种方案写过很多测试用例,这次把ddt加上似乎更完美了。
相关文章:

主流接口测试框架对比,究竟哪个更好用
公司计划系统的开展接口自动化测试,需要我这边调研一下主流的接口测试框架给后端测试(主要测试接口)的同事介绍一下每个框架的特定和使用方式。后端同事根据他们接口的特点提出一下需求,看哪个框架更适合我们。 需求 1、接口编写…...
常用python模板
1.简单脚本模板 def main():#代码逻辑if __name__"__main__":main() 2.类定义模板 Class Myclass:def __init__(self,parameter):self.parameterparameterdef my_method(self):#方法逻辑 3.函数定义模板 def my_function(parameter):#代码逻辑return result 4.…...
53. 最大子数组和(力扣LeetCode)
文章目录 53. 最大子数组和题目描述暴力(运行超时)贪心 53. 最大子数组和 题目描述 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组…...
如何远程SSH连接在家的服务器主机
当您需要通过SSH远程连接到家里的服务器主机时,以下是更详细的实施步骤: 1. 确保服务器主机已开启SSH服务 安装SSH服务:首先,确保您的服务器主机上安装了SSH服务。根据您的操作系统,您可以使用相应的包管理器来安装。…...

【亲测有效】解决三月八号ChatGPT 发消息无响应!
背景 今天忽然发现 ChatGPT 无法发送消息,能查看历史对话,但是无法发送消息。 可能的原因 出现这个问题的各位,应该都是点击登录后顶部弹窗邀请 [加入多语言 alapha 测试] 了,并且语言选择了中文,抓包看到 ab.chatg…...

vue结合vue-electron创建应用程序
这里写自定义目录标题 安装electron第一种方式:vue init electron-vue第二种方式:vue add electron-builder 启动electron调试功能:background操作和使用1、覆盖窗口的菜单上下文、右键菜单2、监听关闭事件、阻止默认行为3、创建悬浮窗口4、窗…...

【C++】STL(二) string容器
一、string基本概念 1、本质 string是C风格的字符串,而string本质上是一个类 string和char * 区别: char * 是一个指针 string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器。 2、特点 1、stri…...

PyCM:Python中的混淆矩阵库
PyCM:Python中的混淆矩阵库 在机器学习和数据科学领域,评估模型的性能是至关重要的。混淆矩阵是一种常用的评估工具,用于可视化和量化分类模型的预测结果。PyCM是一个开源的Python库,提供了丰富的功能来计算和分析混淆矩阵。本文将…...

Day22:安全开发-PHP应用留言板功能超全局变量数据库操作第三方插件引用
目录 开发环境 数据导入-mysql架构&库表列 数据库操作-mysqli函数&增删改查 数据接收输出-html混编&超全局变量 第三方插件引用-js传参&函数对象调用 完整源码 思维导图 PHP知识点: 功能:新闻列表,会员中心࿰…...
IOS面试题object-c 61-70
61. 阐述isKindOfClass、isMemberOfClass、selector作用分别是什么?isKindOfClass:作用是某个对象属于某个类型或者继承自某类型。 isMemberOfClass:某个对象确切属于某个类型。 selector:通过方法名,获取在内存中的函…...
Git指令reset的参数soft、mixed与hard三者之间的区别
主要内容 reset默认不写参数,与使用mixed参数含义一样 为了描述简洁,使用下图说明: #mermaid-svg-LtChquRXlEV1j6og {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LtChquRXlEV1j…...
RGMII 接口调试
目录 硬件检查 软件检查 调试步骤 硬件检查 硬件工程师检查原理图和PCB,核查RGMII线路连接是否正确,PHY的 TX连接对端 RX,PHY的RX连接对端TX,原理图上以引脚序号引脚名 引脚类型(输入还是输出)逐一核查RGMII接口各个网络&#…...

Ubuntu 24.04 抢先体验换国内源 清华源 阿里源 中科大源 163源
Update 240307:Ubuntu 24.04 LTS 进入功能冻结期 预计4月25日正式发布。 Ubuntu22.04换源 Ubuntu 24.04重要升级daily版本下载换源步骤 (阿里源)清华源中科大源网易163源 Ubuntu 24.04 LTS,代号 「Noble Numbat」,即将与我们见面! Canonica…...
软件设计模式:模板方法模式
1. 简介 模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将一些步骤延迟到子类中实现。这样,可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 2. 使用条件 模板方法模式适用于以下情况: 算法…...

【算法】Hash存储——开放寻址法
模拟散列表 维护一个集合,支持如下几种操作: I x,插入一个整数 x; Q x,询问整数 x是否在集合中出现过; 现在要进行 N次操作,对于每个询问操作输出对应的结果。 输入格式 第一行包含整数 N&am…...

STM32CubeIDE基础学习-STM32CubeIDE软件程序下载方法
STM32CubeIDE基础学习-STM32CubeIDE软件代码下载方法 文章目录 STM32CubeIDE基础学习-STM32CubeIDE软件代码下载方法前言第1章 代码下载第2章 下载器固件更新总结 前言 编写完代码,一般都会选择在线下载程序的方式进行验证该程序是否正确,如果发现结果和…...
LeetCode 174.地下城游戏 Python题解
地下城游戏 # 地下城游戏 """ 恶魔们抓住了公主并将她关在了地下城dungeon的右下角。地下城是由mxn个房间组成的二维网格。我们英勇的骑士最初被安置在左上角的房间里, 他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数…...

指令调用模板
也就是这边指令通过id和map会定位到一个结构体,然后这个结构再赋值两个成员,一个是函数一个是指令类型,然后这个函数是模板的实例化 使用的时候就传进去,这只是参数,最开始初始化的时候模板就已经实例化了。然后关于模…...

(五)关系数据库标准语言SQL
注:课堂讲义使用的数据库 5.1利用SQL语言建立数据库 5.1.1 create Database 5.1.2 create schema...authorization... 创建数据库和创建模式的区别: 数据库是架构的集合,架构是表的集合。但在MySQL中,他们使用的方式是相同的。 …...

第二十天-数据分析
1.介绍 1.什么是数据分析 1.以下4个纬度结合起来的数据科学 2.数据分析的特殊性...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...