个人论坛的测试报告

目录

一、项目的介绍

二、项目功能

三、测试项目 

1.编写测试用例​编辑

2.执行部分测试用例

3.自动化测试 

        1)添加相关Maven依赖(pom.xml)

        2)编写论坛系统的界面测试用例 

        3)编写自动化代码测试部分测试用例

4.性能测试


一、项目的介绍

        本项目是基于 Spring 开发的前后端分离的论坛系统。

        在该项目的开发中使用到 SpringBoot 构建项目基础框架 、SpringMVC 开发 Web 应用程序 及 mybatis-plus 来操作数据库等。

二、项目功能

        本项目实现了登录,注册,展示用户信息,修改用户信息,发布帖子,查看帖子,点赞帖子,回复帖子,用户间私聊等功能。

        登录界面:

        注册界面:

        论坛页面展示:

        帖子内容与帖子回复:

        用户信息展示:

        收到的私信:

三、测试项目 

1.编写测试用例

2.执行部分测试用例

登录界面测试:

        1)输入正确的用户名与密码 -- 登录成功进入首页

        2)输入错误的用户名 -- 提示用户名错误

        3)输入错误的密码 -- 提示密码错误 

注册界面测试:

        1)输入基本的注册信息  -- 成功注册并跳转登录界面

        2)输入存在的用户名 -- 提示用户名已存在 

        3)密码与确认密码不一致 -- 提示检查确认密码 

个人中心测试:

        修改个人信息 -- 提示修改成功并更换页面信息:

        修改前:
        修改后:

发帖测试:

        发送帖子 -- 提示发送成功并在首页显示帖子 :

发送私信测试

        给用户发送私信 -- 提示发送成功,接受者收到私信

3.自动化测试 

        1)添加相关Maven依赖(pom.xml)
<dependencies><!-- 用来自动下载浏览器驱动 --><dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.8.0</version><scope>test</scope></dependency><!-- 用来自动化Web浏览器操作 --><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>
</dependencies>
        2)编写论坛系统的界面测试用例 

        3)编写自动化代码测试部分测试用例

Utils类:
        用来定义不同页面测试所用到的
