音悦台项目测试报告

news2024/11/25 0:42:16

文章目录

  • 项目背景
  • 项目功能
  • 测试计划与设计
    • 功能测试
    • 自动化测试
  • 测试结果
    • 功能测试结果
    • UI自动化测试结果

项目背景

现如今人们的生活压力大,容易使人疲惫,为了使得人们在闲暇之余可以听音乐放松,为此设计出一款轻量的听音乐网站,快速方便的使得用户随时随地听音乐放松

除此外,通过此次项目的经历,可使得我对文件传输的操作更加输入,还对前后端分离项目的设计思想包括数据库设计,接口的设计等更加深入理解

项目功能

  • 注册:用户首次登录可申请注册一个个人账号
  • 登录:用户使用注册好的账号进行登录
  • 上传音乐:用户可以自由的上传音乐打造属于自己的音乐空间
  • 音乐文件检验:系统会自动地对用户上传地音乐文件进行校验,非mp3文件和篡改地文件不可上传
  • 听音乐:用户可以随时随地的点击音乐进行播放
  • 查询音乐:用户可以使用音乐的名称进行搜索,方便快捷的使用户听想听的音乐
  • 删除单个音乐:用户可以对不喜欢的音乐进行删除
  • 批量删除:用户可以批量选择不喜欢的音乐,然后对选中的音乐进行批量删除
  • 收藏音乐:用户可对自己非常喜欢地音乐进行收藏,方便用户对喜欢地音乐进行管理
  • 查询收藏音乐:用户可以随时随地查询自己收藏地音乐
  • 取消收藏:用户可对已收藏地音乐进行取消

测试计划与设计

功能测试

测试步骤:

  1. 分析需求,提取测试点
  2. 针对测试点设计测试用例
  3. 根据测试用例手工执行测试
  4. 针对测试结果输出报告

测试用例

这里针对项目的界面功能安全性能兼容性易用性设计测试用例

此处只粘贴部分用例,完整的用例可访问Gitee链接查看

链接: 音悦台测试用例

在这里插入图片描述

测试步骤

这里记录几个核心功能的测试步骤:

  • 上传音乐
  • 播放音乐
  • 收藏音乐

上传音乐的测试步骤:

  1. 先正确登录

在这里插入图片描述

  1. 点击上传音乐
    在这里插入图片描述

  2. 选择文件,输入歌手信息,点击上传

在这里插入图片描述

  1. 在主页面查看音乐已上传成功

在这里插入图片描述

播放音乐的测试步骤:

  1. 先进入音乐列表主界面
    在这里插入图片描述
  2. 点击刚才上传的音乐进行播放
    在这里插入图片描述
  3. 与本地音乐文件对比,查看音乐文件是否上传完整,播放是否有卡顿

收藏音乐的测试步骤:

  1. 点击某个音乐的收藏按钮

在这里插入图片描述

  1. 观察有弹窗提示收藏成功

在这里插入图片描述

  1. 进入收藏列表,观察是否上传成功

在这里插入图片描述

  1. 播放上传的音乐,看是否可成功播放

在这里插入图片描述

自动化测试

自动化测试的优点:

自动化测试可代替一部分手工测试,提高测试的执行效率,并且随着项目版本的迭代,回归测试的压力越来越大,借助自动化测试提高回归测试的效率

注意: 自动化测试只能代替一部分手工测试,不能完全替代手工测试

自动化测试的步骤:

  1. 分析项目的核心功能
  2. 针对核心功能设计自动化测试的用例
  3. 针对测试用例编写自动化脚本
  4. 执行脚本
  5. 记录测试结果

设计自动化测试用例

此处针对三个模块设计用例,三个模块分别是:

  • 用户模块:含登录,注册,注销
  • 音乐列表模块:含上传音乐,删除,查询音乐
  • 收藏音乐模块:含收藏,查询,取消收藏

此处只粘贴部分UI自动化测试用例,可访问Gitee链接查看全部用例

链接: 音悦台UI自动化测试用例

在这里插入图片描述

编写自动化测试脚本

此处只粘贴部分脚本,全部脚本可访问Gitee链接

