目录
一、项目背景
1.1 测试目标及测试任务概述
本次测试主要针对在线音乐系统,目标是确保系统各个功能模块正常运行,涵盖登录、音乐操作(添加喜欢、删除喜欢、上传、查询等)功能的正确性与稳定性。测试任务包括对这些功能的手动功能测试以及部分模块的自动化测试。
1.2测试计划
二、测试分类
2.1 功能测试
测试环境:Win10系统 + Chrome
开发环境:idea
测试方式:人工测试+jmeter接口测试
2.1.1测试用例:
2.1.2登陆界面
(1)测试功能:登录功能(异常)
执行测试操作步骤:
——在登陆界面输入框的账号或者密码为空
——点击登录
预期结果:有用户名或密码不能为空的弹窗提醒
实际结果:有用户名或密码不能为空的弹窗提醒
(2)测试功能:登录功能(正常)
执行测试操作步骤:
——在登陆界面输入框填写正确的账号密码
——点击登录
预期结果:有登陆成功的弹窗提醒,跳转到音乐列表页面
实际结果:有登陆成功的弹窗提醒,跳转到音乐列表页面
2.1.3音乐列表界面
(3)测试功能:音乐搜索功能(内容为空)
执行测试操作步骤
——在音乐列表搜索页面不添加内容
——点击搜索按钮
预期结果:音乐列表页面会显示全部数据
实际结果:音乐列表页面会显示全部数据
(4)测试功能:音乐搜索功能(内容不为空)
执行测试操作步骤
——在音乐列表搜索页面添加内容
——点击搜索按钮
预期结果:音乐列表页面会显示有关内容全部数据
实际结果:音乐列表页面会显示有关内容全部数据
(5)测试功能:音乐播放
执行测试操作步骤
——在音乐列表选择歌曲
——点击播放按钮
预期结果:歌曲能被播放
实际结果:歌曲能被播放
(6)测试功能:收藏音乐到喜欢音乐列表
执行测试操作步骤
——在音乐列表选择歌曲
——点击喜欢按钮
预期结果:歌曲能被收藏到喜欢列表
实际结果:歌曲能被收藏到喜欢列表
(7)测试功能:收藏音乐到喜欢音乐列表(收藏失败)
执行测试操作步骤
——在音乐列表选择在收藏列表已有歌曲
——点击喜欢按钮
预期结果:弹出一个歌曲收藏失败框
实际结果:弹出一个歌曲收藏失败框
(8)测试功能:删除音乐(单个)
执行测试操作步骤
——在音乐列表选择歌曲
——点击删除按钮
预期结果:歌曲能被删除
实际结果:歌曲能被删除
(9)测试功能:删除音乐(多个)
执行测试操作步骤
——在音乐列表选择多个歌曲
——点击删除选中按钮
预期结果:歌曲能被删除
实际结果:歌曲能被删除
(10)功能测试:上传音乐(非重复)
执行测试操作步骤
——在上传音乐界面选择音乐,并输入歌手名称
——点击上传按钮
预期结果:页面跳转回音乐列表页面并多了已添加的音乐
实际结果:页面跳转回音乐列表页面并多了已添加的音乐
(11)功能测试:上传音乐(重复)
执行测试操作步骤
——在上传音乐界面选择音乐已有,并输入相同歌手名称
——点击上传按钮
预期结果:页面没跳转并显示错误信息
实际结果:页面没跳转并显示错误信息
2.1.4收藏音乐列表界面
(12)测试功能:音乐搜索功能(内容为空)
执行测试操作步骤
——在收藏音乐列表搜索页面不添加内容
——点击搜索按钮
预期结果:音乐列表页面会显示全部数据
实际结果:音乐列表页面会显示全部数据
(13)测试功能:音乐搜索功能(内容不为空)
执行测试操作步骤
——在收藏音乐列表搜索页面添加内容
——点击搜索按钮
预期结果:收藏音乐列表页面会显示有关内容全部数据
实际结果:收藏音乐列表页面会显示有关内容全部数据
(14)测试功能:音乐播放
执行测试操作步骤
——在音乐列表选择歌曲
——点击播放按钮
预期结果:歌曲能被播放
实际结果:歌曲能被播放
(15)测试功能:删除音乐(单个)
执行测试操作步骤
——在音乐列表选择歌曲
——点击移除按钮
预期结果:歌曲能被删除并跳转到列表页面
实际结果:歌曲能被删除并跳转到列表页面
3.2 自动化测试
(1)测试用例:
(2)登陆界面
测试点
代码为:
package com.example.onlinemusic.test;
import com.example.onlinemusic.common.common;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import java.util.Set;
public class LoginTest extends common {
public static String url = "http://127.0.0.1:8080/login.html";
//3自动在输入框帮我输入账号密码
public LoginTest() {
super(url);
}
public void checkPageRight(){
//检查登录框
driver.findElement(By.xpath("//*[@id=\"user\"]"));
driver.findElement(By.xpath("//*[@id=\"password\"]"));
driver.findElement(By.xpath("//*[@id=\"submit\"]"));
}
//正常登录以及跳转
public void loginSuccess() throws InterruptedException {
driver.findElement(By.xpath("//*[@id=\"user\"]")).sendKeys("admin");
driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("admin");
Thread.sleep(2000);
driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
Thread.sleep(2000);
//作用到Alert弹窗上
Alert alert = driver.switchTo().alert();
alert.accept();
// alert.dismiss();
Thread.sleep(2000);
String curWindow = driver.getWindowHandle();
Set<String> allwindow = driver.getWindowHandles();
for(String w:allwindow){
if (!w.equals(curWindow)) {
driver.switchTo().window(w);
}
}
}
//异常登录以及跳转
public void loginFail() throws InterruptedException {
driver.findElement(By.xpath("//*[@id=\"user\"]")).sendKeys("admin");
driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123");
Thread.sleep(2000);
driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();
Thread.sleep(2000);
//作用到Alert弹窗上
Alert alert = driver.switchTo().alert();
alert.accept();
// alert.dismiss();
Thread.sleep(1000);
String curWindow = driver.getWindowHandle();
Set<String> allwindow = driver.getWindowHandles();
for(String w:allwindow){
if (!w.equals(curWindow)) {
driver.switchTo().window(w);
}
}
}
}
(3)音乐列表页面
代码实例为:
package com.example.onlinemusic.test;
import com.example.onlinemusic.common.common;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.time.Duration;
import java.util.Set;
public class ListPage extends common {
public static String url = "http://127.0.0.1:8080/list.html";
//3自动在输入框帮我输入账号密码
public ListPage() {
super(url);
}
//检查查询功能
public void checksearch(){
driver.findElement(By.xpath("//*[@id=\"exampleInputName2\"]"));
driver.findElement(By.xpath("//*[@id=\"submit1\"]"));
}
//测试查询功能(成功)
public void searchSuccess(String s){
driver.findElement(By.xpath("//*[@id=\"exampleInputName2\"]")).sendKeys(s);
driver.findElement(By.xpath("//*[@id=\"submit1\"]")).click();
}
//测试查询功能失败(没有歌)
public void searchFail(){
driver.findElement(By.xpath("//*[@id=\"exampleInputName2\"]")).sendKeys("c");
driver.findElement(By.xpath("//*[@id=\"submit1\"]")).click();
}
// 测试操作
public String operation(String s,int i) throws InterruptedException {
if(s.equals("喜欢")){
// 选取第一个
driver.findElement(By.xpath("//*[@id=\"info\"]/tr["+i+"]/td[4]/button[2]")).click();
System.out.println();
Thread.sleep(500);
//作用到Alert弹窗上
Alert alert = driver.switchTo().alert();
alert.accept();
//隐性等待1秒
// driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000));
// alert.dismiss();
Thread.sleep(500);
return null;
}//*[@id="info"]/tr[1]/td[4]/button[1]
if(s.equals("删除")){
// 选取第一个
//*[@id="info"]/tr[2]/td[1]
String ss=driver.findElement(By.xpath("//*[@id=\"info\"]/tr["+i+"]/td[1]")).getText();
System.out.println(ss);
driver.findElement(By.xpath("//*[@id=\"info\"]/tr["+i+"]/td[4]/button[1]")).click();
Thread.sleep(500);
Alert alert=driver.switchTo().alert();
alert.accept();
Thread.sleep(500);
return ss;
}//*[@id="info"]/tr[1]/td[4]/button[1]
return null;
}
//上传操作
public void load(String s) throws InterruptedException {
driver.findElement(By.xpath("//*[@id=\"body\"]/div[1]/div[2]/a[2]")).click();
Thread.sleep(500);
String curWindow=driver.getWindowHandle();
Set<String> allwindow=driver.getWindowHandles();
for (String w:allwindow) {
if(!w.equals(curWindow)){
driver.switchTo().window(w);
}
}
Thread.sleep(500);
driver.findElement(By.xpath("/html/body/form/input[1]")).sendKeys("E:\\javaEE\\springBookMaven\\hifini\\"+s+".mp3");
Thread.sleep(500);
driver.findElement(By.xpath("/html/body/form/label/input")).sendKeys(s);
Thread.sleep(500);
driver.findElement(By.xpath("/html/body/form/input[2]")).click();
String curWindow1=driver.getWindowHandle();
Set<String> allwindow1=driver.getWindowHandles();
for (String w:allwindow1) {
if(!w.equals(curWindow1)){
driver.switchTo().window(w);
}
}
}
public void switchTo1(){
driver.findElement(By.xpath("//*[@id=\"body\"]/div[1]/div[2]/a[1]")).click();
String curwindow=driver.getWindowHandle();
Set<String> allwindow=driver.getWindowHandles();
for (String s:allwindow) {
if(!s.equals(curwindow)){
driver.switchTo().window(s);
}
}
}
}
(4)收藏音乐界面
测试点
代码实例为
package com.example.onlinemusic.test;
import com.example.onlinemusic.common.common;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
public class LovePage extends common {
public static String url = "http://127.0.0.1:8080/loveMusic.html";
//3自动在输入框帮我输入账号密码
public LovePage() {
super(url);
}
//测试查询功能(成功)
public void searchSuccess(String s){
driver.findElement(By.xpath("//*[@id=\"exampleInputName2\"]")).sendKeys(s);
driver.findElement(By.xpath("//*[@id=\"submit1\"]")).click();
}
//测试查询功能失败(没有歌)
public void searchFail(){
driver.findElement(By.xpath("//*[@id=\"exampleInputName2\"]")).sendKeys("c");
driver.findElement(By.xpath("//*[@id=\"submit1\"]")).click();
}
public void operation(int i) throws InterruptedException {
driver.findElement(By.xpath("//*[@id=\"info\"]/tr["+i+"]/td[4]/button")).click();
Thread.sleep(500);
Alert alert=driver.switchTo().alert();
alert.accept();
}
}
(5)上传音乐界面
测试点:
代码为:
//上传操作
public void load(String s) throws InterruptedException {
driver.findElement(By.xpath("//*[@id=\"body\"]/div[1]/div[2]/a[2]")).click();
Thread.sleep(500);
String curWindow=driver.getWindowHandle();
Set<String> allwindow=driver.getWindowHandles();
for (String w:allwindow) {
if(!w.equals(curWindow)){
driver.switchTo().window(w);
}
}
Thread.sleep(500);
driver.findElement(By.xpath("/html/body/form/input[1]")).sendKeys("E:\\javaEE\\springBookMaven\\hifini\\"+s+".mp3");
Thread.sleep(500);
driver.findElement(By.xpath("/html/body/form/label/input")).sendKeys(s);
Thread.sleep(500);
driver.findElement(By.xpath("/html/body/form/input[2]")).click();
String curWindow1=driver.getWindowHandle();
Set<String> allwindow1=driver.getWindowHandles();
for (String w:allwindow1) {
if(!w.equals(curWindow1)){
driver.switchTo().window(w);
}
}
}
public void switchTo1(){
driver.findElement(By.xpath("//*[@id=\"body\"]/div[1]/div[2]/a[1]")).click();
String curwindow=driver.getWindowHandle();
Set<String> allwindow=driver.getWindowHandles();
for (String s:allwindow) {
if(!s.equals(curwindow)){
driver.switchTo().window(s);
}
}
}
四、遗留风险
由于测试时间紧张,本次测试主要集中在在线音乐系统的主功能上,可能存在一些细节测试不到位的情况。例如,某些边缘场景下的功能表现、兼容性问题等可能未被充分测试。同时,部分接口如上传音乐的发送 KB 每秒数值较大,可能存在潜在的数据传输风险,需要进一步关注。
五、测试结果评估
主功能测试通过,项目可以上线:经过功能测试和自动化测试,系统的主要功能均能正常运行,满足产品的基本需求,因此项目可以上线。
项目上线后需观察线上数据,查看线上用户操作日志,及时跟进用户反馈:上线后应密切关注系统的运行情况,通过分析线上数据和用户操作日志,及时发现并解决可能出现的问题。同时,要积极收集用户反馈,对系统进行持续优化。