使用 Rest-Assured 和 TestNG 进行购物车功能的 API 自动化测试

这段代码使用了 Rest-Assured 进行 API 测试,结合 TestNG 框架执行多个 HTTP 请求并进行断言验证。以下是对每个测试方法的详细解释,包括代码逻辑和测试目的。



1. test01() 方法 - 提取响应数据

@Test
public void test01() {String jsonData = "{\"principal\":\"lemon_auto\",\"credentials\":\"lemon123456\",\"appType\":3,\"loginType\":0}";Response response =given().header("Content-Type", "application/json; charset=UTF-8").body(jsonData).when().post("http://mall.lemonban.com:8107/login").then().log().all().extract().response();// 提取响应数据String tokenValue = response.jsonPath().get("userId");System.out.println(tokenValue);
}
代码逻辑
  • 目标:该测试发送一个 POST 请求进行登录,并从响应中提取 userId 字段。

  • 步骤

    1. 使用 given() 设置请求头和请求体。
    2. 使用 when() 发送 POST 请求。
    3. 使用 then() 打印响应并提取响应内容(使用 jsonPath() 方法获取 userId 字段)。
    4. 打印提取到的 userId
用途

测试如何从 JSON 响应中提取字段(如 userId)。适用于需要从响应中提取数据的情况。



2. test_json() 方法 - 提取 JSON 响应中的数据

@Test
public void test_json() {String jsonData = "{\"principal\":\"lemon_auto\",\"credentials\":\"lemon123456\",\"appType\":3,\"loginType\":0}";Response response = given().log().all().queryParam("prodName", "测试").queryParam("sort", 0).queryParam("orderBy", 0).queryParam("current", 1).when().get("http://mall.lemonban.com:8107/search/searchProdPage").then().log().all().extract().response();// 提取响应数据中的产品ID列表List<Object> list = response.jsonPath().getList("records.prodId");System.out.println(list);
}
代码逻辑
  • 目标:该测试发送一个 GET 请求,获取产品信息,并提取产品 ID 列表。

  • 步骤

    1. 使用 given() 设置查询参数。
    2. 发送 GET 请求并提取 JSON 响应。
    3. 使用 jsonPath() 提取 records.prodId 列表。
    4. 打印提取到的产品 ID 列表。
用途

该方法展示了如何提取 JSON 响应中的数组数据。可以用于从响应体中提取多个相同类型的元素(如产品 ID)。



3. test_html() 方法 - 提取 HTML 响应中的数据

@Test
public void test_html() {String jsonData = "{\"principal\":\"lemon_auto\",\"credentials\":\"lemon123456\",\"appType\":3,\"loginType\":0}";Response response =given().log().all().queryParam("prodName", "测试").queryParam("sort", 0).queryParam("orderBy", 0).queryParam("current", 1).when().get("https://www.baidu.com/").then().log().all().extract().response();Object value = response.htmlPath().get("html.head.title");System.out.println(value);
}
代码逻辑
  • 目标:该测试发送一个 GET 请求获取百度首页,并提取 HTML 响应中的 title 标签内容。

  • 步骤

    1. 发送 GET 请求到百度首页。
    2. 使用 htmlPath() 提取 HTML 内容中的 title 标签。
    3. 打印提取到的 title 内容。
用途

该方法展示了如何提取 HTML 响应中的元素,常用于测试网页内容(如标题、元数据等)。



4. test_xml() 方法 - 提取 XML 响应中的数据

@Test
public void test_xml() {Response response =given().log().all().header("Content-Type","application/json; charset=UTF-8").when().get("http://httpbin.org/xml").then().log().all().extract().response();Object value = response.xmlPath().get("slideshow.slide[1].item[0]");System.out.println("\n打印结果为:" + value);
}
代码逻辑
  • 目标:该测试发送一个 GET 请求,获取 XML 格式的响应数据,并提取特定元素值。

  • 步骤

    1. 发送 GET 请求获取 XML 响应。
    2. 使用 xmlPath() 提取 slideshow.slide[1].item[0] 元素。
    3. 打印提取到的值。
用途

展示了如何从 XML 响应中提取数据,适用于解析 XML 格式的响应。



5. test_assert() 方法 - 使用断言验证响应

