音乐专辑管理系统测试报告

news2024/10/23 7:27:13

一、项目背景

音乐市场规模逐年扩大,音乐专辑管理系统是一款以音乐专辑为核心,为音乐产业上下游企业提供·一个高效的音乐专辑管理工具,以便更好地管理音乐专辑,采用前后端分离的方法来实现,使用了数据库来存储相关的数据,主要技术栈SpringBoot, SpringMVC ,MyBatis, MySQL, vue

二、项目功能

该音乐专辑管理系统主要实现了以下几个功能:登录、注销、用户管理、平台管理、音乐专辑管理、出入库功能

登录功能:用户名以及密码已经在后端写入了数据库,没有实现账户注册功能,即:用户名以及密码是已经存在的。登录成功后就会跳转到页面主页。但是在未登录情况下按下均只会跳转到登录页面。

用户管理:显示关于用户的详细数据,如账户名、姓名、密码、年龄、性别、电话等,增加用户账户、姓名、密码、年龄、性别、电话等用户信息,删除用户、更改用户信息、利用用户姓名查询用户信息,管理和记录系统中的数据,包括数据的录入、编辑、删除和查询等。

平台管理:对于专辑发布平台的信息进行统计和汇总, 方便用户对于专辑平台进行管理,包括数据的录入、编辑、删除和查询等。

专辑管理:主要对专辑信息进行展示,返回音乐专辑对于专辑名、专辑平台、数量、备注等专辑信息进行核对,管理和记录系统中的数据,包括数据的录入、编辑、删除和查询等,对专辑进行出库入库操作,并对专辑库存数量更新。

三、测试计划

根据测试用例使用selenium4自动化测试工具和junit5单元测试框架结合来实现web自动化测试

3.1 功能测试

1.登陆功能

访问网站-> 跳转到登录页面-> 输入测试数据(用户名+密码) ->单击登录

2.添加功能

访问网站-> 点击添加按钮> 输入测试数据 ->单击确定按钮

3.编辑功能

访问网站-> 点击需要编辑的信息对应的operate按钮-> 修改测试数据 ->单击确定

4.删除功能

访问网站-> 点击需要删除信息对应的delete按钮->  修改测试数据 ->  单击确定

允许用户从系统中删除不再需要或已过期的信息记录,点击对应delete键。

5.出入库功能

访问网站-> 选择出库还是入库操作> 输入测试数据->  单击确定->  增加/减去专辑库存数量

3.2 自动化测试

针对音乐专辑管理项目进行测试,主要由四个页面构成:登录页、用户管理、平台管理和专辑管理,主要功能包括:登录、编辑、添加、删除信息等功能。对于音乐专辑管理系统的测试主要就是针对主要功能进行测试。

1.添加依赖

引入 Maven 依赖,添加selenium4自动化测试工具和junit5单元依赖

<dependencies>
<!--        添加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>

        <!--        添加junit5依赖-->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-suite</artifactId>
            <version>1.8.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

2.初始化浏览器驱动

测试前置操作,创建浏览器驱动,测试后置操作,关闭浏览器 ,清除访问痕迹

public class InitAndEnd {
    public static WebDriver  webDriver;
    @BeforeAll
    static void setup(){
        webDriver=new ChromeDriver();

    }
    @AfterAll
    static void teardown(){
//        webDriver.quit();
    }

}

3.登录测试

用户登录测试 主要测试登录成功情况、登录失败和退出登录三种情况情况 , 

创建驱动,并打开页面
测试页面是否正常打开
注意测试的顺序,使用Order注解指定,否则可能会因为执行顺序不对导致测试失败

测试正常登录:多参数测试,是否可以正常跳转到主页面

    @ParameterizedTest
    @CsvSource({"gy2,1234,http://192.168.1.107:8080/IndexHome"})
    void exit(String user,String password,String url) throws InterruptedException {

        webDriver.get("http://192.168.1.107:8080/");
//           //输入账号
        webDriver.findElement(By.cssSelector("#user")).sendKeys(user);
           //输入密码
        webDriver.findElement(By.xpath("//*[@id=\"pass\"]/div/div/input")).sendKeys(password);
           //点击登录
        webDriver.findElement(By.cssSelector("#sure")).click();
           //跳转到主页
        sleep(3000);
        String cur_url=webDriver.getCurrentUrl();
        Assertions.assertEquals(url,cur_url);
        ;
        Actions action = new Actions(webDriver);
        WebElement settings =webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/section/header/div/div[3]/span"));
        action.moveToElement(settings).perform();
        sleep(3000);
        webDriver.findElement(By.xpath("/html/body/ul/li[2]")).click();
        sleep(3000);
        webDriver.findElement(By.xpath("/html/body/div[2]/div/div[3]/button[2]")).click();
//        sleep(3000);

          String cur_url2=webDriver.getCurrentUrl();
//        sleep(3000);
//        Assertions.assertEquals("http://192.168.1.109:8080/",cur_url2);

    }

