基于BDD的接口自动化框架开箱即用

article/2025/10/15 15:36:34

图片

1、背景说明

项目思想:BDD

行为驱动开发的思想褒贬不一,这里不多说。遵循的宗旨能解决业务痛点的思想就是好思想。

接口测试工具在实际的业务测试场景中往往会遇到一些使用上的局限性,自定义扩展要求技术较高,如果二次开发工具成本较大;

处于探索期的自动化团队,接口易于入手

接口测试用例后期的版本、维护、变更、存储遇到很多问题;

接口测试多人协同没有友好的支持;

接口测试用例没有统一的规范后期管理混乱、测试报告(业务场景接口)展示针对性、可读性差;

2、技术选型

cucumber 框架 官方链接 || GitHub链接

简介:Cucumber 是一个能够理解用普通语言 描述的测试用例的支持行为驱动开发(BDD)的自动化测试工具,用多种语言编写,支持Java、JavaScript、Ruby、.Net等多种开发语言。

rest-assured框架 官方链接 || GitHub链接

简介:REST-assured 用于方便 REST 服务测试的 JAVA DSL。

xeger正则表达式 GitHub链接

mock框架 GitHub链接

(微信不能外链接,以上可自行查找)

3、整体的框架思想

架构图谱
图片

单框架的了解

cucumber-环境配置

需要装俩idea插件用于自定义关键字自动提示和feature编写帮助

https://plugins.jetbrains.com/plugin/9164-gherkin/versions

https://plugins.jetbrains.com/plugin/7212-cucumber-for-java

或者直接在idea编译器内Settings->Plugins搜索:gherkin&&Cucumber for Java 安装即可

4、项目使用流程

idea创建一个maven项目使用自定义模板,配置如下:

GroupId=io.cucumber
ArtifactId=cucumber-archetype
Version=6.6.0
#踩坑,高版本结合其他框架使用遇到一些不适配的问题,目前使用6.6.0版本比较稳定

图片

自动生成cucumber项目模板

在这里插入图片描述

feature简单示例

Feature: rest-assured+cucumber测试实例Scenario: get请求示例场景Given 接口参数|params1|value1|params2|value2When 发起接口请求 "http://127.0.0.1:8091/api/test"Then 断言 "code"="1"

StepDefinitions类接收处理

 public String body;public Response response;@Given("接口参数")public void getubjectMajorstype(List<Map<String, String>> vegetables) {Map reqMap = vegetables.get(0);this.body = reqMap.toString();System.out.println("subjectMajorstype = " + reqMap.toString());}@When("发起接口请求 {string}")public void sendReq(String url){System.out.println("真正调用接口"+url);RequestSpecification request = given().contentType(ContentType.JSON).body(body);this.response = request.get(url);String responseBody = this.response.getBody().asString();System.out.println("当前响应结果:"+responseBody);}@Then("断言 {string}={string}")public void assertRes(String aValue){if ( aValue.equals("0")){System.out.println("=======断言通过=========");}else {System.out.println("==========断言失败==========");}}

rest-assured和cucumber遵循规范:

given-when-then逻辑思想

rest-assured具体使用可以参考GitHub的示例

public Response post(Map<String, String> headers, String body, String url) { request = given().headers(headers).contentType(ContentType.JSON).body(body); response = request.post(url); 
}

框架核心实现与测试用例分离

  • 核心实现与测试用例分类
  • 只关注接口的测试用例和维护
  • 核心实现

核心实现基础是上面创建的cucumber模板maven项目,根据实际需求功能不断完善…

  • 测试用例pom文件引用核心实现,通过git管理测试用例版本

图片

接口用例编写的关键字说明

接口执行顺序说明

用例执行前逻辑控制:预加载数据、获取场景名、环境变量…

用例执行中逻辑控制:根据各自场景使用关键字控制…

用例执行后逻辑控制:收集测试用例结果,展示用例测试结果数据…

接口用例关键字控制说明:整体遵循given-when-then思想

given 来控制请求前:api、参数、mock、文件流等功能使用

when 来控制发送什么样的请求:支持restful风格请求-get/post/delete/put,以及对应mock的请求类型

then 来控制获取响应后的参数化、响应结果的断言、数据库断言等

自定义关键字说明

Param 支持 :application/x-www-form-urlencoded 和 form-data格式

Body支持:raw 的json格式

ParamsJsonX支持:是把Param写成json格式

JSONPATH_GET_MONGO:是rest-assured的jsonpath使用,用于取出当前响应结果的某一对象值,也支持参数化

