商品信息管理自动化测试

news2025/1/30 19:19:40

目录

前言

一、思维导图

二、代码编写

1.在pom.xml文件中添加相关依赖

         2.自动化代码编写

三、代码测试

小结


前言

1. 针对商品信息管理项目进行测试,商品信息管理项目主要有商品列表页、部门列表页、员工列表页,主要功能:对商品信息的增删改查的功能。对于商品信息管理的测试主要就是对主要功能进行测试,按照页面以及测试用例的思维导图进行自动化脚本的编写及测试。

2.自动化测试一般步骤:

1)使用Xmind编写web自动化测试用例

2)创建自动化项目,根据测试用例实现脚本的编写及测试

一、思维导图

web自动化测试用例思维导图

二、代码编写

  1. 根据思维导图进行测试用例的代码编写,每个页面一个测试类,然后在各个测试类中进行测试用例的编写。
  2. 注意公共属性需要单独放一个类,方便进行代码复用。
  3. 创建启动以及截图会频繁进行复用,所以创建方法进行封装。
  4. 注意添加隐式等待,为了确保页面正确加载显示

1.在pom.xml文件中添加相关依赖

<!--引入驱动管理依赖-->
<dependency>
     <groupId>io.github.bonigarcia</groupId>
     <artifactId>webdrivermanager</artifactId>
     <version>5.8.0</version>
     <scope>test</scope>
     </dependency>
<!--引入selenium依赖-->
<dependency>
      <groupId>org.seleniumhq.selenium</groupId>
      <artifactId>selenium-java</artifactId>
      <version>4.0.0</version>
</dependency>
<!--引入屏幕截图依赖-->
<dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
</dependency>

2.自动化代码编写

代码只展示主要部分

1.创建驱动对象和截屏会频繁使用,将其封装成方法


// 创建驱动对象
void createDriver() {
     if (driver == null) {
         // 1. 使用驱动管理程序打开谷歌浏览器驱动;
         WebDriverManager.chromedriver().setup();
         //  添加浏览器配置-创建的驱动对象允许浏览器访问所有链接
         ChromeOptions options = new ChromeOptions();
         options.addArguments("--remote-allow-origins=*");

         driver = new ChromeDriver(options);
     }
}

/**
 * 截屏并保存到指定目录下
 * 文件名格式:./src/test/images/2025-01-29/FirstTest_130725.png
 */
private void getScreenshot(String str) throws IOException {
     SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");// 日期 2025-01-29
     SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");// 时间戳 13时07分25秒25毫秒

     String dirTime = sim1.format(System.currentTimeMillis());// 日期目录 2025-01-29
     String fileTime = sim2.format(System.currentTimeMillis());// 时间戳 13时07分25秒25毫秒
//     ./src/test/images/2025-01-29/FirstTest_130725.png
     String fileName = "./src/test/images/"+dirTime + "/"+str + "_" +fileTime + ".png";// 文件名
     System.out.println("截图文件名(fileName):" + fileName);

//    拍截屏文件并保存到指定目录下
     File srcFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
     FileUtils.copyFile(srcFile, new File(fileName));
}

2. 测试商品搜索功能

  • 测试页面能否正常打开
  • 测试能否依据名字查询商品信息
  • 测试能否依据品牌查询商品信息
/**
 * 测试 商品根据名字进行搜索的功能
 * @throws IOException
 */
void retrieveProduct() throws IOException, InterruptedException {
     createDriver();
     driver.get("http://localhost:90/#/product");
     // 获取商品页面中的输入框元素
     WebElement element = driver.findElement(By.cssSelector("body > div > section > section > main > form > div:nth-child(1) > div > div > input"));
     // 输入框输入内容 床上桌
     element.sendKeys("床上桌");
     // 点击搜索按钮
     driver.findElement(By.cssSelector("body > div > section > section > main > form > div:nth-child(2) > div > button")).click();
     Thread.sleep(1000);
     // 截屏并保存到指定目录下
     getScreenshot("ProductPageTest");

     //显示商品的详细信息,点击确定按钮
     driver.findElement(By.cssSelector("body > div:nth-child(2) > section > section > main > div:nth-child(2) > div > div.el-dialog__footer > div > button.el-button.el-button--primary")).click();

     // 删除输入框中的内容 床上桌
     element.clear();

     driver.quit();
}