测试异常登录:用户名和密码错误的多种情况

 @ParameterizedTest
    @CsvSource({"gy222,1234,http://192.168.1.107:8080/IndexHome"})
    void loginno(String user,String password,String url) throws InterruptedException {

        webDriver.get("http://192.168.1.107:8080/");
//           //输入账号
        webDriver.findElement(By.cssSelector("#user")).sendKeys(user);
           //输入密码
        webDriver.findElement(By.xpath("//*[@id=\"pass\"]/div/div/input")).sendKeys(password);
           //点击登录
        webDriver.findElement(By.cssSelector("#sure")).click();
           //跳转到主页
        sleep(3000);
        String cur_url=webDriver.getCurrentUrl();
        Assertions.assertEquals(url,cur_url);

    }

测试退出登录

    @ParameterizedTest
    @CsvSource({"gy2,1234,http://192.168.1.107:8080/IndexHome"})
    void exit(String user,String password,String url) throws InterruptedException {

        webDriver.get("http://192.168.1.107:8080/");
//           //输入账号
        webDriver.findElement(By.cssSelector("#user")).sendKeys(user);
           //输入密码
        webDriver.findElement(By.xpath("//*[@id=\"pass\"]/div/div/input")).sendKeys(password);
           //点击登录
        webDriver.findElement(By.cssSelector("#sure")).click();
           //跳转到主页
        sleep(3000);
        String cur_url=webDriver.getCurrentUrl();
        Assertions.assertEquals(url,cur_url);
        ;
        Actions action = new Actions(webDriver);
        WebElement settings =webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/section/header/div/div[3]/span"));
        action.moveToElement(settings).perform();
        sleep(3000);
        webDriver.findElement(By.xpath("/html/body/ul/li[2]")).click();
        sleep(3000);
        webDriver.findElement(By.xpath("/html/body/div[2]/div/div[3]/button[2]")).click();
//        sleep(3000);

          String cur_url2=webDriver.getCurrentUrl();
//        sleep(3000);
//        Assertions.assertEquals("http://192.168.1.109:8080/",cur_url2);

    }

4.添加测试

创建驱动,并打开页面

试页面是否正常打开

在登录成功状态下,点击添加按钮,测试是否可用

点击添加按钮,测试是否可用

弹出添加窗口

 输入测试数据

 测试确认按钮是否可以正常使用

检验数据是否添加成功

 void add() throws InterruptedException {
        int num=webDriver.findElements(By.cssSelector(".el-table__row")).size();
        webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/aside/ul/li[2]")).click();
        webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/section/main/div/div[1]/button[2]")).click();
        webDriver.findElement(By.xpath("//*[@id=\"name2\"]")).sendKeys("网易云音乐");
//        ((JavascriptExecutor)webDriver).executeScript("document.getElementById(\"name2\").value=\"网易云音乐\";");
        webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/section/main/div/div[4]/div/div[3]/span/button[2]")).click();
        sleep(3000);
        int num1=webDriver.findElements(By.cssSelector(".el-table__row")).size();
        Assertions.assertEquals(num+1,num1);
    }

5.编辑测试

单击需修改信息对应的operate按钮,测试编辑按钮是否可以使用

弹出编辑窗口

修改信息

对信息进行修改,单击确定

单击确认,关闭窗口

检验数据是否修改成功

    void update() throws InterruptedException {
        WebElement select = webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/section/main/div/div[2]/div[3]/table/tbody"));
        List<WebElement> allOptions = select.findElements(By.className("el-table__row"));
        String  x="//*[@id=\"app\"]/section/section/main/div/div[2]/div[3]/table/tbody/tr["+ 2 +"]/td[4]/div/button[1]";
        System.out.println(x);
        webDriver.findElement(By.xpath(x)).click();
        webDriver.findElement(By.xpath("//*[@id=\"name2\"]")).clear();
        webDriver.findElement(By.xpath("//*[@id=\"name2\"]")).sendKeys("K4");
        webDriver.findElement(By.name( "sure" )).click();
        String lasttext=webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/section/main/div/div[2]/div[3]/table/tbody/tr[2]/td[2]")).getText();
        Assertions.assertEquals("K4",lasttext);

    }

6.删除测试

选择需要删除的信息对应的delete按钮,测试“删除”按钮是否可用

单击确认

检验信息是否删除成功