链接: 音悦台UI自动化测试脚本


    //音乐列表的元素
    @Order(1)
    @Test
    void elementTest() throws InterruptedException {
        driver.get("http://47.108.53.70:8081/login.html");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        driver.findElement(By.cssSelector("#user")).sendKeys("admin");
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        Alert alert = driver.switchTo().alert();
        alert.accept();
        String url = "http://47.108.53.70:8081/musicList.html";
        String curUrl = driver.getCurrentUrl();
        Assertions.assertEquals(url,curUrl);
        String title = "音乐列表";
        String curTitle = driver.getTitle();
        Assertions.assertEquals(title,curTitle);
    }

    //上传音乐成功
    @Order(2)
    @ParameterizedTest
    @CsvSource(value = {"'D:/音乐/下载/盗将行.mp3',花粥","'D:/音乐/下载/世间美好与你环环相扣.mp3',网络歌手"})
    void uploadSuccess(String filePath,String singer) throws InterruptedException {
        driver.get("http://47.108.53.70:8081/login.html");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        driver.findElement(By.cssSelector("#user")).sendKeys("admin");
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        Alert alert = driver.switchTo().alert();
        alert.accept();
        driver.findElement(By.cssSelector("#body > div.container > div:nth-child(3) > a:nth-child(2)")).click();
        driver.findElement(By.cssSelector("#filename")).sendKeys(filePath);
        driver.findElement(By.cssSelector("#singer")).sendKeys(singer);
        driver.findElement(By.cssSelector("#button")).click();
        Thread.sleep(3000);
        Alert alert1 = driver.switchTo().alert();
        Assertions.assertEquals("上传成功",alert.getText());
        alert1.accept();
    }

    //上传音乐失败1:音乐已经存在
    @Order(3)
    @ParameterizedTest
    @CsvSource(value = {"'D:/音乐/下载/盗将行.mp3',花粥","'D:/音乐/下载/世间美好与你环环相扣.mp3',网络歌手"})
    void uploadFail1(String filePath,String singer) throws InterruptedException {
        driver.get("http://47.108.53.70:8081/login.html");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        driver.findElement(By.cssSelector("#user")).sendKeys("admin");
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        Alert alert = driver.switchTo().alert();
        alert.accept();
        driver.findElement(By.cssSelector("#body > div.container > div:nth-child(3) > a:nth-child(2)")).click();
        driver.findElement(By.cssSelector("#filename")).sendKeys(filePath);
        driver.findElement(By.cssSelector("#singer")).sendKeys(singer);
        driver.findElement(By.cssSelector("#button")).click();
        Thread.sleep(3000);
        Alert alert1 = driver.switchTo().alert();
        Assertions.assertEquals("音乐已存在",alert.getText());
        alert1.accept();
    }

    //上传音乐失败2:文件格式不对
    @Order(4)
    @ParameterizedTest
    @CsvSource(value = {"'D:/photo/18.jpg',网络歌手","'D:/photo/8.mp3',网络歌手"})
    void uploadFail2(String filePath,String singer) throws InterruptedException {
        driver.get("http://47.108.53.70:8081/login.html");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        driver.findElement(By.cssSelector("#user")).sendKeys("admin");
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        Alert alert = driver.switchTo().alert();
        alert.accept();
        driver.findElement(By.cssSelector("#body > div.container > div:nth-child(3) > a:nth-child(2)")).click();
        driver.findElement(By.cssSelector("#filename")).sendKeys(filePath);
        driver.findElement(By.cssSelector("#singer")).sendKeys(singer);
        driver.findElement(By.cssSelector("#button")).click();
        Thread.sleep(3000);
        Alert alert1 = driver.switchTo().alert();
        Assertions.assertEquals("文件类型错误:请选择mp3文件",alert.getText());
        alert1.accept();
    }

    //查询音乐1:音乐存在
    @Order(5)
    @ParameterizedTest
    @ValueSource(strings = {"红日","广寒","一路生"})
    void findMusic1(String musicName) throws InterruptedException {
        driver.get("http://47.108.53.70:8081/login.html");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        driver.findElement(By.cssSelector("#user")).sendKeys("admin");
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        Alert alert = driver.switchTo().alert();
        alert.accept();
        driver.findElement(By.cssSelector("#exampleInputName2")).sendKeys(musicName);
        driver.findElement(By.cssSelector("#submit1")).click();
        Thread.sleep(1000);
        WebElement element = driver.findElement(By.cssSelector("#info > tr"));
        Assertions.assertNotNull(element);
    }

    //查询音乐2:音乐不存在
    @Order(6)
    @ParameterizedTest
    @ValueSource(strings = {"爱情买卖","自由飞翔","月亮之上"})
    void findMusic2(String musicName) throws InterruptedException {
        driver.get("http://47.108.53.70:8081/login.html");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        driver.findElement(By.cssSelector("#user")).sendKeys("admin");
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        Alert alert = driver.switchTo().alert();
        alert.accept();
        driver.findElement(By.cssSelector("#exampleInputName2")).sendKeys(musicName);
        driver.findElement(By.cssSelector("#submit1")).click();
        Thread.sleep(1000);
        try{
            WebElement element = driver.findElement(By.cssSelector("#info tr"));
            System.out.println(false);
        }catch (Exception e){
            System.out.println(true);
        }
    }

    //删除单个
    @Test
    void deleteOne() throws InterruptedException {
        driver.get("http://47.108.53.70:8081/login.html");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        driver.findElement(By.cssSelector("#user")).sendKeys("admin");
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        Alert alert = driver.switchTo().alert();
        alert.accept();
        driver.findElement(By.xpath("//*[@id=\"info\"]/tr[1]/td[4]/button[1]")).click();
        Thread.sleep(500);
        Alert alert1 = driver.switchTo().alert();
        alert1.accept();
        Thread.sleep(500);
        Alert alert2 = driver.switchTo().alert();
        Assertions.assertEquals("删除成功",alert2.getText());
        alert2.accept();
    }

    //批量删除
    @Test
    void deleteMore() throws InterruptedException {
        driver.get("http://47.108.53.70:8081/login.html");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        driver.findElement(By.cssSelector("#user")).sendKeys("admin");
        driver.findElement(By.cssSelector("#password")).sendKeys("12345");
        driver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(2000);
        Alert alert = driver.switchTo().alert();
        alert.accept();
        driver.findElement(By.xpath("//*[@id=\"23\"]")).click();
        driver.findElement(By.xpath("//*[@id=\"24\"]")).click();
        driver.findElement(By.cssSelector("#deleteAll")).click();
        Alert alert1 = driver.switchTo().alert();
        Thread.sleep(2000);
        alert1.accept();
        Thread.sleep(2000);
        Alert alert2 = driver.switchTo().alert();
        Assertions.assertEquals("删除成功",alert2.getText());
        alert2.accept();
    }
}