3.测试新增商品功能

  • 测试新增商品按钮功能能否正常使用
  • 测试填写新增商品的所有信息能否新增成功
  • 测试填写部分新增商品的信息能否新增成功
  • 测试不填写新增商品信息能否新增成功
/**
 * 测试 新增商品
 * @throws IOException
 * @throws InterruptedException
 */
void createProduct() throws IOException, InterruptedException {
     createDriver();
     driver.get("http://localhost:90/#/product");
     // 点击新增按钮
     driver.findElement(By.cssSelector("body > div > section > section > main > div.el-row > button")).click();

//     获取 名字输入框元素
     WebElement nameInput = driver.findElement(By.cssSelector("body > div:nth-child(2) > section > section > main > div:nth-child(4) > div > div.el-dialog__body > form > div:nth-child(1) > div > div > input"));
     // 输入内容 插头
     nameInput.clear();
     nameInput.sendKeys("插头");

     //  获取 价格输入框元素
     WebElement priceInput = driver.findElement(By.cssSelector("body > div:nth-child(2) > section > section > main > div:nth-child(4) > div > div.el-dialog__body > form > div:nth-child(2) > div > div > input"));
     // 输入内容 100
     priceInput.clear();
     priceInput.sendKeys("100");

     // 获取 品牌输入框元素
     WebElement descInput = driver.findElement(By.cssSelector("body > div:nth-child(2) > section > section > main > div:nth-child(4) > div > div.el-dialog__body > form > div:nth-child(3) > div > div > input"));
     // 输入内容
     descInput.clear();
     descInput.sendKeys("公牛");

     // 获取库存输入框元素
     WebElement stockInput = driver.findElement(By.cssSelector("body > div:nth-child(2) > section > section > main > div:nth-child(4) > div > div.el-dialog__body > form > div:nth-child(4) > div > div > input"));
     // 输入内容 100
     stockInput.clear();
     stockInput.sendKeys("100");

     // 点击确定按钮
     driver.findElement(By.cssSelector("body > div:nth-child(2) > section > section > main > div:nth-child(4) > div > div.el-dialog__footer > div > button.el-button.el-button--primary")).click();

     // 显示等待1秒,直到确定按钮被点击,然后刷新页面
     WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(1));
     wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("body > div:nth-child(2) > section > section > main > div:nth-child(4) > div > div.el-dialog__footer > div > button.el-button.el-button--primary")));
     // 刷新页面
     driver.navigate().refresh();
//     Thread.sleep(1000);
     // 截屏并保存到指定目录下
     getScreenshot("ProductPageTest");
     // 断言新增的商品是否存在
//        WebElement product = driver.findElement(By.xpath("//td[contains(text(),'插头')]"));
//     assert product != null;

     driver.quit();
}

4.测试修改商品信息功能

  • 测试编辑按钮功能能否正常使用
  • 测试修改商品的所有信息能否修改成功
  • 测试修改商品的部分信息能否修改成功
/**
 * 测试 修改商品的价格
 * @throws IOException
 * @throws InterruptedException
 */