常用写法
• 获取children的列表rest-assured的jsonpath取值写法Then JSONPATH_GET_MONGO|data[0].children|children|
• 获取children第二条记录rest-assured的jsonpath取值写法Then JSONPATH_GET_MONGO|data[0].children[1]|children|
• 获取children第二条记录的yearId值rest-assured的jsonpath取值写法Then JSONPATH_GET_MONGO|data[0].children[1].yearId|yearId|
• 获取children所有的yearId值(列表)rest-assured的jsonpath取值写法Then JSONPATH_GET_MONGO|data[0].children.yearId|yearId|
• 获取特定的yearId值rest-assured的jsonpath取值写法【目前公司用的,支持该写法】Then JSONPATH_GET_MONGO| data[0].children.findAll{ children -> children.year == "2020"}.yearId[0] | yearId_2020 |
• 标准版的jsonpath取值【rest-assured的json-path不支持这种写法】Then JSONPATH_GET_MONGO| data[0].children[?@.year == "2020"}.yearId | yearId_2020 |

JSONPATH_ASSERT_EQUALS:是rest-assured的jsonpath使用,用于断言参数化当前响应结果与期望结果是否相等

INIT_MOCK:开启mock,mock读取顺着当前用例执行结束而结束

CONTENT_TYPE_IN_MULTIPART:开启文件上传支持

#采坑:目前rest-assured底层只支持一个文件的上传,不支持多个文件同时上传

FILECONTENT_ASSERT_CONTAINS:文本内容断言

ASSERT_MYSQL_SQL:SQL断言

todo。。。自定义扩展

接口用例编写实战分享

1.前置条件:

以企业微信为示例演示接口用例编写流程

企业微信测试地址:https://work.weixin.qq.com/

企业微信错误查询工具:https://open.work.weixin.qq.com/devtool/query?e=50001

配置idea编译器服务端地址

在这里插入图片描述

2.feature项目目录结构(和核心实现分离,只看到接口用例):

在这里插入图片描述

3.测试流程步骤

简单的测试操作流程:获取鉴权token->新增部门成员->编辑新增成员名称->删除被编辑名称的成员操作流程

#初始化变量池
@test
Feature: 初始化数据Scenario:  初始化变量数据Given INIT_MOCKGiven INI_VAR_DATA"""name: 测试名_Random(Char[4])mobile: 152Random(Long[5])5317email: testerRandom(Char[4])@qq.comwxName: zyRandom(Char[2])alias: alias_Random(Char[4])userid: userid_testRandom(Char[4])editUserid: 修改名称操作_Random(Char[2])"""# 1.获取access_tokenScenario: 获取access_tokenGiven API "/cgi-bin/gettoken"And Param"""corpid : ww27d6f876d80ceec6corpsecret: yiXycY2QFDwD9HysYNk6hF7NFnt1CxBybuei1YKVaVw"""When GETThen STATUS "200"Then JSONPATH_GET_MONGO|access_token|getToken|Then JSONPATH_ASSERT_EQUALS| errmsg   | ok |# 2.新增企业微信成员Scenario: wx_新增人员接口Given API "/cgi-bin/user/create?access_token=${getToken}"And Body"""{"userid": "test_user","name": "test_name","position": "测试工程师","alias": "背锅侠","mobile": "15238380000","email":"76556@qq.com","department": [3],}"""When POSTThen STATUS "200"
#    jsonpath断言使用Then JSONPATH_ASSERT_EQUALS| errcode  | 0      |# 3.断言新增人员是否成功      
Scenario Outline: wx_读取人员接口Given API "/cgi-bin/user/get"And Param"""access_token: ${getToken}userid: ${userid}"""When GETThen STATUS "200"Then JSONPATH_ASSERT "<jsonPath>" equals "<value>"Examples:| jsonPath | value  || errmsg   | ok |# 4.编辑新增成员_修改nameScenario: 编辑新增企业微信成员操作Given API "/cgi-bin/user/update?access_token=${getToken}"And Body"""{"userid": "test_user","name": "test_name_edit","department": [3],"order": [10],"position": "测试工程师","mobile": "15238305311","gender": "1","email": "zhangsn@gdev.com"}"""When POSTThen STATUS "200"Then JSONPATH_ASSERT_EQUALS| errcode  | 0      || errmsg   |updated |# 5. 删除微信成员操作Scenario: 删除新增企业微信成员操作Given API "/cgi-bin/user/delete?access_token=${getToken}"#urlencoded格式也可以在Param里写成yaml格式,也可以在url拼接使用And Param"""userid: test_user"""When GETThen STATUS "200"Then JSONPATH_ASSERT_EQUALS| errcode  | 0      |

通过上面的用例可以看出,需要什么功能只需要引入实现的关键字即可

用例的优化动态参数化和用例可持续执行

目前框架已实现功能

mock数据支持

restful风格接口支持

文件上传支持

jsonPath参数化变量引用支持

CSV文件参数数据引用

断言参数化变量引用支持