void del() throws InterruptedException {
        WebElement select = webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/section/main/div/div[2]/div[3]/table/tbody"));
        List<WebElement> allOptions = select.findElements(By.className("el-table__row"));
        JavascriptExecutor js;
        // 获取最后一个选项的索引
//        int lastOptionIndex = allOptions.size() - 1;
        int num1=select.findElements(By.className("el-table__row")).size();
        System.out.println("");
        String  x="//*[@id=\"app\"]/section/section/main/div/div[2]/div[3]/table/tbody/tr["+ num1+"]/td[4]/div/button[2]";
        System.out.println(x);
        webDriver.findElement(By.xpath(x)).click();
        sleep(3000);
        int num2=select.findElements(By.className("el-table__row")).size();
        String cx="/html/body/div[1]/section/section/main/div/div[2]/div[3]/table/tbody/tr["+num2+"]/td[2]/div";
        String lasttext= webDriver.findElement(By.xpath(cx)).getText();
        System.out.println(lasttext);
        Assertions.assertNotEquals("网易云音乐",lasttext);
    }

7.出入库操作

已登录状态下,单击专辑管理模块, 进入专辑管理模块详情页

异常情况:只点击出库、入库按钮,提示请选择记录

单击需要出入库的专辑信息

再点击出入库按钮,测试按钮是否可用

弹出出入库窗口,输入出入库的数量

单击确认,关闭窗口

专辑数量增加(入库)/减少(出库)

 @Test
    public void comealbum() throws InterruptedException {
    
        webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/aside/ul/li[3]/span")).click();
        webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/section/main/div/div[2]/div[3]/table/tbody/tr[1]")).click();
        webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/section/main/div/div[1]/button[3]")).click();
        webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/section/main/div/div[5]/div/div[2]/form/div[2]/div/div/input")).sendKeys("20");
        webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/section/main/div/div[5]/div/div[3]/span/button[2]/span")).click();
    }
    @Test
    public void noalbum() throws InterruptedException {
        webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/aside/ul/li[3]/span")).click();
        webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/section/main/div/div[1]/button[3]")).click();
    }
    @Test
    public void leftalbum() throws InterruptedException {
    
        webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/aside/ul/li[3]/span")).click();
        webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/section/main/div/div[2]/div[3]/table/tbody/tr[1]")).click();
        webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/section/main/div/div[1]/button[3]")).click();
        webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/section/main/div/div[1]/button[4]")).sendKeys("20");
        webDriver.findElement(By.xpath("//*[@id=\"app\"]/section/section/main/div/div[5]/div/div[3]/span/button[2]/span")).click();
    }

3.3 性能测试

使用loadrunner进行简单性能测试:针对登录、编辑、添加以及删除信息、出入库、注销等功能进行简单的性能测试。然后在实现的过程中,插入集合点以及事务等,并通过设置来实现用户的并发操作。

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

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

相关文章

Mac 电脑安装redis

1、首先检查电脑是否安装 brew 命令&#xff1a; #打开Mac自带的终端&#xff0c;输入下面命令 brew --version如下图&#xff0c;可以看到我的 brew 正常的&#xff0c;且对应版本是4.0.17-63-g32f2258 如果你的电脑执行上面命名报错&#xff1a;zsh: command not found: br…

海康硬盘录像机NVR与国标GB28181协议国标视频云服务平台LiteGBS的衔接

随着互联网技术的不断进步和智能终端设备的普及&#xff0c;流媒体视频平台逐渐成为数字化时代的重要产物&#xff0c;并在人们的日常生活中占据越来越重要的地位。所以经常碰到用户咨询我们&#xff0c;研发的视频平台能否支持海康的硬盘录像机接入&#xff0c;由于对现场没有…

AniVu 2.0 | 多功能RSS订阅与下载神器

AniVu是一个集RSS订阅与更新、比特洪流下载、视频播放为一体的工具。使用MVI架构&#xff0c;完全采用Material You设计风格。主要功能包括&#xff1a;订阅RSS、更新RSS、阅读RSS&#xff0c;自动更新RSS订阅&#xff0c;下载RSS文章中的BT种子或磁力链接附件&#xff0c;已下…

yolov5训练数据集

1.训练数据集 python train.py --batch-size 2 --epochs 150 --data dataset/leaf/data.yaml --weights .\weight\yolov5n6.pt训练数据集 python train.py&#xff1a;这是执行训练脚本的命令&#xff0c;其中 train.py 是 YOLOv5 模型训练脚本的名字。这个脚本位于 YOLOv5 项…

基于SpringBoot的打印店管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

『网络游戏』服务器使用PESorket【13】

下载PESorcket插件 下载网址:GitHub - PlaneZhong/PESocket: A C# Network Library. 打开PESorket的Example案例 右键PESocket 选择一个自定义的文件夹 点击生成 .dll文件生成成功 接下来新建VS工程使用PESocket 路径选择刚刚创建的Server文件夹 展示文件夹位置 删除掉Exampl…