void updateProduct() throws IOException, InterruptedException {
     createDriver();
     driver.get("http://localhost:90/#/product");
//     Thread.sleep(1000);
//     隐式等待1秒
     driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000));
     // 点击编辑按钮
        driver.findElement(By.xpath("/html/body/div/section/section/main/div[4]/div[3]/table/tbody/tr[1]/td[5]/div/button[1]")).click();
     // 获取 价格输入框元素
     WebElement priceInput = driver.findElement(By.cssSelector("body > div:nth-child(2) > section > section > main > div:nth-child(7) > div > div.el-dialog__body > form > div:nth-child(2) > div > div > input"));
     // 修改价格为 20
     priceInput.clear();
     priceInput.sendKeys("20");
     // 点击确定按钮
     driver.findElement(By.cssSelector("body > div:nth-child(2) > section > section > main > div:nth-child(7) > div > div.el-dialog__footer > div > button.el-button.el-button--primary")).click();
     // 显示等待1秒,直到确定按钮被点击,然后刷新页面
     WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(1));
     wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("body > div:nth-child(2) > section > section > main > div:nth-child(7) > div > div.el-dialog__footer > div > button.el-button.el-button--primary")));
     // 刷新页面
     driver.navigate().refresh();
     // 截屏并保存到指定目录下
     getScreenshot("ProductPageTest");
     // 断言修改后的价格是否正确
//     WebElement product = driver.findElement(By.xpath("//td[contains(text(),'20')]"));
//     assert product != null;

     driver.quit();
}

5.测试删除商品功能

  • 测试删除按钮是否能够正常使用
  • 测试点击删除按钮再确认删除能否删除成功
  • 测试点击删除按钮再取消删除能否取消删除成功
  • 测试删除成功后刷新页面是否能够显示非删除数据
/**
 * 测试 删除商品
 * @throws IOException
 * @throws InterruptedException
 */
void deleteProduct() throws IOException, InterruptedException {
     createDriver();
     driver.get("http://localhost:90/#/product");
     // 点击删除按钮
     driver.findElement(By.xpath("/html/body/div/section/section/main/div[4]/div[3]/table/tbody/tr[1]/td[5]/div/button[2]")).click();
     // 点击确定按钮
//     driver.findElement(By.cssSelector("body > div:nth-child(2) > section > section > main > div:nth-child(6) > div > div.el-dialog__footer > div > button.el-button--primary")).click();
     // 显示等待1秒,直到确定按钮被点击,然后刷新页面
     WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(1));
     wait.until(ExpectedConditions.elementToBeClickable(By.xpath("/html/body/div/section/section/main/div[4]/div[3]/table/tbody/tr[1]/td[5]/div/button[2]")));
     // 刷新页面
     driver.navigate().refresh();
     // 截屏并保存到指定目录下
     getScreenshot("ProductPageTest");
     // 断言删除后的商品是否不存在
//     WebElement product = driver.findElement(By.xpath("//td[contains(text(),'头')]"));
//     assert product == null;

     driver.quit();
}

三、代码测试

所有测试用例通过,但发现测试耗时有些长,说明性能还有优化的空间。

小结

  1. 一定要关注测试用例的执行顺序问题
  2. 对于页面的检查一定要到位,如检查元素是否存在确保页面的正确性
  3. 驱动关闭的位置要注意,只有最后一个用例结束之后才进行关闭
  4. 为了把所有的用例的执行结果保存下来,方便后续查错或查看,此时就需要进行该方法的定义即封装一个屏幕截图的方法
  5. 注意屏幕截图保存的方式:动态时间戳并进行时间格式化,然后期望按照某种维度(天、周)以文件夹的方式进行保存
  6. 在定位元素时,当复制的cssSelector的值比较长时建议复制xpath,因为cssSelector的值比较长就可能会导致定位元素失败
  7. 可以适当关注用例执行时间,如果时间过长就需要考虑是我们自己写的测试用例的问题还是程序真的有性能问题

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

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

相关文章

【实践】基于SakuraLLM的离线日文漫画及视频汉化

介绍 LLM 大型语言模型&#xff08;英语&#xff1a;large language model&#xff0c;LLM&#xff09;&#xff0c;也称大语言模型&#xff0c;是由具有大量参数&#xff08;通常数十亿个权重或更多&#xff09;的人工神经网络组成的一类语言模型。在进行语言理解与分析&…

常见的同态加密算法收集