测试结果

功能测试结果

未通过测试如下:

  1. 登陆,注册时,输入完参数点击回车不能触发点击效果,影响用户体验
    在这里插入图片描述
  2. 上传大文件,上传失败,未提示文件过大
  3. 性能方面,当音乐文件过大,对于上传和播放,服务器响应较慢
  4. 手机端登陆,页面元素有遮挡
    在这里插入图片描述

UI自动化测试结果

总共执行了30条自动化case,通过了29条,未通过1条

部分通过执行的结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

未通过:登录页面的元素有错别字,登录而不是登陆

在这里插入图片描述

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

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

相关文章

centos安装部署Kubernetes(k8s)步骤使用kubeadm方式

文章目录 1、修改系统配置2、安装docker应用3. 拉取docker镜像4、cri-dockerd安装5、安装kubeadm和kubelet6、配置flannel网络插件7、Node节点加入集群操作 机器地址: 192.168.0.35 k8s-master 192.168.0.39 k8s-node1 192.168.0.116 k8s-node2 1、修改系统配置 修…

Web应用技术(第十六周/持续更新)

本次联系基于how2j的教程完成对SpringBoot的初步学习。 初识Springboot 学习导入:1.第一个基于SpringBoot的项目:(1)application.java:该文件中的核心代码: (2)HelloController.jav…

一. ATR技术指标的定义与运用