@Test
public void test_assert() {String jsonData = "{\"principal\":\"lemon_auto\",\"credentials\":\"lemon123456\",\"appType\":3,\"loginType\":0}";Response response =given().header("Content-Type","application/json; charset=UTF-8").body(jsonData).when().post("http://mall.lemonban.com:8107/login").then().log().all().extract().response();int statusCode = response.statusCode();Object actualvalue = response.jsonPath().get("nickName");Assert.assertEquals(statusCode, 200);Assert.assertEquals(actualvalue, "lemon_auto");System.out.println("打印结果为:" + actualvalue);
}
代码逻辑
  • 目标:发送 POST 请求进行登录,断言响应的状态码为 200,并验证 nickName 字段的值是否为 lemon_auto

  • 步骤

    1. 发送 POST 请求进行登录,获取响应。
    2. 提取响应的状态码和 nickName 字段。
    3. 使用 Assert.assertEquals() 断言状态码和 nickName 是否符合预期。
    4. 打印 nickName 的值。
用途

该方法展示了如何使用 TestNG 的断言功能进行验证,确保接口返回正确的状态码和数据。适用于验证 API 响应的正确性。


总结

这段代码展示了如何使用 Rest-Assured 提取和验证不同格式的响应数据(JSON、HTML、XML),以及如何使用 TestNG 进行断言验证。每个方法展示了不同的功能和用例,适用于不同类型的 API 测试。

  • test01():提取 JSON 响应中的 userId 字段。
  • test_json():提取 JSON 响应中的列表数据。
  • test_html():提取 HTML 响应中的 title 标签内容。
  • test_xml():提取 XML 响应中的指定元素。
  • test_assert():通过断言验证响应的状态码和字段值。

这些方法可以作为测试 RESTful API 时的数据提取和断言验证模板,帮助我们更高效地进行接口测试。





Rest-Assured API 测试笔记:购物车功能自动化测试

这段代码使用 Rest-AssuredTestNG 框架来进行购物车功能的接口自动化测试。下面是每个步骤的详细解释,包括代码逻辑和测试目的。


1. 登录并获取 token

// 1. 登录
String jsonData = "{\"principal\":\"lemon_auto\",\"credentials\":\"lemon123456\",\"appType\":3,\"loginType\":0}";
Response response1 =given().header("Content-Type", "application/json; charset=UTF-8").body(jsonData).when().post("http://mall.lemonban.com:8107/login").then().log().all().extract().response();// 提取返回的 token 和 token_type
String token = response1.jsonPath().get("access_token");
String token_type = response1.jsonPath().get("token_type");
String tokenValue = token_type + token;
System.out.println("打印结果为:" + tokenValue);
代码逻辑
  • 目标:登录并获取 access_tokentoken_type,然后生成完整的 tokenValue 用于后续接口请求的认证。

  • 步骤

    1. 使用 given() 设置请求头和请求体(登录的用户名、密码、appTypeloginType)。
    2. 使用 post() 发送 POST 请求进行登录。
    3. 使用 jsonPath() 提取返回的 access_tokentoken_type
    4. 拼接得到完整的 tokenValue,打印结果,用于后续的认证请求。
用途
  • 登录后,获取 token 用于后续 API 请求的认证,保证请求的安全性。

2. 搜索商品并获取 prodId

// 2. 选择商品
Response response2 =given().log().all().queryParam("prodName", "测试").queryParam("sort", 0).queryParam("orderBy", 0).queryParam("current", 1).when().get("http://mall.lemonban.com:8107/search/searchProdPage").then().log().all().extract().response();Object prodId = response2.jsonPath().get("records.prodId[0]");
System.out.println("打印结果为:" + prodId);
代码逻辑
  • 目标:搜索商品并从返回的响应中提取 prodId,用于后续商品详情查询或购物车操作。

  • 步骤

    1. 使用 queryParam() 设置查询参数,如商品名称、排序、当前页等。
    2. 发送 GET 请求并获取商品列表。
    3. 使用 jsonPath() 提取返回的商品列表中的第一个商品的 prodId
    4. 打印 prodId,用于后续操作。
用途
  • 通过商品名称等搜索条件获取商品的 prodId,在后续操作中使用该 ID(如获取商品详情、添加购物车等)。

3. 进入商品详情页并获取 shopIdskuId

// 3. 进入商品的详情页面
Response response3 =given().log().all().queryParam("prodId", prodId).when().get("http://shop.lemonban.com:8107/prod/prodInfo?prodId=5826").then().log().all().extract().response();// 获取店铺id
int shopId = response3.jsonPath().get("shopId");// 获取库存id
int skuId = response3.jsonPath().get("skuList.skuId[0]");
代码逻辑
  • 目标:进入商品详情页,获取 shopIdskuId,这两个 ID 是后续添加商品到购物车所需的参数。

  • 步骤

    1. 使用 queryParam() 传递 prodId 查询商品详情。
    2. 发送 GET 请求,获取商品的详细信息。
    3. 使用 jsonPath() 提取 shopIdskuId