随着对crypten与密码学的了解&#xff0c;我们将逐渐深入学习相关知识。今天&#xff0c;我们将跟随同态加密的发展历程对相关算法进行简单的收集整理 。 目录 同态加密概念 RSA算法 ElGamal算法 ELGamal签名算法 Paillier算法 BGN方案 Gentry 方案 BGV 方案 BFV 方案…

SSM-MyBatis-总结

文章目录 一、Hello MyBatis1.1 流程1.2 总结 二、Crud 的一些注意点三、参数传递3.1 #{ } VS ${ }3.2 单、复参数传递&#xff08;1&#xff09;单参数&#xff08;2&#xff09;多参数 -- Param&#xff08;3&#xff09;总结 四、查询结果返回--结果封装4.1 ResultType 一般…

万字长文总结前端开发知识---JavaScriptVue3Axios

JavaScript学习目录 一、JavaScript1. 引入方式1.1 内部脚本 (Inline Script)1.2 外部脚本 (External Script) 2. 基础语法2.1 声明变量2.2 声明常量2.3 输出信息 3. 数据类型3.1 基本数据类型3.2 模板字符串 4. 函数4.1 具名函数 (Named Function)4.2 匿名函数 (Anonymous Fun…

Flutter android debug 编译报错问题。插件编译报错

下面相关内容 都以 Mac 电脑为例子。 一、问题 起因&#xff1a;&#xff08;更新 Android studio 2024.2.2.13、 Flutter SDK 3.27.2&#xff09; 最近 2025年 1 月 左右&#xff0c;我更新了 Android studio 和 Flutter SDK 再运行就会出现下面的问题。当然 下面的提示只是其…

【Proteus仿真】【51单片机】简易计算器系统设计

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD1602液晶显示 2、矩阵按键​ 3、可以进行简单的加减乘除运算 4、最大 9999*9999 二、使用步骤 系统运行后&#xff0c;LCD1602显示数据&#xff0c;通过矩阵按键…

JavaScript函数中this的指向

总结&#xff1a;谁调用我&#xff0c;我就指向谁&#xff08;es6箭头函数不算&#xff09; 一、ES6之前 每一个函数内部都有一个关键字是 this &#xff0c;可以直接使用 重点&#xff1a; 函数内部的 this 只和函数的调用方式有关系&#xff0c;和函数的定义方式没有关系 …

51单片机入门_01_单片机(MCU)概述(使用STC89C52芯片;使用到的硬件及课程安排)

文章目录 1. 什么是单片机1.1 微型计算机的组成1.2 微型计算机的应用形态1.3 单板微型计算机1.4 单片机(MCU)1.4.1 单片机内部结构1.4.2 单片机应用系统的组成 1.5 80C51单片机系列1.5.1 STC公司的51单片机1.5.1 STC公司单片机的命名规则 2. 单片机的特点及应用领域2.1 单片机的…

51单片机入门_02_C语言基础0102

C语言基础部分可以参考我之前写的专栏C语言基础入门48篇 以及《从入门到就业C全栈班》中的C语言部分&#xff0c;本篇将会结合51单片机讲差异部分。 课程主要按照以下目录进行介绍。 文章目录 1. 进制转换2. C语言简介3. C语言中基本数据类型4. 标识符与关键字5. 变量与常量6.…

时间轮:XXL-JOB 高效、精准定时任务调度实现思路分析

大家好&#xff0c;我是此林。 定时任务是我们项目中经常会遇到的一个场景。那么如果让我们手动来实现一个定时任务框架&#xff0c;我们会怎么做呢&#xff1f; 1. 基础实现&#xff1a;简单的线程池时间轮询 最直接的方式是创建一个定时任务线程池&#xff0c;用户每提交一…

人工智能如何驱动SEO关键词优化策略的转型与效果提升

内容概要 随着数字化时代的到来&#xff0c;人工智能&#xff08;AI&#xff09;技术对各行各业的影响日益显著&#xff0c;在搜索引擎优化&#xff08;SEO&#xff09;领域尤为如此。AI的应用不仅改变了关键词研究的方法&#xff0c;而且提升了内容生成和搜索优化的效率&…

【NLP251】NLP RNN 系列网络

NLP251 系列主要记录从NLP基础网络结构到知识图谱的学习 &#xff11;.原理及网络结构 &#xff11;.&#xff11;&#xff32;&#xff2e;&#xff2e; 在Yoshua Bengio论文中( http://proceedings.mlr.press/v28/pascanu13.pdf )证明了梯度求导的一部分环节是一个指数模型…

【越学学糊涂的Linux系统】Linux指令篇(二)

一、pwd指令&#xff1a; 00x0:打印该用户当前目录下所属的文件路径 看指令框可以看出我用的是一个叫sw的用户&#xff0c;我们的路径就是在一个home目录下的sw目录下的class113文件路径。 也可以说是指出当前所处的工作目录 补充&#xff1a;&#x1f386;​​​​​​​Wi…

【AI论文】Omni-RGPT:通过标记令牌统一图像和视频的区域级理解

摘要&#xff1a;我们提出了Omni-RGPT&#xff0c;这是一个多模态大型语言模型&#xff0c;旨在促进图像和视频的区域级理解。为了在时空维度上实现一致的区域表示&#xff0c;我们引入了Token Mark&#xff0c;这是一组在视觉特征空间中突出目标区域的标记。这些标记通过使用区…

Java面试题2025-并发编程基础(多线程、锁、阻塞队列)

并发编程 一、线程的基础概念 一、基础概念 1.1 进程与线程A 什么是进程&#xff1f; 进程是指运行中的程序。 比如我们使用钉钉&#xff0c;浏览器&#xff0c;需要启动这个程序&#xff0c;操作系统会给这个程序分配一定的资源&#xff08;占用内存资源&#xff09;。 …

Three城市引擎地图插件Geo-3d

一、简介 基于Three开发&#xff0c;为Three 3D场景提供GIS能力和城市底座渲染能力。支持Web墨卡托、WGS84、GCJ02等坐标系&#xff0c;支持坐标转换&#xff0c;支持影像、地形、geojson建筑、道路&#xff0c;植被等渲染。支持自定义主题。 二、效果 三、代码 //插件初始化…

MySQL的复制

一、概述 1.复制解决的问题是让一台服务器的数据与其他服务器保持同步&#xff0c;即主库的数据可以同步到多台备库上&#xff0c;备库也可以配置成另外一台服务器的主库。这种操作一般不会增加主库的开销&#xff0c;主要是启用二进制日志带来的开销。 2.两种复制方式&#xf…

【后端开发】字节跳动青训营Cloudwego脚手架

Cloudwego脚手架使用 cwgo脚手架 cwgo脚手架 安装的命令&#xff1a; GOPROXYhttps://goproxy.cn/,direct go install github.com/cloudwego/cwgolatest依赖thriftgo的安装&#xff1a; go install github.com/cloudwego/thriftgolatest编辑echo.thrift文件用于生成项目&…

ArcGIS10.2 许可License点击始终启动无响应的解决办法及正常启动的前提

1、问题描述 在ArcGIS License Administrator中&#xff0c;手动点击“启动”无响应&#xff1b;且在计算机管理-服务中&#xff0c;无ArcGIS License 或者License的启动、停止、禁止等均为灰色&#xff0c;无法操作。 2、解决方法 ①通过cmd对service.txt进行手动服务的启动…

Cyber Security 101-Build Your Cyber Security Career-Security Principles(安全原则)

了解安全三元组以及常见的安全模型和原则。 任务1&#xff1a;介绍 安全已成为一个流行词;每家公司都想声称其产品或服务是安全的。但事实真的如此吗&#xff1f; 在我们开始讨论不同的安全原则之前&#xff0c;了解我们正在保护资产的对手至关重要。您是否试图阻止蹒跚学步…