一. ATR的定义 1. 什么是ATR ATR英文全名是Average true range,翻译过来就是平均真实波幅,这个指标主要用来衡量最近N天TR(真实波幅)的平均值。 2. ATR相关计算公式 T R [ ( 最高价 − 最低价 ) , ( 前一次收盘价 − 最高价 ) &#xff0…

macOS Sonoma 14.0 Beta 1 (23A5257q) Boot ISO 原版可引导镜像

macOS Sonoma 14.0 Beta 1 (23A5257q) Boot ISO 原版可引导镜像 本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持在 Windows 和…

OAuth2.0 授权 OpenID Connect 身份认证

文章目录 OAuth2.0历史由来名词解释授权码模式(authorization code 最常用)先换取code,再根据 code 换取 access_token原因 简化模式(implicit)密码模式(resource owner password credentials)客…

【P49】JMeter 查看结果树(View Results Tree)

文章目录 一、查看结果树(View Results Tree)参数说明二、准备工作三、测试计划设计 一、查看结果树(View Results Tree)参数说明 可以查看取样器的请求参数、返回结果 使用场景:一般在调试测试计划期间用来查看取样…

Bigdata1234.cn课堂测试

Java源文件中有一个公共类名称为Test,则该源文件名必须是:Test.java . Java中的基本数据类型共有8个:byte、short、int、long、float、double、char、boolean。 . Eclipse中内容补全的快捷键是alt/ Eclipse 中自动导包的快捷键是 Ctrl Sh…

MySQL数据库从入门到精通学习第8天(表数据的查询)

表数据的查询 基本查询语句单表查询聚合函数查询多表连接查询子查询合并查询结果定义表和字段的别名使用正则表达式查询 基本查询语句 SELECT 语句非常的强大,是最常用的查询语句。他具有一个固定的格式,如下: SELECT 查询的内容 FROM 数据…

【Mysql数据库从0到1】-入门基础篇--mysql 多表查询

【Mysql数据库从0到1】-入门基础篇--mysql 多表查询 🔻一、mysql 多表查询1.1 🍃 7种sql joins 的实现1.2 🍃 错误写法---笛卡尔积错误1.3 🍃 正确的多表select写法 🔻二、内连接( inner) join🔻三、 外连接…

100天精通Golang(基础入门篇)——第2天:学习Go语言的前世今生:一门强大的编程语言的崛起

🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《I…

如何构建一个可实盘的跨期套利策略?

一、策略摘要 跨期套利,在同一个品种但不同月份的期货合约上建立仓位相同、方向相反的交易头寸,最后以对冲或交割方式结束交易、获得收益。因其合约价差具有较好的稳定性,被众多交易者所青睐。本篇内容我们将通过掘金量化平台构建一个可交易…

私募证券基金动态-23年5月报

成交量:5月日均11,342.95亿元 2023年5月A股两市日均成交9,284.12亿元,环比下降18.15%、同比上升10.56%。5月整体20个交易日,仅有月初5个交易日单日成交金额过万亿。 管理人:新提交备案6家,备案通过0家 2023年5月新提…

Shape-Erased Feature Learning for Visible-Infrared Person Re-Identification

Shape-Erased Feature Learning for Visible-Infrared Person Re-Identification(形状擦除特征学习在可见红外人物再识别中的应用) 期刊合集:最近五年,包含顶刊,顶会,学报>>网址 文章来源&#xff1…

Lecture 10 Distributional Semantics

目录 Problems of Lexical Database 词汇数据库的问题分布假设根据上下文猜测单词含义Word vectors 词向量词嵌入Count-based Word Vectors 基于计数的方法Document as Context: The Vector Space Model 向量空间模型TF-IDFDimensionality Reduction 降维 Words as Context 单词…

跨数据中心高可用架构设计

前言 随着常年的码代码,做设计,笔者做过基础编码,云计算平台,架构师,见过不少应用设计,系统设计,中间件,了解现有的技术体系发展模式,集中式->分布式;cap…

阿里8年,肝到P7只剩这份笔记了,已助朋友拿到15个Offer....

时光飞逝,转眼间在阿里工作了8年,工作压力大,节奏快,但是从技术上确实得到了成长,尤其是当你维护与大促相关的系统的时候,熬到P7也费了不少心思 我的职业生涯开始和大多数测试人一样,刚开始接触…

Redis进阶:分布式锁问题

分布式锁问题 1. 分布式锁问题1.1 问题介绍1.2 解决方案1.2.1 分布式锁主流的实现方案1.2.2 使用Redis实现分布式锁1.2.3 分布式锁需要满足的四个条件 1.3 实现分布式锁 1. 分布式锁问题 1.1 问题介绍 单机单体中的锁机制在分布式集群系统中失效;单纯的Java API并…

Linux快速安装MySQL

文章目录 Linux上安装MySQL1. 安装MySQL1)上传MySQL安装包以及MySQL驱动jar包2)解压MySQL安装包3)卸载系统自带的mariadb4)安装MySQL依赖5)安装mysql-client6)安装mysql-server7)启动MySQL8&…

案例27:基于Java宠物领养系统开题报告设计

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

性能测试之Docker监控

相信很多程序员在进行性能测试时常常会遇到一些问题,比如如何监控Docker容器的运行状态。这时候,Docker监控工具就派上了用场。 我曾经也遇到过这样的问题,不知道如何获取Docker容器的性能数据,直到我发现了Docker监控工具。使用…