用途
  • 获取商品的 shopIdskuId,这两个参数对于后续添加商品到购物车时是必需的。

4. 添加商品到购物车

// 4. 添加购物车
String jsonData4 = String.format("{\"basketId\":%d,\"count\":1,\"prodId\":\"%s\",\"shopId\":%d,\"skuId\":%d}",basketId, prodId, shopId, skuId
);Response response4 =given().log().all().header("Content-Type", "application/json; charset=UTF-8").header("Authorization", tokenValue).body(jsonData4).when().post("http://shop.lemonban.com:8107/p/shopCart/changeItem").then().log().all().extract().response();// 断言状态码和响应内容
int statusCode = response4.getStatusCode();
Assert.assertEquals(statusCode, 200, "添加购物车失败,状态码不是 200");
System.out.println("响应内容为:" + response4.getBody().asString());
代码逻辑
  • 目标:构建请求体,将商品添加到购物车。

  • 步骤

    1. 使用 String.format() 格式化请求体,填充 basketIdprodIdshopIdskuId
    2. 使用 given() 设置请求头(包括认证 token)和请求体。
    3. 发送 POST 请求将商品添加到购物车。
    4. 获取响应并进行断言,确保返回状态码为 200,表示成功添加商品。
用途
  • 通过 POST 请求将商品添加到购物车,验证接口返回的状态码是否为 200,确保添加成功。

5. 断言验证

// 断言验证
int statusCode = response4.getStatusCode();
Assert.assertEquals(statusCode, 200, "添加购物车失败,状态码不是 200");
代码逻辑
  • 目标:验证添加商品到购物车的接口响应是否正确,确保返回的状态码为 200。

  • 步骤

    1. 获取响应的状态码。
    2. 使用 Assert.assertEquals() 验证状态码是否为 200,如果不是,则抛出异常,测试失败。
用途
  • 断言状态码是否为 200,以确保购物车添加操作成功。

总结

这段代码展示了如何使用 Rest-AssuredTestNG 进行购物车功能的接口自动化测试,涵盖了以下测试步骤:

  1. 登录:获取 access_token,用于后续接口请求的认证。
  2. 商品搜索:获取商品的 prodId
  3. 商品详情:获取商品的 shopIdskuId
  4. 添加购物车:将商品添加到购物车,并验证接口返回的状态码是否为 200。
  5. 断言验证:确保购物车功能的操作成功,验证接口响应的准确性。

每个步骤都涵盖了如何发送请求、提取数据和进行验证,是实现 API 测试的一种有效方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式-4.7】行为型——备忘录模式

说明&#xff1a;本文介绍行为型设计模式之一的备忘录模式 定义 备忘录模式&#xff08;Memento Pattern&#xff09;又叫作快照模式&#xff08;Snapshot Pattern&#xff09;或令牌模式&#xff08;Token Pattern&#xff09;指在不破坏封装的前提下&#xff0c;捕获一个对…

2025年渗透测试面试题总结-天融信[社招]渗透测试工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 天融信[社招]渗透测试工程师 一、Java Spring Boot组件漏洞 1. CVE-2018-1270&#xff08;WebSocket RCE&…