数据库断言支持

响应URL链接断言支持

随机函数支持

String 、Char、Long 、Boolean 的数据类型随机生成

各自日期类型和身份证等数据的随机生成

// 生成当前时间
Random(Date[yyyy-MM-dd hh:mm:ss])
// 当前事件为模板指定个别值
Random(Date[2020-MM-dd hh:mm:ss])
Random(Date[yyyy-03-12 08:mm:ss])
// 只生成年月日
Random(Date[yyyy-12-dd])
// 随机生日的身份证号
Random(IDCard)
// 指定生日的身份证号
Random(IDCard[20210312])

4、项目的核心思想

框架的核心实现思想

底层实现思路分析
图片

jenkins集成cucumber报告展示

冒烟测试报告…

1.报告汇总:

图片

2.错误信息展示

图片

3.配置坑:Cucumber reports 报告展示坑,由于配置了mock的config.json数据导致可能识别json文件有点问题,需要指定cucumber.json名即可结果

图片

写在最后附上项目源码地址:

https://github.com/CuiZhongyuan/cucumber-weixin-api-test

由于涉及公司项目核心jar包未开源,公众号后台回复cucumber即可获取打包后依赖jar包,放置maven依赖包com相应路径下即可:

<dependency><groupId>com.weixin.api</groupId><artifactId>cuke</artifactId><version>jxc_2.2.2</version><scope>test</scope>
</dependency>

如果你不想一个人野蛮生长,找不到系统的资料,问题得不到帮助,坚持几天便放弃的感受的话,可以加入我们的QQ群:746506216,大家可以一起讨论交流,里面会有各种软件测试资料和技术交流。


资源分享

下方这份完整的软件测试视频学习教程已经上## 标题传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 【保证100%免费】

在这里插入图片描述

在这里插入图片描述


http://chatgpt.dhexx.cn/article/1QSFxTOa.shtml

相关文章

BDD之单元测试(三):BDD的官方教程

BDD之单元测试&#xff08;二&#xff09;&#xff1a;ATDD&#xff0c;TDD&#xff0c;BDD的区别 BDD之单元测试&#xff08;三&#xff09;&#xff1a;BDD的官方教程 BDD之单元测试&#xff08;四&#xff09;&#xff1a;实际的项目教程 cucumber cucumber是BDD(Behav…

五分钟让你彻底了解TDD、ATDD、BDDRBE

在目前比较流行的敏捷开发模式&#xff08;如极限编程、Scrum方法等&#xff09;中&#xff0c;推崇“测试驱动开发&#xff08;Test Driven Development&#xff0c;TDD&#xff09;”——测试在先、编码在后的开发实践。TDD有别于以往的“先编码、后测试”的开发过程&#xf…

BDD(二元决策图)

转载自&#xff1a;二元决策图(Binary Decision Diagrams - BDD) &#xff08;一&#xff09; 在形式化验证、数字系统的设计和验证中&#xff0c;许多任务都涉及大型命题逻辑公式的运算。二元决策图&#xff08;BDD&#xff09;已经成为许多应用的首选表示方法。1986年&#x…

TDD和BDD的区别 (TDD vs BDD)

前言 如果你关注软件开发最佳实践方面的话题&#xff0c;你肯定听说过测试驱动开发(TDD - Test Driven Development) 和行为驱动开发(BDD - Behavior Driven Development)。这篇文章会为你阐述这两种模式的含义并举例&#xff0c;同时对二者进行比较。 测试驱动开发 (TDD) 当…

行为驱动开发(BDD)全面介绍

行为驱动开发&#xff08;BDD&#xff09;全面介绍 作者&#xff1a;杜铁绳 在软件行业中&#xff0c;软件研发项目软件产品交付经常被推迟、研发费用经常超出预算、经常遗漏客户所需的软件功能、有将近20%的项目最终无法交付&#xff0c;或者取消。这些软件研发往往花费了大…

web自动化测试进阶篇02 ——— BDD与TDD的研究实践

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

全面理解BDD(行为驱动开发):转变思维方式,提升软件质量

在传统的软件开发流程中&#xff0c;开发人员和测试人员的工作通常是相互独立的。开发人员负责编写代码&#xff0c;测试人员负责找出代码中的问题。然而&#xff0c;这种方法可能导致沟通不足&#xff0c;而且会浪费时间和资源。为了解决这些问题&#xff0c;出现了一种新的开…

BDD - 介绍 Behavior-Driven Development 行为驱动开发

BDD - Behavior-Driven Development 行为驱动开发 引言什么是 BDD相关软件开发流程TDDATDDBDD 和 TDD 的关系 BDD 原则BDD 流程BDD 优势 引言 自从接触到 BDD&#xff0c;深有感触&#xff0c;BDD 是广大 QA 的福音&#xff0c;测试领域的天空豁然开朗。BDD 模式更有助于团队合…

