在线音乐服务器测试报告

一、项目背景

       在线音乐服务器采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。前端主要有个页面构成:登录页、音乐列表页、收藏音乐页等,以上模拟实现了最简单的在线音乐服务器。其结合后端实现了以下的主要功能:登录、上传音乐、播放音乐、查询音乐、删除音乐、收藏音乐、取消收藏音乐等功能。该音乐服务器可以实现用户简单的听音乐,收藏音乐等需求。

二、项目功能

       在线音乐服务器主要实现了以下几个功能:登录、上传音乐、播放音乐、查询音乐、删除音乐、收藏音乐、取消收藏音乐等功能。

  1. 登录功能:用户输入用户名和密码,如果输入正确的用户名和密码则登录成功并跳转到个人博客列表页面;如果输入错误的用户名和密码则提示用户输入的信息有误,登录失败。

  2. 上传音乐功能:用户上传格式正确的音乐文件,以及填写音乐所属的歌手名,最终能成功上传到服务器保存。

  3. 播放音乐功能:用户点击播放音乐,音乐能够正常播放。

  4. 查询音乐功能:用户可以通过模糊查询和精确查询所要想搜索的音乐。

  5. 删除音乐功能:用户可以单个删除音乐,也可以通过勾选批量删除多个音乐。

  6. 收藏音乐功能:用户选择喜欢的音乐可进行收藏,成功收藏后可保存在个人收藏列表页。

  7. 展示收藏音乐功能:展示用户收藏的喜欢的音乐,并且能够进行正常的播放等操作。

  8. 取消收藏音乐功能:用户在收藏音乐的列表中可以选择删除取消收藏的音乐。

三、Web自动化测试

一)测试用例设计
在这里插入图片描述

二)代码编写

  1. 登录功能测试
    ① 创建驱动,并打开页面;
    ② 测试页面是否正常打开;
    ③ 测试正常登录:使用正确的用户名和密码进行等;
    ④ 测试异常登录:用户名/密码不正确,登录失败,多参数测试;
    ⑤ 注意测试的顺序,使用Order注解指定,否则可能会因为执行顺序不对导致测试失败;
    ⑥ 注意清空内容后才能再次输入用户名、密码。
package com.musicAutoTest.Tests;import com.musicAutoTest.common.AutotestUtils;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;import java.time.Duration;@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class LoginTest extends AutotestUtils {private static ChromeDriver driver = createDriver();@BeforeAllstatic void baseControl() {driver.get("http://localhost:8888/login.html");}/*** 页面可以正常显示*/@Test@Order(1)void LoginLoadRight() {driver.findElement(By.cssSelector("#body > div > div:nth-child(3) > label"));driver.findElement(By.cssSelector("#body > div > div.alert.alert-warning.alert-dismissible"));}/*** 正常登录*/@Test@Order(3)void LoginSuc() throws InterruptedException {driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));driver.findElement(By.cssSelector("#user")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#user")).sendKeys("shuai");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(5);Alert alert = driver.switchTo().alert();alert.accept();//检查是否登录成功driver.findElement(By.cssSelector("#body > div.container > h3"));driver.findElement(By.cssSelector("#body > div.container > div:nth-child(3) > a:nth-child(1)"));driver.navigate().back();}/*** 异常登录*/@ParameterizedTest@Order(2)@CsvSource({"'',''","'',123","'',123","123,123"})void LoginFail(String name, String password) throws InterruptedException {driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));driver.findElement(By.cssSelector("#user")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#user")).sendKeys(name);driver.findElement(By.cssSelector("#password")).sendKeys(password);driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(5);Alert alert = driver.switchTo().alert();alert.accept();//检查是否登录没成功driver.findElement(By.cssSelector("#body > div > div:nth-child(3) > label"));driver.findElement(By.cssSelector("#body > div > div.alert.alert-warning.alert-dismissible"));}
}
  1. 上传音乐功能测试
    ① 如若驱动已经创建好则不需再次创建驱动,打开页面;
    ② 测试页面是否正常打开;
    ③ 正常的上传,上传正确格式的音乐文件;
    ④ 测试异常上传:上传非音乐格式的文件。