华为OD机考-内存冷热标记-多条件排序

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextInt();int[] arr new int[a];for(int…

PPT转图片拼贴工具 v3.0

软件介绍 这个软件就是将PPT文件转换为图片并且拼接起来。 这个代码支持导入单个文件也支持导入文件夹 但是目前还没有解决可视化界面问题。 效果展示 软件源码 import os import re import win32com.client from PIL import Image from typing import List, Uniondef con…

NLP学习路线图(三十):微调策略

在自然语言处理领域,预训练语言模型(如BERT、GPT、T5)已成为基础设施。但如何让这些“通才”模型蜕变为特定任务的“专家”?微调策略正是关键所在。本文将深入剖析七种核心微调技术及其演进逻辑。 一、基础概念:为什么需要微调? 预训练模型在海量语料上学习了通用语言表…

讲述我的plc自学之路 第十三章

我和lora都是那种理想主义者&#xff0c;这是我们的共同之处。但是lora比我要更文艺一些&#xff0c;她读的书毕竟比我多&#xff0c;上的又是名校。受北大人文气息的熏陶&#xff0c;她总是对爱情充满了太多幻想。 “说说你的过往吧&#xff0c;lora。”我给lora倒了一杯啤酒&…

GPU虚拟化

引言 现有如下环境&#xff08;注意相关配置&#xff1a;只有一个k8s节点&#xff0c;且该节点上只有一张GPU卡&#xff09;&#xff1a; // k8s版本 $ kubectl version Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.7&…

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…

AI智能驱动浏览器工具Browser Use详解

前言 在之前关于 AI 测试相关的几篇文章中,我们分别介绍了通过 playwright-mcp,以及 midscene.js、magentic ui 等几个不同的 AI 浏览器工具,实现 AI 驱动自动化测试的方法介绍。而其实在这些不断涌现的新工具出现之前,还有一个更早推出(2024.11),也同样还在不断完善的…

新成果:GaN基VCSEL动态物理模型开发

作为高速数据传输与光电信号处理的核心器件&#xff0c;垂直腔面发射激光器&#xff08;VCSEL&#xff09;在高速光通信、激光雷达等领域应用广泛&#xff0c;其动态特性直接关联器件调制速率及稳定性等关键参数。近期&#xff0c;天津赛米卡尔科技有限公司技术团队开发了GaN基…

嵌入式学习笔记 - freeRTOS xTaskResumeAll( )函数解析

第一部分 移除挂起等待列表中的任务 while( listLIST_IS_EMPTY( &xPendingReadyList ) pdFALSE )//循环寻找直到为空&#xff0c;把全部任务扫描一遍 { pxTCB ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingR…

大数据+智能零售:数字化变革下的“智慧新零售”密码

大数据+智能零售:数字化变革下的“智慧新零售”密码 大家好,今天咱们聊聊一个火到不行的话题:大数据在智能零售中的应用。这个领域,不仅是技术的“硬核战场”,更是商业创新的风口浪尖。谁能玩转数据,谁就能掌控消费者心智,实现销售爆发。 咱们不搞枯燥学术,而是用最“…

react 常见的闭包陷阱深入解析

一、引子 先来看一段代码,你能说出这段代码的问题在哪吗? const [count, setCount] = useState(0); useEffect(() => {const timer = setTimeout(() => {setCount(count + 1);}, 1000);return () => clearTimeout(timer); }, []);正确答案: 这段代码存在闭包陷阱…

零基础在实践中学习网络安全-皮卡丘靶场(第十五期-URL重定向模块)

本期内容和之前的CSRF&#xff0c;File inclusion有联系&#xff0c;复习后可以更好了解 介绍 不安全的url跳转 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目…

Python训练营---DAY48

DAY 48 随机函数与广播机制 知识点回顾&#xff1a; 随机张量的生成&#xff1a;torch.randn函数卷积和池化的计算公式&#xff08;可以不掌握&#xff0c;会自动计算的&#xff09;pytorch的广播机制&#xff1a;加法和乘法的广播机制 ps&#xff1a;numpy运算也有类似的广播机…

什么是ANSYS ACT? ACT又可以分为哪几类?

ANSYS作为目前仿真界主流软件之一&#xff0c;除了给用户提供其强大的功能之外&#xff0c;还给用户提供了高度自定义定制的权限。所谓定制&#xff0c;也即用户可以根据自己仿真需求修改现有功能并展示全新功能的产品内操作。定制的目标是改变现有的用户体验&#xff0c;以满足…

电路图识图基础知识-电动机正反转控制电路详解(二十)

1. 转换开关手动正反转控制电路 转换开关&#xff08;QS&#xff09;又称倒顺开关&#xff0c;是一种手动控制装置&#xff0c;可切换电动机的旋转方向。它具有三个工作位置&#xff1a;正向、停止和反向。 工作原理&#xff1a; 闭合总电源开关 QS若需正向运转&#xff0c;将…

Spring Boot微服务架构(十):Docker与K8S部署的区别

Spring Boot微服务在Docker与Kubernetes&#xff08;K8S&#xff09;中的部署存在显著差异&#xff0c;主要体现在技术定位、管理能力、扩展性及适用场景等方面。以下是两者的核心区别及实践对比&#xff1a; 一、技术定位与核心功能 Docker 功能&#xff1a;专注于单节点容器化…

性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断

&#x1f680; 性能剖析&#xff1a;在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断 &#x1f4da; 目录 &#x1f680; 性能剖析&#xff1a;在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断一、为什么选择 MiniProfiler&#xff1f; &#x1f9d0;二、集成 MiniProf…

ESP32 在Arduino开发环境中,如果程序运行报错如何定位程序报错是哪行代码

在开发中&#xff0c;我们常常会遇到编译正常&#xff0c;但是运行过程中程序报错&#xff0c;然后重启&#xff0c;在这种情况下&#xff0c;又没法知道是哪段程序引起的&#xff0c;现在我们就来解决这个问题。 其实ESP32的SDK中已经附带这些debug的工具了。 首先如果我们程…