BDD自动化测试

BDD&#xff08;行为驱动开发&#xff09;自动化测试在软件测试领域一直在发展。随着agile思想在越来越多的项目中推广&#xff0c;以及非开发人员在项目的更多参与&#xff0c;BDD风格的自动化测试被越来越多项目组采纳并实施。 BDD&#xff08;Behavior Driven Development&…

端到端视频编码:DVC

本文来自CVPR 2019论文《DVC: An End-to-end Deep Video Compression Framework》 官方开源代码地址&#xff1a;https://github.com/GuoLusjtu/DVC DVC是一个端到端的视频编码模型&#xff0c;之前也有过一些基于DNN的视频编码方法&#xff0c;但是通常是使用DNN模型替换视频…

主流视频编码压缩技术基本概念(二) 算法分析

主流视频编码压缩技术基本概念&#xff08;二&#xff09; 算法分析 一、MPEG-1技术介绍1、 MPEG-1的层次及语法结构①、运动补偿序列(Sequence)②、图片组&#xff08;GOP&#xff09;③、 图片&#xff08;Picture&#xff09;④、 图片切片&#xff08;Slice&#xff09;⑤、…

视频编码解码基本知识

最近在做摄像头视频的数据处理&#xff0c;得到了网络相机的.h264格式的数据&#xff0c;需要做解码处理&#xff0c;由于对视频的编码解码原理不太了解&#xff0c;因此查找资料总结一下 为什么要进行视频编码&#xff1f; 视频编码又称为视频压缩&#xff0c;伴随着用户对高…

FFMpeg 实现视频编码、解码

FFMpeg 作为音视频领域的开源工具,它几乎可以实现所有针对音视频的处理,本文主要利用 FFMpeg 官方提供的 SDK 实现音视频最简单的几个实例:编码、解码、封装、解封装、转码、缩放以及添加水印。 接下来会由发现问题->分析问题->解决问题->实现方案,循序渐进的完成。…

感知视频编码

感知视频编码就是在视频编码的过程中&#xff0c;将HVS应用进去&#xff0c;挖掘主观视频感知冗余&#xff0c;进一步提高视频编码压缩效率。 1.Computational visual perception:三种视觉感知计算模型 &#xff08;1&#xff09;视觉敏感模型 &#xff08;2&#xff09;视觉注…

Android视频编码的坑

视频开发是一个核心方向&#xff0c;那Camera开发一直是Android的一个核心&#xff0c;笔者做过Camera HAL&#xff0c;也做过Camera App, 同时也开发过Camera 滤镜&#xff0c;这个过程中也遇到和解决过很多棘手的问题&#xff0c;也一直想总结一篇&#xff0c;看到这篇后感觉…

视频编码未来简史

首先我们回顾一下视频编码的历史&#xff0c;视频编码起源于广播电视&#xff0c;在很长一段时间里视频编解码的变革主要推动力是来自于广播电视。当然&#xff0c;今天我们看互联网的视频编码是速度越来越快&#xff0c;昨天在ICET2017年世界大会上&#xff0c;ICET的主席还说…

PCS2021:针对游戏内容的视频编码工具分析和数据集

本文来自PCS2021论文《Video Coding Tool Analysis and Dataset for Gaming Content》 随着近几年游戏市场的逐渐壮大&#xff0c;新的游戏形态&#xff08;AR、VR、云游戏等&#xff09;逐渐发展。和传统的摄像机内容和屏幕内容相比&#xff0c;游戏内容有着不同的特点导致对于…

视频编码综述

你用手机、电脑看电影追剧时&#xff0c;是看的高清还是标清&#xff1f;我想只要网速够得上应该没有人愿意再看标清了吧&#xff01;毕竟高清视频的高分辨率和清晰画质总是能让人有更好的观影体验。 伴随着用户对高清视频的需求量的增加&#xff0c;视频多媒体的视频数据量也在…

混合视频编码方法

参考文献&#xff1a; IP网络视频传输&#xff1a;技术、标准和应用 朱秀昌&#xff0c;唐贵进。--北京&#xff1a;人民邮电出版社&#xff0c;2017.9 预测编码和变换编码是混合编码的基础&#xff0c;当然除此之外还有运动估计、运动补偿、量化、熵编码、去方块滤波等。下面…

【视频编解码-02】视频编码的目的、条件和目标

视频编码&#xff0c;是视频处理中的一个核心技术。 现代我们所看到的所有视频&#xff0c;包括电视、互联网、手机等等&#xff0c;几乎所有的视频都会被编码、解码。 整个视频技术的基本流程是&#xff1a;视频数据的采集、视频数据的编码、视频数据的传输、视频数据的解码、…