package com.musicAutoTest.Tests;import com.musicAutoTest.common.AutotestUtils;
import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;import java.time.Duration;
import java.util.List;@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class UploadMusicTest extends AutotestUtils {private static ChromeDriver driver = createDriver();@BeforeAllstatic void baseControl() {driver.get("http://localhost:8888/list.html");}/*** 检查页面能否正常打开*/@Test@Order(1)void pageLoadRight() {driver.findElement(By.cssSelector("#body > div.container > h3"));driver.findElement(By.cssSelector("#body > div.container > div:nth-child(3)"));}/*** 上传音乐*/@Test@Order(2)void uploadSuc() {driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));List<WebElement> list1 = driver.findElements(By.name("tr"));int count1 = list1.size();driver.findElement(By.cssSelector("#body > div.container > div:nth-child(3) > a:nth-child(2)")).click();driver.findElement(By.cssSelector("body > form > input[type=file]:nth-child(1)")).sendKeys("C:/music.mp3");driver.findElement(By.cssSelector("body > form > label > input[type=text]")).sendKeys("user");driver.findElement(By.cssSelector("body > form > input[type=submit]:nth-child(3)")).click();List<WebElement> list2 = driver.findElements(By.name("tr"));int count2 = list2.size();int suc = count2 - count1;Assertions.assertEquals("1",suc+"");}}
  1. 播放音乐功能测试
    ① 如若驱动已经创建好则不需再次创建驱动,打开页面;
    ② 测试页面是否正常打开;
    ③ 点击播放音乐按钮;
    ④ 测试音乐是否播放,检查点为属性值。
