厦门淘宝运营培训/论述搜索引擎优化的具体措施
自动化脚本源代码:Java: 利用Java解题与实现部分功能及小项目的代码集合 - Gitee.com
目录
·前言
一、项目简介
1.项目背景
2.应用技术
(1)后端开发
(2)前端开发
(3)数据库
二、项目功能
三、功能测试
1.编写测试用例
2.测试具体过程
(1)正常登录
(2)异常登录
(3)删除单个音乐
(4)删除选中音乐
(5)喜欢音乐
(6)上传音乐
(7)查询音乐
(8)取消喜欢音乐
四、自动化测试
1.编写自动化测试用例
2.自动化测试代码编写
(1)创建空项目
(2)创建测试用例工具类
(3)创建登录测试用例类
(4)创建音乐列表测试用例类
(5)创建喜欢列表测试用例类
(6)创建上传音乐测试用例类
(7)创建运行测试用例类
3.自动化测试执行结果
五、性能测试
1.创建梯度压测线程组
2.创建 HTTP 请求默认值
3.创建 HTTP Cookie 管理器
4.创建音乐播放器登录请求
5.创建获取音乐列表页请求
6.创建获取喜欢音乐列表页请求
7.性能测试执行结果
8.生成性能测试报告
·总结
·前言
前面文章中,我们把在线音乐播放器项目从零到一的都编写完成完成,并在每个模块编写的过程中,利用 Postman 进行了接口的简单测试,在本篇文章,我将对我们所编写的这个项目进行一个详细的测试并且再对本项目做一个整体的介绍,来检查我们项目中是否还存在问题,这里我们要进行的测试分为:功能测试、自动化测试、性能测试三种,最后将这些测试的过程及结果总结到一起形成这篇测试报告。
一、项目简介
1.项目背景
在数字化时代,音乐作为人们生活中不可或缺的一部分,其消费与传播方式发生了巨大变革。传统的音乐播放模式逐渐向线上转移,人们渴望能够通过便捷的网络平台随时随地畅享丰富多样的音乐资源。本在线音乐播放器项目正是为满足这一市场需求而开发,旨在为用户打造一个功能全面、操作便捷的音乐播放与管理平台,使用户无需受限于本地音乐存储,即可轻松探索、播放和管理海量音乐曲目。
2.应用技术
(1)后端开发
后端开发应用的技术如下所示:
- Spring 框架:作为核心框架,提供了依赖注入等功能,有效管理项目中的组件对象,解耦各模块之间的依赖关系,提高代码的可维护性与扩展性。
- SpringBoot:基于 Spring 进一步简化了项目的初始搭建与配置过程,通过自动配置特性,使开发者能够快速聚焦于业务逻辑开发,大大提高开发效率,同时也便于项目的部署与运维。
- Mybatis:负责数据库访问层的操作,能够将 SQL 查询语句与 Java 代码进行灵活映射,方便对 Mysql 数据库进行数据的持久化操作,如音乐信息、用户数据等的存储与读取,高效处理数据访问需求。
- SpringMVC:遵循 MVC 设计模式,实现了前端请求与后端处理逻辑的清晰分离与高效交互,负责接收并处理来自前端的各种 HTTP 请求,如用户登录、音乐查询与操作等请求,并将处理结果返回给前端页面进行展示。
- BCrypt 加密算法:用于对用户密码进行加密存储,保障用户密码在数据库中的安全性,有效防止密码泄露导致的用户账号安全问题,确保用户信息安全。
(2)前端开发
前端开发应用的技术如下所示:
- HTML:构建页面的基础结构,负责定义页面的各个元素与布局,如音乐列表界面、用户登录界面、喜欢音乐列表展示等页面的骨架搭建。
- CSS:用于美化页面样式,通过设置字体、颜色、背景、布局等样式属性,使页面呈现出美观、舒适的视觉效果,提升用户操作体验与界面友好度。
- JS:为页面添加动态交互功能,如实现音乐播放控制、用户操作响应(如点击登录按钮、添加喜欢音乐等)、数据验证等功能,增强页面的交互性与响应性。
- jQuery:简化了 JavaScript 的开发过程,提供了丰富的插件与便捷的操作方法,方便对页面元素进行选择、事件绑定、动画效果实现等操作,进一步提高前端开发效率与代码简洁性。
- Ajax:用于实现前端与后端的异步数据交互,在不刷新整个页面的情况下,能够在后台与服务器进行数据传输,如实时查询音乐、无刷新更新音乐播放列表等功能,提升用户体验的流畅性与实时性。
(3)数据库
采用 Mysql 关系型数据库进行数据存储,能够高效地组织与管理平台所需的各类数据,包括音乐信息(歌曲名、歌手、音频文件路径)、用户信息(用户名、密码)、用户音乐信息(喜欢音乐),确保数据的完整性、一致性与持久性,为平台的稳定运行提供数据支持。
二、项目功能
本在线音乐播放器项目的核心功能有:登录、上传音乐、删除指定音乐、批量删除选中的音乐、查询要找的音乐、添加音乐至喜欢列表、移除喜欢的音乐。
部分功能的详细介绍如下所示:
- 登录功能:用户名与加密后的密码都已经写入到后端的数据库中了,本项目目前还没有实现注册功能,即:用户名与密码是已经存在的,登录成功后就会跳转到音乐列表页。
- 音乐列表页:在这个页面中,我们可以看到所有的音乐信息,其包括音乐名称,歌手。在每个音乐对应的行中有播放音乐、删除音乐、喜欢音乐的三个按钮,这三个按钮也对应着三个功能,每个音乐前面设计了一个选择框,通过这个可以实现批量删除的操作。
- 喜欢音乐列表页:这个页面的整体布局与音乐列表页布局大致相同,只不过没有喜欢音乐及批量删除选中音乐的功能了,添加了取消喜欢音乐的功能和回到首页的功能,在这个页面中也可以针对喜欢的音乐进行查询操作。
- 上传音乐页面:在这个页面进行的就是上传音乐的操作,并且还有返回首页的连接。
三、功能测试
1.编写测试用例
功能测试的测试用例如下图所示:
2.测试具体过程
(1)正常登录
(2)异常登录
(3)删除单个音乐
(4)删除选中音乐
(5)喜欢音乐
(6)上传音乐
(7)查询音乐
(8)取消喜欢音乐
四、自动化测试
1.编写自动化测试用例
自动化测试的测试用例如下图所示:
2.自动化测试代码编写
(1)创建空项目
① 添加依赖(pom.xml 文件)代码如下所示:
<dependencies><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.0.0</version></dependency><dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.8.0</version><scope>test</scope></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency></dependencies>
② 创建项目结构,如下图所示:
(2)创建测试用例工具类
创建 Utils 类,用它存放我们自动化代码中通用的方法,在这个类中我们要创建的方法如下:
- 创建驱动对象;
- 创建屏幕截图方法;
- 创建构造方法。
有关 Utils 类的具体代码及详细介绍如下所示:
public class Utils {public static WebDriver driver;// 创建驱动对象public static 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(2));}// 有驱动对象之间返回return driver;}// 进阶版屏幕截图public void getScreenShot(String str) throws IOException {// 规定时间格式为 年-月-日, 如: 2024-11-17SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");// 规定时间格式为 时分秒毫秒, 如: 171953345SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");// 创建文件夹的名称, 以现在的日期来命名, 用 sim1 来转化时间格式String dirTime = sim1.format(System.currentTimeMillis());// 创建文件名称, 以现在的时间来命名, 用 sim2 来转化时间格式String fileTime = sim2.format(System.currentTimeMillis());// 拼接好完整文件名(包含:存放具体位置,及文件名称)String filename = "./src/test/image/" + dirTime + "/" + str + "-" + fileTime + ".png";// 屏幕截图File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);// 把截图 srcFile 放到指定的位置FileUtils.copyFile(srcFile, new File(filename));}// 创建构造方法, 接收访问页面的 URLpublic Utils(String url) {// 1. 调用 driver 对象driver = createDriver();// 2. 访问 URLdriver.get(url);}
}
(3)创建登录测试用例类
创建 LoginPage 类,在这里编写登录页面的所有测试用例,在这里我们要完成的事情如下:
- 检查登录页面是否正确加载;
- 检查正常登录功能是否正常;
- 检查异常登录功能是否正常。
有关 LoginPage 类的具体代码及详细介绍如下所示:
public class LoginPage extends Utils {// 指定页面的 URLprivate static String url = "http://127.0.0.1:8080/login.html";// 设置显式等待private WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(2));// 创建构造方法, 传入 urlpublic LoginPage() {super(url);}// 测试页面是否成功加载public void loginPageRight() throws InterruptedException {// 通过查看页面元素是否存在来检查页面加载是否成功// 查找状态提示框driver.findElement(By.cssSelector("#message"));// 获取页面标题String title = driver.getTitle();// 验证当前页面标题信息assert title.equals("音乐播放器登录页面");}// 检查登录功能----登录失败public void loginFail() throws InterruptedException {// 1. 测试用户名为空// 刷新当前页面,防止输入框中残留信息driver.navigate().refresh();driver.findElement(By.cssSelector("#user")).sendKeys("123");driver.findElement(By.cssSelector("#submit")).click();// 显式等待弹窗出现wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert();// 验证弹窗的文本信息assert alert.getText().equals("用户名或密码错误!");// 点击确定,关闭弹窗alert.accept();// 2. 测试用户名不存在driver.findElement(By.cssSelector("#user")).sendKeys("usseee");driver.findElement(By.cssSelector("#password")).sendKeys("123");driver.findElement(By.cssSelector("#submit")).click();wait.until(ExpectedConditions.alertIsPresent());assert alert.getText().equals("用户名或密码错误!");alert.accept();// 3. 测试用户名正确, 密码为空driver.findElement(By.cssSelector("#user")).sendKeys("lisi");driver.findElement(By.cssSelector("#submit")).click();wait.until(ExpectedConditions.alertIsPresent());assert alert.getText().equals("密码错误! ");alert.accept();// 4. 测试用户名正确, 密码错误driver.findElement(By.cssSelector("#user")).sendKeys("lisi");driver.findElement(By.cssSelector("#password")).sendKeys("232424");driver.findElement(By.cssSelector("#submit")).click();wait.until(ExpectedConditions.alertIsPresent());assert alert.getText().equals("密码错误! ");alert.accept();}// 检查登录功能----登录成功public void loginSuc() throws InterruptedException {// 刷新当前页面,防止输入框有残留信息driver.navigate().refresh();// 输入存在的用户名和正确的密码driver.findElement(By.cssSelector("#user")).sendKeys("lisi");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#submit")).click();// 显式等待, 等待弹窗出现wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert();// 验证弹窗文本信息assert alert.getText().equals("登录成功! ");// 点击确定,关闭弹窗alert.accept();// 获取当前页面标题String title = driver.getTitle();// 验证当前页面标题信息,观察是否成功跳转assert title.equals("在线音乐列表");}}
(4)创建音乐列表测试用例类
创建 ListPage 类,在这里编写列表页面的所有测试用例,在这里我们要完成的事情如下:
- 检查列表页面是否能正确加载;
- 检查音乐的查询功能是否正常;
- 检查音乐的删除功能是否正常;
- 检查选中音乐的删除功能是否正常;
- 检查喜欢音乐的功能是否正常。
有关 ListPage 类的具体代码及详细介绍如下所示:
public class ListPage extends Utils {// 指定页面的 URLprivate static String url = "http://127.0.0.1:8080/list.html";// 设置显式等待private WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(2));public ListPage() {super(url);}// 测试页面是否正确加载public void listPageRight() {driver.findElement(By.cssSelector("#exampleInputName2"));// 获取页面标题String title = driver.getTitle();// 验证当前页面标题信息assert title.equals("在线音乐列表");}// 检查音乐的查询功能public void selectMusic() {WebElement input = driver.findElement(By.cssSelector("#exampleInputName2"));input.sendKeys("李宇春 - 咏春");WebElement select = driver.findElement(By.cssSelector("#submit1"));select.click();List<WebElement> result = driver.findElements(By.cssSelector("#info > tr"));assert result.size() == 1;input.clear();input.sendKeys("南征北战");select.click();result = driver.findElements(By.cssSelector("#info > tr"));assert result.size() >= 1;input.clear();select.click();result = driver.findElements(By.cssSelector("#info > tr"));assert result.size() >= 1;input.clear();input.sendKeys("没有这个音乐");select.click();result = driver.findElements(By.cssSelector("#info > tr"));assert result.size() == 0;input.clear();}// 检查删除选中音乐的功能public void deleteSelMusic() {driver.findElement(By.cssSelector("#exampleInputName2")).sendKeys("");driver.findElement(By.cssSelector("#submit1")).click();List<WebElement> result = driver.findElements(By.cssSelector("#info > tr"));int i = result.size();if (i > 10) {driver.findElement(By.cssSelector("#\\31 " + (i % 10 - 1))).click();}else {driver.findElement(By.cssSelector("#\\3" + (i - 1))).click();}driver.findElement(By.cssSelector("#delete")).click();wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert();assert alert.getText().equals("音乐全部删除成功! ");alert.accept();i--;driver.navigate().refresh();int count = 3;assert count <= i;while (count > 0 && i > 10) {driver.findElement(By.cssSelector("#\\31 " + (i % 10 - 1))).click();i--;count--;}while (count > 0) {driver.findElement(By.cssSelector("#\\3" + (i - 1))).click();i--;count--;}driver.findElement(By.cssSelector("#delete")).click();wait.until(ExpectedConditions.alertIsPresent());assert alert.getText().equals("音乐全部删除成功! ");alert.accept();driver.findElement(By.cssSelector("#delete")).click();wait.until(ExpectedConditions.alertIsPresent());assert alert.getText().equals("批量删除音乐失败!! ");alert.accept();}// 检查删除音乐的功能public void deleteMusic() {driver.findElement(By.cssSelector("#exampleInputName2")).sendKeys("");driver.findElement(By.cssSelector("#submit1")).click();int index = driver.findElements(By.cssSelector("#info > tr")).size();driver.findElement(By.cssSelector("#del" + (index - 1))).click();wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert();assert alert.getText().equals("删除音乐成功! ");alert.accept();}// 检查喜欢音乐的功能public void loveMusic() {driver.findElement(By.cssSelector("#exampleInputName2")).sendKeys("");driver.findElement(By.cssSelector("#submit1")).click();int index = driver.findElements(By.cssSelector("#info > tr")).size();driver.findElement(By.cssSelector("#love" + (index - 1))).click();wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert();assert alert.getText().equals("喜欢成功! ");alert.accept();}
}
(5)创建喜欢列表测试用例类
创建 LovePage 类,在这里编写喜欢列表页面的所有测试用例,在这里我们要完成的事情如下:
- 检查喜欢列表页面是否能正确加载;
- 检查喜欢音乐的查询功能是否正常;
- 检查取消喜欢音乐的功能是否正常;
- 检查回到大厅的按钮功能是否正常。
有关 LovePage 类的具体代码及详细介绍如下所示:
public class LovePage extends Utils {// 指定页面的 URLprivate static String url = "http://127.0.0.1:8080/loveMusic.html";// 设置显式等待private WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(2));public LovePage() {super(url);}// 检查页面是否正确加载public void lovePageRight() {driver.findElement(By.cssSelector("body > div.container > div:nth-child(3) > a"));String title = driver.getTitle();assert title.equals("喜欢音乐列表");}// 检查喜欢音乐查询功能public void selLoveMusic() {WebElement input = driver.findElement(By.cssSelector("#exampleInputName2"));input.sendKeys("李宇春 - 咏春");WebElement select = driver.findElement(By.cssSelector("#submit1"));select.click();List<WebElement> result = driver.findElements(By.cssSelector("#info > tr"));assert result.size() == 1;input.clear();input.sendKeys("无涯");select.click();result = driver.findElements(By.cssSelector("#info > tr"));assert result.size() >= 1;input.clear();select.click();result = driver.findElements(By.cssSelector("#info > tr"));assert result.size() >= 1;input.clear();input.sendKeys("没有这个音乐");select.click();result = driver.findElements(By.cssSelector("#info > tr"));assert result.size() == 0;input.clear();}// 检查取消喜欢音乐功能public void delLoveMusic() throws InterruptedException {driver.findElement(By.cssSelector("#exampleInputName2")).sendKeys("");driver.findElement(By.cssSelector("#submit1")).click();int index = driver.findElements(By.cssSelector("#info > tr")).size();driver.findElement(By.cssSelector("#del0")).click();wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert();assert alert.getText().equals("取消喜欢音乐成功!");alert.accept();}// 检查回到大厅的按钮功能public void loveBack() {driver.findElement(By.cssSelector("body > div.container > div:nth-child(3) > a")).click();String title = driver.getTitle();assert title.equals("在线音乐列表");}
}
(6)创建上传音乐测试用例类
创建 UploadPage 类,在这里编写上传音乐页面的所有测试用例,在这里我们要完成的事情如下:
- 检查上传音乐页面是否能正确加载;
- 检查上传音乐的功能是否正常;
- 检查回到首页的连接跳转功能是否正常。
有关 UploadPage 类的具体代码及详细介绍如下所示:
public class UploadPage extends Utils {// 指定页面的 URLprivate static String url = "http://127.0.0.1:8080/upload.html";// 设置显式等待private WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(2));public UploadPage() {super(url);}// 检查页面正确加载public void uploadPageRight() {// 查找是否有歌手输入框driver.findElement(By.cssSelector("#singerInput"));driver.findElement(By.cssSelector("#fileInput"));String title = driver.getTitle();assert title.equals("上传音乐");}// 检查上传音乐功能public void uploadMusic() throws InterruptedException {driver.findElement(By.cssSelector("#fileInput")).sendKeys("D:\\音乐下载\\李宇春 - 咏春.mp3");driver.findElement(By.cssSelector("#singerInput")).sendKeys("李宇春");driver.findElement(By.cssSelector("#uploadFrom > input[type=submit]:nth-child(3)")).click();wait.until(ExpectedConditions.alertIsPresent());Alert alert = driver.switchTo().alert();assert alert.getText().equals("已经拥有当前歌曲! ");alert.accept();driver.navigate().refresh();driver.findElement(By.cssSelector("#fileInput")).sendKeys("D:\\音乐下载\\庞龙 - 兄弟抱一下 [mqms2].mp3");driver.findElement(By.cssSelector("#singerInput")).sendKeys("庞龙");driver.findElement(By.cssSelector("#uploadFrom > input[type=submit]:nth-child(3)")).click();wait.until(ExpectedConditions.alertIsPresent());assert alert.getText().equals("音乐上传成功! ");alert.accept();String title = driver.getTitle();assert title.equals("在线音乐列表");}// 检查返回首页的功能public void uploadBack() {driver.get(url);driver.findElement(By.cssSelector("#uploadFrom > a")).click();String title = driver.getTitle();assert title.equals("在线音乐列表");}}
(7)创建运行测试用例类
创建 RunTest 类, 在这里进行所有测试代码的运行,我们要以合理的方式调用每一个页面的所有测试方法,来进行在线音乐播放器的 UI 自动化测试,关于 RunTest 的具体代码及详细介绍如下所示:
public class RunTest {public static void main(String[] args) throws InterruptedException {// 1. 运行登录页面的测试用例自动化测试方法LoginPage loginPage = new LoginPage();loginPage.loginPageRight();loginPage.loginFail();loginPage.loginSuc();// 2. 运行上传音乐页面的测试用例自动化测试方法UploadPage uploadPage = new UploadPage();uploadPage.uploadPageRight();uploadPage.uploadMusic();uploadPage.uploadBack();// 3. 运行喜欢列表页面的测试用例自动化测试方法LovePage lovePage = new LovePage();lovePage.lovePageRight();lovePage.selLoveMusic();lovePage.delLoveMusic();lovePage.loveBack();// 4. 运行列表页面的测试用例自动化测试方法ListPage listPage = new ListPage();listPage.listPageRight();listPage.selectMusic();listPage.loveMusic();listPage.deleteMusic();listPage.deleteSelMusic();// 5. 释放 driver 对象Utils.driver.quit();}
}
3.自动化测试执行结果
我们在 RunTest 类中进行运行,运行的过程及结果如下图所示:
如上图运行过程所示,我们的自动化测试用例全部通过,在执行自动化测试的时候,我们要注意多次执行的时候,在上传音乐的方法中要更改新的上传音乐,否则就会上传音乐失败,在执行失败的时候要多用屏幕截图来抓取当时出错的场景。
五、性能测试
下面我来使用 JMeter 对在线音乐播放器项目的登录接口和获取音乐列表接口及获取喜欢音乐列表接口进行简单的性能测试,下面就来介绍在线音乐播放器项目性能测试的一个测试流程。
1.创建梯度压测线程组
这里我们创建一个梯度压测线程组(Stepping Thread Group),来慢慢增大我们对这两个接口的并发请求的数量,创建的梯度压测线程组的具体配置如下图所示:
2.创建 HTTP 请求默认值
在在线音乐播放器项目中涉及到的接口协议、IP、端口号及内容编码都完全一样,所以我们就可以把这些单独抽取出来,存放在默认值中,这样其他接口就可以省略不写协议、IP、端口号及内容编码了,这里我们具体设置的默认值如下图所示:
3.创建 HTTP Cookie 管理器
如果我们在未登录状态进行获取音乐列表的操作,将会获取到一个空的音乐列表,这显然是不科学的,所以为了我们可以获取到登录请求中用户的用户信息就需要添加一个 HTTP Cookie 管理器,它会像浏览器一样存储和发送 Cookie ,如果我们 HTTP 请求返回的响应中包含 Cookie 那么 Cookie 管理器就会自动存储该 Cookie,并把这个 Cookie 用于后面特定的请求中,所以添加了 HTTP Cookie 管理器后,就会自动存储并发送 Cookie,添加的管理器如下图所示:
4.创建音乐播放器登录请求
根据在线音乐播放器项目中用户登录的接口来编写用户登录请求的内容,具体内容如下图所示:
5.创建获取音乐列表页请求
根据在线音乐播放器项目中获取音乐列表请求接口来编写获取音乐列表的内容,具体内容如下图所示:
6.创建获取喜欢音乐列表页请求
根据在线音乐播放器项目中获取喜欢音乐列表请求接口来编写获取喜欢音乐列表的内容,具体内容如下图所示:
7.性能测试执行结果
执行性能测试之前,我们添加以下四个监听器,它们的用途如下所示:
- Active Thread Over Time:这是用来记录每一时刻存活线程的数目,最后形成一个图表;
- Transactions per Second(TPS):这个监听器是用来分析系统吞吐量的重要工具。TPS 即每秒事务数,表示一个客户机向服务器发送请求后服务器做出反应的过程,这个指标反映了系统在同一时间内处理业务的最大能力,TPS 越高,说明系统的处理能力越强。
- Response Times Over Time:这个监听器是用来监听整个事务运行期间的响应时间,在测试过程中,它可以帮我们观察并分析响应时间的实时平均值以及整体响应时间的走向,通过这个监听器,我们可以更直观的了解系统中不同时间点的响应性能,从而发现可能存在的性能问题;
- 聚合报告:通过这个报告,可以看到性能测试过程中整体的数据变化。
下面我们开始执行性能测试,关于各监听器执行后的结果,如下图所示:
8.生成性能测试报告
执行完成性能测试之后,我们需要出具一份性能测试报告,这个报告不用我们手动进行编写,而是通过命令的方式使用 JMeter 来自动帮我们生成,具体操作如下图所示:
关于上图中命令所涉及参数的含义,具体介绍如下所示:
- -n:以无图形化运行;
- -t:被运行的脚本;
- -l:将运行信息写入日志文件,后缀为 jtl 的日志文件;
- -e:生成测试报告;
- -o:指定报告输出目录。
注意:日志文件和目录可以不存在,若已经存在,要保证内容为空,否则会出现错误。
那么测试报告生成之后,在 网页版五子棋性能测试报告 文件夹下将出现如下图所示的内容:
双击 index.html 文件,界面展示如下:
关于性能测试报告的具体内容我在这里就不进行过多展示了,感兴趣的小伙伴我会把这个报告附在本篇文章中,可以自行观察。
·总结
文章到此就要结束了,在这里我再对本篇测试报告做一个总结,我们一共进行了功能测试、自动化测试以及性能测试这三种测试方式,在功能测试阶段,我们着重点是对项目整体进行了一个简易的测试;在自动化测试阶段,我们主要测试各个页面的相关信息,着重测试了登录及音乐列表页面的相关功能;在性能测试阶段,我们着重测试了用户登录、获取用音乐列表、获取喜欢音乐列表的接口性能,并生成了性能测试报告,在以上过程中,遇到的问题就是执行自动化测试时会出现上传音乐失败的情况,这是因为我们每次运行自动化测试脚本时,都需要更改上传音乐的信息,否则就会出现音乐已经存在的情况,还有就是性能测试中,获取音乐列表及获取喜欢音乐列表为空,解决方式就是添加 HTTP Cookie 管理器,如果对文章内容有所疑惑,欢迎在评论区进行留言,如果感觉本篇文章还不错希望能收到你的三连支持,那么我们下一篇文章再见吧~~~
相关文章:

在线音乐播放器 —— 测试报告
自动化脚本源代码:Java: 利用Java解题与实现部分功能及小项目的代码集合 - Gitee.com 目录 前言 一、项目简介 1.项目背景 2.应用技术 (1)后端开发 (2)前端开发 (3)数据库 二、项目功能…...

等保测评讲解:安全管理中心
在数字化转型的背景下,网络安全的重要性愈发凸显,而作为中国边疆大省的黑龙江,其网络安全建设更是不可忽视。等保测评,即信息安全等级保护测评,是确保信息系统安全的关键环节。本文将详细讲解黑龙江等保测评中的安全管…...

vue3表单输入相关修饰符使用
在 Vue 3 中,.lazy、.number 和 .trim 是用于 v-model 指令的修饰符,它们可以帮助你在双向绑定时进行特定的处理。 1. .lazy 修饰符 .lazy 修饰符表示只在 input 事件之后触发更新,即输入框的内容发生变化后,只有在用户**失去焦…...

CSS笔记(二)类名复用
这里我通过两张不同位置的卡片来实现效果 代码 <!DOCTYPE html> <html><head><style>/*设置画布*/body{/* 方便排列与对齐*/display: flex; /*画布布满整个窗口*/height: 100vh;/*水平居中*/justify-content: center;/*垂直居中*/align-items: cente…...

TCP三次握手与四次挥手(TCP重传机制,2MSL)超详细!!!计算机网络
本篇是关于3次握手和四次挥手的详细解释~ 如果对你有帮助,请点个免费的赞吧,谢谢汪。(点个关注也可以!) 如果以下内容需要补充和修改,请大家在评论区多多交流~。 目录 1. TCP头部: 2. 三次握手…...

LCR 006. 两数之和 II - 输入有序数组
一.题目: LCR 006. 两数之和 II - 输入有序数组 - 力扣(LeetCode) 二.我的原始解法-暴力解法超时: class Solution: def twoSum(self, numbers: List[int], target: int) -> List[int]: # 暴力解法 result [] for i in rang…...

网络安全在现代企业中的重要作用
网络安全是这个数字时代最令人担忧的事情之一。对技术的依赖性越来越强,使其同时面临多种网络威胁。其声誉和法律后果的大幅下降可能归因于一次妥协。 这使得良好的网络安全成为所有企业的选择和必需品。本文介绍了网络安全的重要性、企业中常见的网络威胁以及公司…...

关于 EKS Bottlerocket AMI 版本与 Karpenter 配置的说明
问题1: Bottlerocket AMI 版本问题 之前,后端团队发现在使用 Bottlerocket v1.26.2 AMI 版本时,存在某些问题。经过 Bottlerocket 团队调查,此行为是罕见的 race condition 导致的结果。 我们在环境中重现了此状况,并且关注到由于 kubelet device manager 的启动时间晚于 NVI…...

Python实现人生重开模拟器
目录 人生重开模拟器介绍 代码实现 打印初始界面 设置初始属性 设置角色性别 设置角色出生点 针对每一岁,生成人生经历 完整代码 人生重开模拟器介绍 人生重开模拟器 是之前比较火的一个小游戏,我们这里使用 Python 实现一个简化版的 人生重开模…...

java——Spring Boot的配置加载顺序和优先级
Spring Boot的配置加载顺序和优先级是确定应用程序如何读取和应用配置的关键。以下是对Spring Boot配置加载顺序和优先级的详细解释: 一、配置加载顺序 命令行参数: Spring Boot会首先加载命令行中指定的参数。这些参数可以通过在命令行中使用--keyval…...

【21-30期】Java技术深度剖析:从分库分表到微服务的核心问题解析
🚀 作者 :“码上有前” 🚀 文章简介 :Java 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 文章题目:Java技术深度剖析:从分库分表到微服务的核心问题解析 摘要: 本…...

CSS:怎么把网站都变成灰色
当大家看到全站的内容都变成了灰色,包括按钮、图片等等。这时候我们可能会好奇这是怎么做到的呢? 有人会以为所有的内容都统一换了一个 CSS 样式,图片也全换成灰色的了,按钮等样式也统一换成了灰色样式。但你想想这个成本也太高了…...

开发一个基于MACOS M1/2芯片的Android 12的模拟器
产品需求:MuMu模拟器Pro_率先适配Apple M系列芯片的安卓模拟器 苹果M芯片专属:产品专为苹果M系列芯片设计,意味着它需要能够充分利用M系列芯片的性能优势。 安卓模拟器:产品是一个安卓模拟器,允许用户在Mac设备上运行…...

Flink 中 JDBC Connector 使用详解
1. 背景 在实时计算或离线任务中,往往需要与关系型数据库交互,例如 MySQL、PostgreSQL 等。Apache Flink 提供了 JDBC Connector,可以方便地将流式数据写入或读取数据库。 本文将介绍 Flink JDBC Connector 的基础用法、配置方法以及注意事…...

【Linux打怪升级记 | 报错02】-bash: 警告:setlocale: LC_TIME: 无法改变区域选项 (zh_CN.UTF-8)
🗺️博客地图 📍1、报错发现 📍2、原因分析 📍3、解决办法 📍4、测试结果 1、报错发现 装好了CentOS操作系统,使用ssh远程登陆CentOS,出现如下告警信息: bash: 警告:setlocale…...

未来已来?AI技术革新改变我们的生活
在21世纪的今天,人工智能(AI)不再是一个遥远的概念,而是逐渐渗透到我们生活的方方面面。从智能家居到自动驾驶汽车,从个性化推荐系统到医疗诊断辅助,AI技术正在以惊人的速度发展,并深刻地影响着…...

【Linux】进程的生命之旅——诞生、消逝与守候(fork/exit/wait)
🎬 个人主页:谁在夜里看海. 📖 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 一念既出,万山无阻 目录 📖一、进程创建 1.fork函数 📚高层封装特性 📚fork返回值 2.写时拷…...

使用vcpkg自动链接tinyxml2时莫名链接其他库(例如boost)
使用vcpkg自动链接tinyxml2时莫名链接其他库(例如boost) vcpkg的自动链接功能非常方便,但在某些情况下会出现过度链接的问题。 链接错误症状 以tinyxml2为例,程序中调用tinyxml2的函数后,若vcpkg中同时存在opencv和…...

【去毛刺】OpenCV图像处理基础:腐蚀与膨胀操作入门
在数字图像处理中,形态学操作是一种常用的技术,用于提取图像中的特定形状或特征。其中,腐蚀(Erosion)和膨胀(Dilation)是两种基本的形态学运算。本文将通过一个简单的例子来演示如何使用Python中…...

道可云人工智能元宇宙每日资讯|第三届京西地区发展论坛成功召开
道可云元宇宙每日简报(2024年11月27日)讯,今日元宇宙新鲜事有: 工信部等十二部门印发《5G规模化应用“扬帆”行动升级方案》 11月25日,工业和信息化部等十二部门印发《5G规模化应用“扬帆”行动升级方案》。《方案》…...

若依框架部署在网站一个子目录下(/admin)问题(
部署在子目录下首先修改vue.config.js文件: 问题一:登陆之后跳转到了404页面问题,解决办法如下: src/router/index.js 把404页面直接变成了首页(大佬有啥优雅的解决办法求告知) 问题二:退出登录…...

【ue5】UE5运行时下载视频/UE5 runtime download video(MP4)
插件还是老朋友。 节点的content type要打对。 (参照表:MIME 类型(MIME Type)完整对照表 - 免费在线工具) 结果展示:...

对比C++,Rust在内存安全上做的努力
简介 近年来,越来越多的组织表示,如果新项目在技术选型时需要使用系统级开发语言,那么不要选择使用C/C这种内存不安全的系统语言,推荐使用内存安全的Rust作为替代。 谷歌也声称,Android 的安全漏洞,从 20…...

如何利用 Qt 的模块化架构组织大型项目
目录 1. 大型项目的架构设计 1.1 分层架构 1.2 事件驱动与异步架构 2. 模块划分与职责分离 2.1 功能模块划分 2.2 模块之间的依赖管理 3. 跨平台开发与模块复用 在大型软件项目中,随着代码量的增加和功能的扩展,项目的复杂度会显著提升。没有良好…...

探索Python词云库WordCloud的奥秘
文章目录 探索Python词云库WordCloud的奥秘1. 背景介绍:为何选择WordCloud?2. WordCloud库简介3. 安装WordCloud库4. 简单函数使用方法5. 应用场景示例6. 常见Bug及解决方案7. 总结 探索Python词云库WordCloud的奥秘 1. 背景介绍:为何选择Wo…...

MySQL根据idb文件恢复数据
首先得有对应表的idb文件以及建表语句 1.首先在新数据库建表 CREATE TABLE sys_menu (id bigint(20) NOT NULL,parent_id bigint(20) NULL DEFAULT NULL,name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,type int(11) NULL DEFAULT …...

hadoop-mapreduce词频统计
一、Map Reduce主要阶段 二、词频统计示例 0.MapReduce 词频统计(Word Count)示例图 1. Input 阶段(输入阶段) 输入数据是一段文本,如下: Hadoop is a big data framework. Hadoop can store vast data. Hadoop processes big …...

精心修炼Java并发编程(JUC)-volatile与synchronized关键字
volatile volatile 是 JVM 提供的 最轻量级的同步机制,中文意思是不稳定的,易变的,用 volatile 修饰变量是为了保证变量在多线程中的可见性,它表达的含义是:告诉编译器,对这个变量的读写,需要基…...

【ROS2】ROS2 与 ROS1 编码方式对比(Python实现)
目录 一、初始化和关闭节点二、发布者三、订阅者四、服务端五、客户端六、参数管理七、日志记录八、生命周期管理 ROS2 在 Python 编程中引入了一些新的概念和 API,这些变化使得代码更加模块化和易于维护。特别是 rclpy 库提供了更丰富的功能和更好的错误处理机制&a…...

ElasticSearch的下载和基本使用(通过apifox)
1.概述 一个开源的高扩展的分布式全文检索引擎,近乎实时的存储,检索数据 2.安装路径 Elasticsearch 7.8.0 | Elastic 安装后启动elasticsearch-7.8.0\bin里的elasticsearch.bat文件, 启动后就可以访问本地的es库http://localhost:9200/ …...