【银行科技岗】相关考试知识点总结及部分考题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、**网络与安全**二、**软件开发与设计**三、**数据库与数据管理**四、**编程与系统**五、**计算机硬件与性能**六、**大数据与人工智能**七、**系统与应用**相关…

Matlab实现粒子群优化算法优化随机森林算法模型 (PSO-RF)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 粒子群优化算法&#xff08;PSO&#xff09;是一种启发式搜索方法&#xff0c;灵感来源于鸟类群体觅食的行为。在PSO中&#xff0c;每个解都是搜索空间中的一个“粒子”&#xff0c;这些粒子以一定的速度飞行&am…

3分钟解决Ubuntu22.04没有声音输出设备

问题背景 Ubuntu22.04在看视频时无法播放声音&#xff0c;设置中发现没有声音输出设备。 解决方法 编辑 alsa 配置文件。 # 编辑alsa 配置文件 sudo vim /etc/modprobe.d/alsa-base.conf# alsa-base.conf文件末尾添加下行内容 options snd-hda-intel dmic_detect0重启&…

华为 HCIP-Datacom H12-821 题库 (37)

&#x1f423;博客最下方微信公众号回复题库,领取题库和教学资源 &#x1f424;诚挚欢迎IT交流有兴趣的公众号回复交流群 &#x1f998;公众号会持续更新网络小知识&#x1f63c; 1.如图所示&#xff0c;R1 输出信息如下&#xff0c;则R1 邻居路由器的Router ID 为( ) 答案&…

HAL+M4学习记录_6

一、中断和事件 记录学习中断和事件的学习 1.1 NVIC&#xff08;嵌套矢量中断控制器&#xff09; NVIC管理着所有中断&#xff0c;包括核心异常。中断分为内部中断&#xff08;也称异常&#xff09;和外部中断&#xff0c;根据core_cm4.h文件&#xff0c;NVIC寄存器映射如下 …

C++ | set / map(详解)

前言 本篇博客讲解c中stl的set/map&#xff0c;本篇讲的如何使用 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f…

R语言绘制Venn图(文氏图、温氏图、维恩图、范氏图、韦恩图)

Venn图&#xff0c;又称文氏图&#xff0c;标题中其他名字也是它的别称&#xff0c;由封闭圆形组成&#xff0c;代表不同集合。圆形重叠部分表示集合交集&#xff0c;非重叠处为独有元素。在生物学、统计学等领域广泛应用&#xff0c;可展示不同数据集相似性与差异&#xff0c;…

【hot100-java】LRU 缓存

链表篇 灵神题解 class LRUCache {private static class Node{int key,value;Node prev,next;Node (int k,int v){keyk;valuev;}}private final int capacity;//哨兵节点private final Node dummynew Node(0,0);private final Map<Integer,Node> keyToNode new HashMap&l…

【机器学习】并行计算(parallel computation)Part1

为什么我们在机器学习中需要用到并行计算呢&#xff0c;因为现在最流行的机器学习算法都是神经网络&#xff0c;神经网络模型的计算量、参数量都很大&#xff0c;比如ResNet-50参数量为25M。而我们在训练的时候使用的数据集也很大&#xff0c;比如ImageNet数据集含有14M张图片。…

【C++笔记】引用、inline关键字和nullptr

前言 各位读者朋友们大家好&#xff0c;上期我们讲了C的部分基础语法&#xff0c;这期我们继续对C语法进行深入的学习。 目录 前言一. 引用1. 引用的概念及定义2. 引用的特性3. 引用的使用4. const引用5. 指针和引用的关系 二. inline三. nullptr 一. 引用 1. 引用的概念及定…

ubuntu登录root用户相关配置与注意事项

在ubuntu系统中&#xff0c;部分文件的访问与操作需要在root权限的认证加持下才能顺利进行&#xff0c;以下对如何登录root权限用户进行记录。 学习目标&#xff1a;随心所欲地切换普通权限用户与root用户 首先&#xff1a;在Ubuntu系统中&#xff0c;出于安全考虑&#xff0c;…

项目验收 | 星云股份携手盘古信息加“数”前行,数字智慧提升生产效率

在位于福州市的现代化智能制造工厂内&#xff0c;一排排先进的储能变流器&#xff08;PCS&#xff09;和充电桩正在紧锣密鼓地生产中&#xff0c;从电池研发、工程应用的系列测试及自动化装备&#xff0c;再到应用于电动汽车、储能新基建的储能变流器及充电桩等&#xff0c;福建…

ajax php

文章目录 get请求postget和post的异同点ajax原生步骤jquery步骤优点 php安装&#xff0c;后台处理脚本语言。 后端开发语言不能直接允许&#xff0c;必须放在服务器对对应的文件夹下运行。 如&#xff1a;wamp的对应服务器的文件夹是www get请求 <!DOCTYPE html> &l…