package com.musicAutoTest.Tests;import com.musicAutoTest.common.AutotestUtils;
import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class RunMusicTest extends AutotestUtils {private static ChromeDriver driver = createDriver();//打开页面@BeforeAllstatic void baseControl() {driver.get("http://localhost:8888/list.html");}//页面能否正常显示@Test@Order(1)void pageLoadRight() {driver.findElement(By.cssSelector("#body > div.container > h3"));driver.findElement(By.cssSelector("#body > div.container > div:nth-child(3)"));}//能否正常播放音乐@Test@Order(2)void runMusicSuc() {driver.findElement(By.cssSelector("#info > tr:nth-child(1) > td:nth-child(4) > button")).click();//检查点,属性值String text = driver.findElement(By.cssSelector("#body > div:nth-child(2) > div > div > div.controlbar > ul > li:nth-child(1) > a")).getAttribute("style");System.out.println(text);Assertions.assertEquals("display: none;",text);}}
  1. 查询音乐功能
    ① 如若驱动已经创建好则不需再次创建驱动,打开页面;
    ② 测试页面是否正常打开;
    ③ 输入空字符进行查询;
    ④ 分别进行模糊查询和精确查询测试是否能查询到。
package com.musicAutoTest.Tests;import com.musicAutoTest.common.AutotestUtils;
import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;import java.time.Duration;@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class SelectMusicTest extends AutotestUtils {private static ChromeDriver driver = createDriver();//打开页面@BeforeAllstatic void baseControl() {driver.get("http://localhost:8888/list.html");}//页面能否正常显示@Test@Order(1)void pageLoadRight() {driver.findElement(By.cssSelector("#body > div.container > h3"));driver.findElement(By.cssSelector("#body > div.container > div:nth-child(3)"));}//精确查询@Test@Order(2)void searchOne() {driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));driver.findElement(By.cssSelector("#exampleInputName2")).clear();driver.findElement(By.cssSelector("#exampleInputName2")).sendKeys("music");driver.findElement(By.cssSelector("#submit1")).click();String text = driver.findElement(By.cssSelector("#info > tr > td:nth-child(2)")).getText();Assertions.assertEquals("music",text);}//模糊查询@Test@Order(3)void searchMore() {driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));driver.findElement(By.cssSelector("#exampleInputName2")).clear();driver.findElement(By.cssSelector("#exampleInputName2")).sendKeys("mu");driver.findElement(By.cssSelector("#submit1")).click();String text = driver.findElement(By.cssSelector("#info > tr > td:nth-child(2)")).getText();Assertions.assertEquals("music",text);}
}
  1. 收藏音乐功能
    ① 如若驱动已经创建好则不需再次创建驱动,打开页面;
    ② 测试页面是否正常打开;
    ③ 点击收藏音乐,测试是否被收藏。
package com.musicAutoTest.Tests;import com.musicAutoTest.common.AutotestUtils;
import org.junit.jupiter.api.*;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class LoveMusicTest extends AutotestUtils {private static ChromeDriver driver = createDriver();//打开页面@BeforeAllstatic void baseControl() {driver.get("http://localhost:8888/list.html");}//页面能否正常显示@Test@Order(1)void pageLoadRight() {driver.findElement(By.cssSelector("#body > div.container > h3"));driver.findElement(By.cssSelector("#body > div.container > div:nth-child(3)"));}//点击喜欢@Test@Order(2)void loveMusicSuc() throws InterruptedException {driver.findElement(By.cssSelector("#info > tr:nth-child(1) > td:nth-child(5) > button:nth-child(2)")).click();Thread.sleep(5);Alert alert = driver.switchTo().alert();String text = alert.getText();alert.accept();Assertions.assertEquals("加入喜欢的列表成功",text);}//重复点击@Test@Order(3)void loveMusicFail() throws InterruptedException {driver.findElement(By.cssSelector("#info > tr:nth-child(1) > td:nth-child(5) > button:nth-child(2)")).click();Thread.sleep(8);Alert alert = driver.switchTo().alert();String text = alert.getText();alert.accept();Assertions.assertNotEquals("加入喜欢的列表成功",text);}}
  1. 展示收藏音乐列表功能
    ① 如若驱动已经创建好则不需再次创建驱动,打开页面;
    ② 测试页面是否正常打开;
    ③ 测试刚收藏的音乐是否再列表中展示。
package com.musicAutoTest.Tests;import com.musicAutoTest.common.AutotestUtils;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;public class ShowLoveMusicTest extends AutotestUtils {private static ChromeDriver driver = createDriver();@BeforeAllstatic void baseControl() {driver.get("http://localhost:8888/loveMusic.html");}/*** 展示收藏的音乐列表*/@Testvoid showSuc() {String text = driver.findElement(By.cssSelector("#info > tr > td:nth-child(2)")).getText();Assertions.assertEquals("music",text);}}
  1. 取消收藏音乐功能
    ① 如若驱动已经创建好则不需再次创建驱动,打开页面;
    ② 测试页面是否正常打开;
    ③ 点击取消收藏音乐,检查音乐是否已经被移除收藏列表。
package com.musicAutoTest.Tests;import com.musicAutoTest.common.AutotestUtils;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;import java.util.List;public class DeleteLoveMusicTest extends AutotestUtils {private static ChromeDriver driver = createDriver();@BeforeAllstatic void baseControl() {driver.get("http://localhost:8888/loveMusic.html");}/*** 取消收藏的音乐*/@Testvoid deleteLoveMusic() {List<WebElement> list = driver.findElements(By.name("#tr"));int count1 = list.size();driver.findElement(By.cssSelector("#info > tr > td:nth-child(5) > button")).click();//统计数量List<WebElement> list2 = driver.findElements(By.name("tr"));int count2 = list2.size();//再统计数量int suc = count1 - count2;Assertions.assertEquals("1",suc+"");}}
  1. 删除音乐功能
    ① 如若驱动已经创建好则不需再次创建驱动,打开页面;
    ② 测试页面是否正常打开;
    ③ 点击删除音乐,检查音乐是否被删除。
package com.musicAutoTest.Tests;import com.musicAutoTest.common.AutotestUtils;
import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;import java.util.List;@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class DeleteMusicTest extends AutotestUtils {private static ChromeDriver driver = createDriver();@BeforeAllstatic void baseControl() {driver.get("http://localhost:8888/loveMusic.html");}/*** 删除音乐*/@Testvoid deleteMusic() {List<WebElement> list = driver.findElements(By.name("#tr"));int count1 = list.size();driver.findElement(By.cssSelector("#info > tr:nth-child(1) > td:nth-child(5) > button:nth-child(1)")).click();//统计数量List<WebElement> list2 = driver.findElements(By.name("tr"));int count2 = list2.size();//再统计数量int suc = count1 - count2;Assertions.assertEquals("1",suc+"");}
}
  1. 屏幕截图
    /*** 动态生成时间*/public List<String> getTime() {//文件夹按照天的维度进行保存//文件格式 20240109-123030SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyyMMdd-HHmmssSS");SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyyMMdd");String filename = simpleDateFormat1.format(System.currentTimeMillis());String dirname = simpleDateFormat2.format(System.currentTimeMillis());List<String> list = new ArrayList<>();list.add(dirname);list.add(filename);return list;}/*** 获取屏幕截图,把所有的测试用例执行的结果保存下来*/public void getScreenShor(String str) throws IOException {List<String> list = getTime();//dir+filename// ./src/test/java/com/blogWebAutoTest/dirname/filenameString fileName = "./src/test/java/com/blogWebAutoTest/"+list.get(0) + "/" + str + "-" + list.get(1) + ".png";File srcfile = driver.getScreenshotAs(OutputType.FILE);//把屏幕截图生成的文件放到指定的路径FileUtils.copyFile(srcfile,new File(fileName));String filename = "my";}

三)代码测试
在这里插入图片描述

四、总结

  1. 使用了Junit5中提供的注解:避免生成过多的对象,造成资源和时间的浪费,提高了自动化的执行效率。
  2. 只创建一次驱动对象,避免每个用例重复创建驱动对象造成时间和资源的浪费。
  3. 使用参数化:保持用例的简洁,提高代码的可读性。
  4. 使用测试套件:降低了测试人员的工作量,通过套件一次执行所有要运行的测试用例。
  5. 使用了等待:提高了自动化的运行效率,提高了自动化的稳定性,减小误报的可能性。
  6. 使用了屏幕截图:方便问题的追溯以及问题的解决。
  7. 使用了无头模式:只注重结果,可以留出屏幕。

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

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

相关文章

基于蒙特卡洛的电力系统可靠性分析matlab仿真,对比EDNS和LOLP

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 1.课题概述 电力系统可靠性是指电力系统按可接受的质量标准和所需数量不间断地向电力用户供应电力和电能量的能力的量度&#xff0c;包括充裕度和安全性两个方面。发电系统可靠性是指统一并网的全部发电机…

实现RBAC

一、菜单权限的控制 左边侧边栏的菜单显示是来自于userlnfoStore.menuRoutes&#xff0c;当前进行打印&#xff0c;得到的内容其实就是staticRoutes静态路由表定义的路由数组对象;最终staticRoutes(静态路由)、allAsyncRoutes(动态路由)、anyRoute(任意路由)需要进行一次整合、…

【芯片设计- RTL 数字逻辑设计入门 11 -- 移位运算与乘法】

请阅读【嵌入式开发学习必备专栏 】 文章目录 移位运算与乘法Verilog Codeverilog 拼接运算符&#xff08;{}&#xff09;Testbench CodeVCS 波形仿真 问题小结 移位运算与乘法 已知d为一个8位数&#xff0c;请在每个时钟周期分别输出该数乘1/3/7/8,并输出一个信号通知此时刻输…

【51单片机】实现一个动静态数码管显示项目(前置知识铺垫,代码&图演示)(5)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY…

【python量化交易】qteasy使用教程01 - 安装方法及初始化配置

qteasy教程1 - 安装方法及初始化配置 qteasy教程1 - 安装方法及初始配置qteasy安装前的准备工作1&#xff0c; 创建安装环境2&#xff0c;安装MySQL数据库 (可选)安装pymysql 3&#xff0c;创建tushare账号并获取API token (可选)4&#xff0c;安装TA-lib (可选)WindowsMac OSL…

阿里云游戏服务器收费价格表,一年和1个月报价

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

idea设置terminal为git

要在IntelliJ IDEA中设置终端为Git Bash&#xff0c;请按照以下步骤操作&#xff1a; 打开 Settings&#xff08;设置&#xff09;。点击 Tools&#xff08;工具&#xff09;选项卡。进入 Terminal&#xff08;终端&#xff09;界面。在 Shell Path 下选择 Browse&#xff08;…

C语言:操作符详解

创作不易&#xff0c;给个三连吧&#xff01;&#xff01; 一、算术操作符 C语言中为了方便计算&#xff0c;提供了算数操作符&#xff0c;分别是:,-,*,/,% 由于这些操作符都是有两个操作数&#xff08;位于操作符两边&#xff09;&#xff0c;所以这种操作符也叫做双目操作…

在没有鼠标或键盘的情况下在 Mac 上如何启用蓝牙?

通过这个技巧&#xff0c;小编将向您展示几种无需鼠标或键盘即可在 Mac 上重新启用蓝牙的方法。如果您想开始使用蓝牙配件&#xff0c;但还没有连接&#xff0c;这会很有用。 无需鼠标即可启用蓝牙 蓝牙是iPhone、iPad和 Mac 的标准配置。它确保您可以无线使用各种配件&#…

NC6X单点登录设计文档说明

前言 因为业务场景需要&#xff0c;第三方系统有些工作需要经常到NC系统里做&#xff0c;如果每次去NC系统做业务单据&#xff0c;都需要反复登录&#xff0c;导致客户使用体验不是很好&#xff0c;所以需要开发实现从第三方系统单点登录到NC系统&#xff0c;提高客户满意度。 …

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之ScrollBar组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之ScrollBar组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、ScrollBar组件 鸿蒙&#xff08;HarmonyOS&#xff09;滚动条组件ScrollBar&…

【http】2、http request header Origin 属性、跨域 CORS、同源、nginx 反向代理、预检请求

文章目录 一、Origin 含义二、跨源资源共享&#xff1a;**Cross-Origin Resource Sharing** CORS2.1 跨域的定义2.2 功能概述2.3 场景示例2.3.1 简单请求2.3.2 Preflighted requests&#xff1a;预检请求 2.4 header2.4.1 http request header2.4.1.1 Origin2.4.1.2 Access-Con…