公共属性(例如:浏览器驱动),定义一些公共方法,(例如:屏幕截图,创建浏览器驱动

package common;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;public class Utils {// 定义浏览器驱动public static WebDriver driver = null;public WebDriverWait wait = null;public Utils(String url) {//调用driver对象driver = createDriver();// 显示等待wait = new WebDriverWait(driver, Duration.ofSeconds(2));// 浏览器跳转到 URL 界面driver.get(url);}// 创建浏览器驱动private WebDriver createDriver() {if(driver == null){//下载驱动WebDriverManager.chromedriver().setup();ChromeOptions options = new ChromeOptions();//允许访问所有的链接options.addArguments("--remote-allow-origins=*");driver = new ChromeDriver(options);//隐式等待driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));}return driver;}// 屏幕截图public void screenshot(String str,String describe) throws IOException {// 根据年月日创建文件夹SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");// 根据时分秒时间戳命名图片SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");String dirTime = sim1.format(System.currentTimeMillis());String fileTime = sim2.format(System.currentTimeMillis());// ./src/test/java/images/2025-04-14/test01/描述13972011.pngString filename = "./src/test/java/images/"+ dirTime + "/" + str + "/" + describe +fileTime + ".png";File image = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);FileUtils.copyFile(image,new File(filename));}// 从提示弹窗中获取文本public String getTestFromAler(String path) {String text = driver.findElement(By.xpath(path)).getText();text = text.replace("\n","").substring(3);return text;}
}

LoginTest类:
        用来自动化测试登录界面

package tests;
import common.Utils;
import org.openqa.selenium.By;
import java.io.IOException;// 自动化测试登录界面 继承 Utils 类就能使用 Utils 创建好的浏览器驱动和一些公共方法
public class LoginTest extends Utils {// 登录界面的URLprivate static String url = "http://127.0.0.1:58080/sign-in.html";public LoginTest() {super(url);}// 检查元素是否存在 -- 不存在就报错public void checkEleExist() {// 检查用户名输入框是否存在driver.findElement(By.cssSelector("#username"));// 检查密码输入框是否存在driver.findElement(By.cssSelector("#password"));// 检查登录按钮是否存在driver.findElement(By.cssSelector("#submit"));// 检查登录按钮是否存在driver.findElement(By.cssSelector("#submit"));// 检查点击注册是否存在driver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.text-center.text-muted.mt-3 > a"));// 检查图标是否存在driver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.text-center.mb-4 > img"));}// 登录成功测试public void checkLoginSuccess() throws IOException {//先清空输入框 防止有信息遗留在输入框上driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#submit")).click();// 检查首页的昵称存不存 存在--登录成功  不存在 -- 登录失败driver.findElement(By.cssSelector("#index_nav_nickname"));}// 登录失败测试public void LoginFail() throws InterruptedException {//先清空输入框 防止有信息遗留在输入框上driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();// 1. 不输入用户名driver.findElement(By.cssSelector("#username")).sendKeys("");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#submit")).click();// 获取请输入用户名提示String text = driver.findElement(By.cssSelector("#signInForm > div.mb-3 > div")).getText();// 要是获取的提示不正确报错assert "用户名不能为空".equals(text);// 2. 输入不存在的用户名driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys("zhang");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#submit")).click();// 从提示弹窗中获取文本String text2 = getTestFromAler("/html/body/div[2]/div[1]");// 要是获取的提示不正确报错assert "用户不存在".equals(text2);// 3. 输入错误的密码driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");driver.findElement(By.cssSelector("#password")).sendKeys("666");driver.findElement(By.cssSelector("#submit")).click();// 从提示弹窗中获取文本String text3 = getTestFromAler("/html/body/div[2]/div[2]");// 要是获取的提示不正确报错assert "密码错误".equals(text3);}
}

RegisterTest类:
        用来自动化测试注册界面

package tests;
import common.Utils;
import org.openqa.selenium.By;
import java.util.UUID;public class RegisterTest extends Utils {// 注册界面的URLprivate static String url = "http://127.0.0.1:58080/sign-up.html";public RegisterTest() {super(url);}// 检查元素是否存在 -- 不存在就报错public void checkEleExist() {// 检查用户名输入框是否存在driver.findElement(By.cssSelector("#username"));// 检查昵称输入框是否存在driver.findElement(By.cssSelector("#nickname"));// 检查密码输入框是否存在driver.findElement(By.cssSelector("#password"));// 检查确认密码是否存在driver.findElement(By.cssSelector("#passwordRepeat"));// 检同意条款是否存在driver.findElement(By.cssSelector("#policy"));// 检查注册按钮是否存在driver.findElement(By.cssSelector("#submit"));// 检查图标是否存在driver.findElement(By.cssSelector("body > div > div > div.text-center.mb-4 > img"));}// 测试注册成功public void checkRegisterSuccess() {// 先清除输入框内容inputBoxClear();// 获取随机字符串,避免用户名重复String userName = getUserName();// 输入正确的用户名,昵称,密码与确认密码,勾选同意使用条款能否注册成功driver.findElement(By.cssSelector("#username")).sendKeys(userName);driver.findElement(By.cssSelector("#nickname")).sendKeys(userName);driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#passwordRepeat")).sendKeys("123456");driver.findElement(By.cssSelector("#policy")).click();driver.findElement(By.cssSelector("#submit")).click();// 注册成功后会跳转登录界面 看看能不能获取到登录页面的元素String text = driver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.card.card-md > div > h2")).getText();// 要是获取的提示不正确报错assert "用户登录".equals(text);}// 测试注册失败public void checkRegisterFail() {// 注册用户名存在的用户driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");driver.findElement(By.cssSelector("#nickname")).sendKeys("张三");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#passwordRepeat")).sendKeys("123456");driver.findElement(By.cssSelector("#policy")).click();driver.findElement(By.cssSelector("#submit")).click();String text = getTestFromAler("/html/body/div[2]/div[1]");// 要是获取的提示不正确报错assert "用户名已存在".equals(text);// 先清除输入框内容inputBoxClear();String userName = getUserName();// 密码与确认密码不一样driver.findElement(By.cssSelector("#username")).sendKeys(userName);driver.findElement(By.cssSelector("#nickname")).sendKeys(userName);driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#passwordRepeat")).sendKeys("111111");driver.findElement(By.cssSelector("#submit")).click();// 打印提示框信息String text1 = driver.findElement(By.cssSelector("#signUpForm > div > div:nth-child(5) > div > div")).getText();// 要是获取的提示不正确报错assert "请检查确认密码".equals(text1);}// 用来清除注册界面输入框的内容private void inputBoxClear() {driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#nickname")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#passwordRepeat")).clear();}// 获取随机用户名private String getUserName() {UUID uuid = UUID.randomUUID();String username = String.valueOf(uuid);username = username.substring(1,8);return username;}
}

HomePageTest类:
        用来自动化测试首页

package tests;
import common.Utils;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keys;import java.io.IOException;
public class homePageTest extends Utils {public static String url = "http://127.0.0.1:58080/index.html";public homePageTest() {super(url);}public void checkUnLogin() throws IOException {// 截图查看未登录访问首页的结果screenshot("homePage","测试未登录访问首页");}// 检查元素是否存在 -- 不存在就报错public void checkEleExist() throws IOException {// 检查首页是否显示用户昵称driver.findElement(By.cssSelector("#index_nav_nickname"));// 检查发布帖子按钮是否存在driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post"));// 检查首页标签是否存在driver.findElement(By.cssSelector("#article_list_board_title"));// 检查帖子是否存在driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong"));// 检查板块是否存在driver.findElement(By.cssSelector("#topBoardList > li:nth-child(2) > a > span.nav-link-title"));// 检查私信图标是否存在driver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > div > a > svg"));// 截图查看首页的结果screenshot("homePage","检查首页元素");}// 测试能否成功发帖public void checkPost() throws InterruptedException {// 点击发布帖子driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")).click();// 写入帖子标题driver.findElement(By.cssSelector("#article_post_title")).sendKeys("自动化测试标题");// tab键跳转到输入内容的位置driver.findElement(By.cssSelector("#article_post_title")).sendKeys(Keys.TAB);// 输入帖子内容driver.switchTo().activeElement().sendKeys("自动化测试内容");// 等待50ms到输入帖子内容Thread.sleep(50);// 由于发布帖子按钮在页面下需要使用模拟使用鼠标滚轮滚到底部((JavascriptExecutor) driver).executeScript("window.scrollTo(0, document.body.scrollHeight)");// 强制等待0.5让页面滚到底部Thread.sleep(500);// 点击发布driver.findElement(By.cssSelector("#article_post_submit")).click();// 发送成功后会跳转到首页,获取首篇帖子标题看是否一致String title = driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).getText();// 要是获取的提示不正确报错assert "自动化测试标题".equals(title);}// 测试没有标题能否成功发帖public void checkPostNotTitle() throws InterruptedException {// 点击发布帖子driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")).click();driver.findElement(By.cssSelector("#article_post_title"));// tab键跳转到输入内容的位置driver.findElement(By.cssSelector("#article_post_title")).sendKeys(Keys.TAB);// 输入帖子内容driver.switchTo().activeElement().sendKeys("自动化测试内容");// 等待50ms到输入帖子内容Thread.sleep(50);// 由于发布帖子按钮在页面下需要使用模拟使用鼠标滚轮滚到底部((JavascriptExecutor) driver).executeScript("window.scrollTo(0, document.body.scrollHeight)");// 强制等待0.5让页面滚到底部Thread.sleep(500);// 点击发布driver.findElement(By.cssSelector("#article_post_submit")).click();String text = getTestFromAler("/html/body/div[4]/div[1]");// 要是获取的提示不正确报错assert "请输入帖子标题".equals(text);}// 测试没有内容能否成功发帖public void checkPostNotContent() throws InterruptedException {// 点击发布帖子driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")).click();// 写入帖子标题driver.findElement(By.cssSelector("#article_post_title")).sendKeys("自动化测试标题");// 由于发布帖子按钮在页面下需要使用模拟使用鼠标滚轮滚到底部((JavascriptExecutor) driver).executeScript("window.scrollTo(0, document.body.scrollHeight)");// 强制等待0.5让页面滚到底部Thread.sleep(500);// 点击发布driver.findElement(By.cssSelector("#article_post_submit")).click();String text2 = getTestFromAler("/html/body/div[4]/div[1]");// 要是获取的提示不正确报错assert "请输入帖子内容".equals(text2);}// 测试点击帖子能否跳转到帖子详情public void checkPostSkip() {// 点击帖子driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(2) > div > div.col > div.text-truncate > a > strong")).click();// 每个帖子都有一个点赞按钮// 获取点赞按钮 存在 -- 成功 不存在 -- 报错driver.findElement(By.cssSelector("#details_btn_like_count"));}
}

4.性能测试

        使用 jmeter 对登录页面,论坛首页,帖子详情页进行梯度压力测试

配置 100 个线程,每 2s 增加 10 个线程对页面进行测试梯度压力测试

 响应时间:

        通过折线图可以看出随着线程数的增加系统的响应时间越来越长。

TPS(每秒事务数):

        通过折线图可以看出系统的TPS随线程数的增加而增加一段时间后再一段区间波动

汇总报告:

        通过汇总报告可以看出性能测试整体数据的变化

运行命令生成性能测试报告:

        JMeter测试报告是⼀个全面而详细的文档,它提供了关于测试执行结果的详细信息。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《 C++ 点滴漫谈: 三十三 》当函数成为参数:解密 C++ 回调函数的全部姿势

一、前言 在现代软件开发中&#xff0c;“解耦” 与 “可扩展性” 已成为衡量一个系统架构优劣的重要标准。而在众多实现解耦机制的技术手段中&#xff0c;“回调函数” 无疑是一种高效且广泛使用的模式。你是否曾经在编写排序算法时&#xff0c;希望允许用户自定义排序规则&a…

大联盟(特别版)双端互动平台完整套件分享:含多模块源码+本地部署环境

这是一套结构清晰、功能完整的互动平台组件&#xff0c;适合有开发经验的技术人员进行模块参考、结构研究或本地部署实验使用。 该平台覆盖前端展示、后端服务、移动端资源以及完整数据库&#xff0c;采用模块化架构&#xff0c;整体部署流程简单清晰&#xff0c;适合自研团队参…

spark-SOL简介

Spark-SQL简介 一&#xff0e;Spark-SQL是什么 Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块 二&#xff0e;Hive and SparkSQL SparkSQL 的前身是 Shark&#xff0c;Shark是给熟悉 RDBMS 但又不理解 MapReduce 的技术人员提供的快速上手的工具 …

深入理解浏览器的 Cookie:全面解析与实践指南

在现代 Web 开发中&#xff0c;Cookie 扮演着举足轻重的角色。它不仅用于管理用户会话、记录用户偏好&#xff0c;还在行为追踪、广告投放以及安全防护等诸多方面发挥着重要作用。随着互联网应用场景的不断丰富&#xff0c;Cookie 的使用和管理也日趋复杂&#xff0c;如何在保障…

macOS 上使用 Homebrew 安装和配置 frp 客户端

macOS 上使用 Homebrew 安装和配置 frp 客户端 (frpc) 指南 frp (Fast Reverse Proxy) 是一款高性能的反向代理应用&#xff0c;常用于内网穿透。本文将介绍在 macOS 上使用 Homebrew 安装 frpc&#xff0c;并进行配置和管理。 一、安装 frpc 使用 Homebrew 安装&#xff08;…

【HarmonyOS NEXT】多目标产物构建实践

目录 什么是多产物构建 如何定义多个构建产物 如何在项目中使用 参考文章 什么是多产物构建 在鸿蒙应用开发中&#xff0c;一个应用可定义多个 product&#xff0c;每一个 product 对应一个定制的 APP 包&#xff0c;每个 product 中支持对 bundleName、bundleType、输出产…

腾讯云COS直传,官方后端demo,GO语言转JAVA

腾讯云COS直传,官方后端demo,GO写的,我们台是JAVA所以转一下,已跑通。废话不多说,直接上代码: Controller类如下: import com.ruoyi.web.core.config.CosConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.Ht…

C 语言 第八章 文件操作

目录 文件操作 文件和流的介绍 C 输入 & 输出 C 文件的读写 创建/打开文件 写入文件 fputc 函数 fputs 函数 fprintf 函数 实例&#xff1a; 读取文件 fgets函数 实例&#xff1a; 关闭文件 文件操作 文件和流的介绍 变量、数组、结构体等数据在运行时存储于内存…

C#容器源码分析 --- Dictionary<TKey,TValue>

Dictionary<TKey, TValue> 是 System.Collections.Generic 命名空间下的高性能键值对集合&#xff0c;其核心实现基于​​哈希表​​和​​链地址法&#xff08;Separate Chaining&#xff09;。 .Net4.8 Dictionary<TKey,TValue>源码地址&#xff1a; dictionary…

STM32自学进阶指南:从入门到精通的成长路径 | 零基础入门STM32第九十九步

主题内容教学目的/扩展视频自学指导通过数据手册和搜索引擎查找资料,独立解决问题以积累经验和提升能力。自学过程中应保持敬畏之心,不断总结未知领域,持续进步。师从洋桃电子,杜洋老师 📑文章目录 一、自学指导全景图1.1 学习路线对比1.2 关键学习策略二、待探索技术领域…

FPGA 37 ,FPGA千兆以太网设计实战:RGMII接口时序实现全解析( RGMII接口时序设计,RGMII~GMII,GMII~RGMII 接口转换 )

目录 前言 一、设计流程 1.1 需求理解 1.2 模块划分 1.3 测试验证 二、模块分工 2.1 RGMII→GMII&#xff08;接收方向&#xff0c;rgmii_rx 模块&#xff09; 2.2 GMII→RGMII&#xff08;发送方向&#xff0c;rgmii_tx 模块&#xff09; 三、代码实现 3.1 顶层模块 …

健康养生:为生活注入活力的艺术

在现代社会的高速运转下&#xff0c;健康养生逐渐成为大众热议的话题&#xff0c;它不再是老年人的专属&#xff0c;而是各个年龄段人群都在积极探索的生活方式。健康养生并非复杂的学术理论&#xff0c;而是一门将生活细节转化为健康能量的艺术&#xff0c;巧妙地为我们的生活…