《软件测试和质量管理》实验报告六
一、实验目的
应用Web测试工具对Web系统进行功能和性能测试;
二、实验要求
- 撰写实验报告;
- 撰写Web系统的测试计划,测试方案;
- 撰写Web系统测试的测试用例;
- 撰写缺陷报告;
- 提交测试脚本。
三、实验内容
1.题目一:测试网站功能
选择一个网站,对其进行功能测试。要求首先编写测试用例,然后在mooctest平台对该网站进行测试。
2.题目二:测试网站性能
选择一个网站,对其进行性能测试。要求在mooctest平台进行负载测试。
四、测试用例的编写
1.功能测试用例设计
1)用例名称
千千音乐功能测试
2)前置条件
- 在Chrome浏览器中安装Selenium IDE插件;
- 点击Selenium插件,在URL地址栏中输入https://music.91q.com/,打开千千音乐首页,在《Web功能测试——千千音乐》的基础上拓展录制相关操作并导出junit。
- 使用Chrome浏览器,在URL地址栏中输入https://music.91q.com/,进入千千音乐网页,事先注册好账号;
- 下载并配置chromedriver.exe,并其所在路径添加至环境变量;
- 下载并配置selenium-standalone.jar;
3)测试步骤
- 进入“https://music.91q.com/”千千音乐首页;
- 击右上角“登录”,弹出登录弹窗后点击“使用账号登录”;
- 在账号栏输入电话,密码栏输入密码,点击立即登录;
- 点击导航栏的“歌单”;
- 选择流派中的“电子”;
- 选择并查看第一行第二位的音乐;
- 点击“收藏“;
- 选择全部歌曲栏中的第一个歌曲;
- 在右上角搜索栏输入“周杰伦”,并点击“搜索”;
- 点击搜索结果中的“专辑”一栏;
- 点击专辑栏中的“广西女孩”;
- 点击导航栏中的“歌手”一栏;
- 点击导航栏分项中的“T”、“欧美”、“女”标签;
- 点击分类结果中的歌手“唐伯虎”;
- 选择并查看排序第一的歌曲“最美酒城”;
- 补充测试:点击并查看首页中各分项模块的“更多”;
- 补充测试:点击并查看导航栏中的其余项目,分别点击“歌单”、“歌手”、“VIP”、“客户端”、“音乐人入驻”;
- 补充测试:个人信息修改,
- 点击右上角头像位置;
- 点击“编辑资料”;
- 点击“上传头像”,选择图片上传;
- 清空昵称栏,输入“Rql”;
- 清空简介栏,输入“这是rql的简介”;
- 点击“保存”;
19. 补充测试:个人收藏查看;
20. 测试录制结束,导出为Junit;
21. 将导出的Test1Test.java内容对应放入至eclipse文件结构中,在每一个操作后添加代码行“Thread.sleep(3000);”用来休眠线程,运行测试代码后提交。
4)预期结果
完成千千音乐测试功能需求。
项目名称 | 千千音乐功能测试 | 项目编号 | |
模块名称 | Web功能测试 | 模块编号 | |
用例作者 | rql | 参考信息 | Mooctest 测试需求文档 |
测试类型 | 功能测试 | 测试方法 | Selenium 录制脚本并测试 |
测试人员 | 阮琼露 | 测试日期 | 2023年6月9日 |
测试对象 | 千千音乐网站:https://music.91q.com/ | ||
前置条件 |
|
编号 | 操作 Command | 输入 数据 Value | Target | 预期 结果 | 实际 结果 | 测试 状态(P/F) |
1 | open | https://music.91q.com/ | 进入首页 | 进入首页 | P | |
2 | set window size | 1280x680 | 调整界面大小 | 调整界面大小 | P | |
3 | click | css=.login-no > span:nth-child(1) | 登录 | 登录 | P | |
4 | click | css=.login-by-password | 使用账户登录 | 使用账户登录 | P | |
5 | click | css=.is-error .el-input__inner | 点击输入账号 | 点击输入账号 | P | |
6 | type | 账号 | css=.is-success .el-input__inner | 输入账号 | 输入账号 | P |
7 | click | css=.el-form-item:nth-child(2) .el-input__inner | 点击输入密码 | 点击输入密码 | P | |
8 | type | 密码 | css=.el-form-item:nth-child(2) .el-input__inner | 输入密码 | 输入密码 | P |
9 | click | css=.el-button | 立即登录 | 立即登录 | P | |
10 | click | linkText=歌单 | 点击歌单 | 点击歌单 | P | |
11 | click | css=.filter-group:nth-child(2). filter-data-box > li:nth-child(4) > .item | 选择电子 | 选择电子 | P | |
12 | click | css=.tracklist-item:nth-child(2) > .name | 选择第一行第二位的音乐 | 选择第一行第二位的音乐 | P | |
13 | click | css=.el-button--info:nth-child(2) | 收藏音乐 | 收藏音乐 | P | |
14 | click | linkText=准明星 | 选择准明星 | 选择准明星 | P | |
15 | click | css=.el-input__inner | 点击搜索栏 | 点击搜索栏 | P | |
16 | type | 周杰伦 | css=.el-input__inner | 输入"周杰伦" | 输入"周杰伦" | P |
17 | click | css=.el-input__icon | 点击搜索 | 点击搜索 | P | |
18 | click | id=tab-3 | 点击专辑 | 点击专辑 | P | |
19 | click | css=.list-item:nth-child(2) .name | 点击广西女孩 | 点击广西女孩 | P | |
20 | click | linkText=歌手 | 点导航栏歌手 | 点导航栏歌手 | P | |
21 | click | css=.fl:nth-child(21) > .item | 选择T标签 | 选择T标签 | P | |
22 | click | css=.filter-group:nth-child(2) > .fl:nth-child(4) > .item | 选择欧美标签 | 选择欧美标签 | P | |
23 | click | css=.filter-group:nth-child(3) > .fl:nth-child(3) > .item | 选择女标签 | 选择女标签 | P | |
24 | click | css=.el-col:nth-child(12) .el-image__inner | 点击分类结果中的唐伯虎 | 点击分类结果中的唐伯虎 | P | |
26 | click | linkText=醉美酒城 | 点击醉美酒城 | 点击醉美酒城 | P | |
27 | click | linkText=首页 | 点击首页 | 点击首页 | P | |
28 | click | css=.songlist-box:nth-child(3) .more | 点击秀动发行的更多 | 点击秀动发行的更多 | P | |
29 | click | css=.list-item:nth-child(2) .name | 选择第二个歌 | 选择第二个歌 | P | |
30 | click | linkText=首页 | 点击首页 | 点击首页 | P | |
31 | click | css=.songlist-box:nth-child(4) .more | 点击热门歌单的更多 | 点击热门歌单的更多 | P | |
32 | click | linkText=首页 | 点击首页 | 点击首页 | P | |
33 | click | css=.shoufa-box-inside .more | 点击新歌推荐的更多 | 点击新歌推荐的更多 | P | |
34 | click | css=.list-item:nth-child(5) .name | 选择第五首歌 | 选择第五首歌 | P | |
35 | click | linkText=首页 | 点击首页 | 点击首页 | P | |
36 | click | css=.artist-box-inside .more | 点击热门歌手的更多 | 点击热门歌手的更多 | P | |
37 | click | css=.el-col:nth-child(3) .name | 选第三个歌手 | 选第三个歌手 | P | |
38 | click | linkText=首页 | 点击首页 | 点击首页 | P | |
39 | click | css=.mv-box .more | 点击精选视频的更多 | 点击精选视频的更多 | P | |
40 | click | linkText=首页 | 点击首页 | 点击首页 | P | |
41 | click | linkText=歌单 | 点导航栏歌单 | 点导航栏歌单 | P | |
42 | click | linkText=歌手 | 点导航栏歌手 | 点导航栏歌手 | P | |
43 | click | linkText=VIP | 点导航栏VIP | 点导航栏VIP | P | |
44 | click | linkText=客户端 | 点击 导航栏客户端 | 点击 导航栏客户端 | P | |
45 | click | linkText=音乐人入驻 | 点击导航栏音乐人入驻 | 点击导航栏音乐人入驻 | P | |
46 | click | css=.el-dropdown-selfdefine .el-image__inner | 点击头像 | 点击头像 | P | |
47 | click | linkText=编辑资料 | 点击编辑资料 | 点击编辑资料 | P | |
48 | click | css=.el-button--default > span | 点击上传头像 | 点击上传头像 | P | |
49 | click | css=.el-form-item__content > .el-input > .el-input__inner | 点击昵称栏 | 点击昵称栏 | P | |
50 | type | RQL | css=.el-form-item__content > .el-input > .el-input__inner | 修改昵称 | 修改昵称 | P |
51 | click | css=html | 点击简介栏 | 点击简介栏 | P | |
52 | type | 这是rql的简介 | css=.el-textarea__inner | 修改简介 | 修改简介 | P |
53 | click | css=.el-button--primary > span | 点击保存 | 点击保存 | P | |
54 | click | id=tab-2 | 点击我的收藏的专辑 | 点击我的收藏的专辑 | P | |
55 | click | id=tab-3 | 点击我的收藏的歌单 | 点击我的收藏的歌单 | P | |
56 | click | id=tab-4 | 点击我的收藏的视频 | 点击我的收藏的视频 | P |
5)测试代码
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
public class Example {
public static void test(WebDriver driver) throws InterruptedException{
// 打开千千音乐
driver.get("https://music.91q.com/");
driver.manage().window().setSize(new Dimension(1296, 680));
Thread.sleep(3000);
// 登录
driver.findElement(By.cssSelector(".login-no > span:nth-child(1)")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".login-by-password")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".is-error .el-input__inner")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".is-error .el-input__inner")).sendKeys("账号");
Thread.sleep(3000);
driver.findElement(By.cssSelector(".el-form-item:nth-child(2) .el-input__inner")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".el-form-item:nth-child(2) .el-input__inner")).sendKeys("密码");
Thread.sleep(3000);
driver.findElement(By.cssSelector(".el-button")).click();
Thread.sleep(10000);
// 点击"歌单"
driver.findElement(By.linkText("歌单")).click();
Thread.sleep(3000);
// 选择"电子"
driver.findElement(By.cssSelector(".filter-group:nth-child(2) .filter-data-box > li:nth-child(4) > .item")).click();
Thread.sleep(3000);
// 选择并查看第一行第二位的音乐
driver.findElement(By.cssSelector(".tracklist-item:nth-child(2) > .name")).click();
Thread.sleep(3000);
// 收藏音乐
driver.findElement(By.cssSelector(".el-button--info:nth-child(2)")).click();
Thread.sleep(5000);
// 选择"准明星"歌曲
driver.findElement(By.linkText("准明星")).click();
Thread.sleep(3000);
// 右上角搜索周杰伦
driver.findElement(By.cssSelector(".el-input__inner")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".el-input__inner")).sendKeys("周杰伦");
Thread.sleep(3000);
driver.findElement(By.cssSelector(".el-input__icon")).click();
Thread.sleep(3000);
// 点击并查看"专辑"
driver.findElement(By.id("tab-3")).click();
Thread.sleep(3000);
// 点击专辑中的"广西女孩"
driver.findElement(By.cssSelector(".list-item:nth-child(2) .name")).click();
Thread.sleep(3000);
// 点击并查看"歌手"页面
driver.findElement(By.linkText("歌手")).click();
Thread.sleep(3000);
// 点击导航栏分项中的T标签
driver.findElement(By.cssSelector(".fl:nth-child(21)")).click();
Thread.sleep(3000);
// 点击导航栏分项中的欧美标签
driver.findElement(By.cssSelector(".filter-group:nth-child(2) > .fl:nth-child(4) > .item")).click();
Thread.sleep(3000);
// 点击导航栏分项中的女标签
driver.findElement(By.cssSelector(".filter-group:nth-child(3) > .fl:nth-child(3) > .item")).click();
Thread.sleep(3000);
// 点击分类结果中的歌手"唐伯虎"
driver.findElement(By.cssSelector(".el-col:nth-child(12) .el-image__inner")).click();
Thread.sleep(3000);
// 点击音乐"醉美酒城"
driver.findElement(By.linkText("醉美酒城")).click();
Thread.sleep(3000);
// 点击更多和分项
driver.findElement(By.linkText("首页")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".songlist-box:nth-child(3) .more")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".list-item:nth-child(2) .name")).click();
Thread.sleep(3000);
driver.findElement(By.linkText("首页")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".songlist-box:nth-child(4) .more")).click();
Thread.sleep(3000);
driver.findElement(By.linkText("首页")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".shoufa-box-inside .more")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".list-item:nth-child(5) .name")).click();
Thread.sleep(3000);
driver.findElement(By.linkText("首页")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".shoufa-box-inside .more")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".list-item:nth-child(6) .name")).click();
Thread.sleep(3000);
driver.findElement(By.linkText("首页")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".artist-box-inside .more")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".el-col:nth-child(3) .name")).click();
Thread.sleep(3000);
driver.findElement(By.linkText("首页")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".mv-box .more")).click();
Thread.sleep(3000);
// 其余导航栏项目
driver.findElement(By.linkText("首页")).click();
Thread.sleep(3000);
driver.findElement(By.linkText("歌单")).click();
Thread.sleep(3000);
{
WebElement element = driver.findElement(By.linkText("歌单"));
Actions builder = new Actions(driver);
builder.moveToElement(element).perform();
}
driver.findElement(By.linkText("歌手")).click();
Thread.sleep(3000);
driver.findElement(By.linkText("VIP")).click();
Thread.sleep(3000);
driver.findElement(By.linkText("客户端")).click();
Thread.sleep(3000);
driver.findElement(By.linkText("音乐人入驻")).click();
Thread.sleep(3000);
// 个人信息修改
driver.findElement(By.cssSelector(".el-dropdown-selfdefine .el-image__inner")).click();
Thread.sleep(3000);
driver.findElement(By.linkText("编辑资料")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".el-button--default > span")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".el-form-item__content > .el-input > .el-input__inner")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".el-form-item__content > .el-input > .el-input__inner")).clear();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".el-form-item__content > .el-input > .el-input__inner")).sendKeys("RQL");
Thread.sleep(3000);
driver.findElement(By.cssSelector("html")).click();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".el-textarea__inner")).clear();
Thread.sleep(3000);
driver.findElement(By.cssSelector(".el-textarea__inner")).sendKeys("这是rql的简介");
Thread.sleep(3000);
driver.findElement(By.cssSelector(".el-button--primary > span")).click();
Thread.sleep(3000);
// 个人收藏查看
driver.findElement(By.id("tab-2")).click();
Thread.sleep(3000);
driver.findElement(By.id("tab-3")).click();
Thread.sleep(3000);
driver.findElement(By.id("tab-4")).click();
Thread.sleep(3000);
}
public static void main(String[] args) {
WebDriver driver = new ChromeDriver();
try { test(driver); }
catch(Exception e) { e.printStackTrace(); }
finally { driver.quit(); }
}
}
2.性能测试用例设计
1)用例名称
用例名称 | 千千音乐性能负载测试 |
功能 | 系统支持多个用户并发登录 |
目的 | 测试多用户登录时系统的处理能力 |
方法 | 模拟多个用户在不同客户端登录,然后并发进入系统,录制登录过程 |
2)前置条件
安装BadBoy,并下载配置慕测Jmeter客户端。
3)测试步骤
1、打开BadBoy,在URL栏中输入https://music.91q.com/search,访问千千音乐搜索页面;
2、录制一次搜索流程;
3、点击BadBoy的File选项导出脚本为qianqian.jmx文件;
4、启动Jmeter,导入qianqian.jmx文件;
5、修改线程组名为“qianqianmusic”;
6、添加事务控制器“搜索事务”,并调整位置;
7、给搜索页面添加定时器Synchronizing Timer,模拟50个用户组;
8、新建一个“searchTest.csv”文件,里面填写需要搜索的内容;
9、给线程组添加CSV数据文件设置,并设置相关参数如下图所示;
10、在搜索界面的HTTP请求中设置发送参数,把搜索内容的csv填充到word参数中;
11、修改线程组的线程数;
12、为使负载压力测试结果更加直观,添加聚合报告、图形结果、结果树、用表格查看结果等监视器;
13、运行。
五、测试结果的分析
1.功能测试用例
1)慕测得分
2)结果分析
功能测试在需求测试文档的基础上,补充了一些额外设计的测试用例,如:用户账号密码登录、首页中各分项模块的“更多”查看、导航栏其余项目查看、个人信息修改、我的收藏查看。一定基础上完善了对整个千千音乐网站测试的用例设计,经测试,所有功能正常并且测试通过。
2.性能测试用例
1)结果截图
2)结果分析
性能测试最终按照性能测试文档完成,线程数50~100,启动时间在5~10秒内完成,控制了事务并发,在确保所有请求都成功的情况下,完成性能测试,性能良好。
六、测试文档的撰写
1.测试计划
此次测试的目的就是检查核心模块功能是否正常,验证系统性能是否满足应用需求。这次测试的具体内容如下:
(1)功能测试
在功能测试中,重点测试的是千千音乐的使用流程。在包含测试文档要求的功能基础上,额外测试了如下功能:用户账号密码登录、收藏音乐、首页中各分项模块的“更多”查看、导航栏其余项目查看、个人信息修改、我的收藏查看。
(2)性能测试
在性能测试中,需要测试不同负载下系统的表现,并获得系统的响应能力、负载能力、吞吐量和资源利用率等性能指标。
(3)测试工具
用途 | 工具 | 生产厂商 | 版本 |
功能测试 | Selenium IDE 插件 | ThoughtWorks | 3.17.2 |
Eclipse | IBM | Oxygen.3a Release (4.7.3a) | |
Google Chrome | Google Inc. | 114.0.5735.110 | |
性能测试 | BadBoy | Badboy Software | 2.2.5 |
Jmeter | Apache | 5.5 |
(4)测试策略
登录模块测试策略
测试策略项 | 登录模块测试 |
测试类型 | 功能测试 |
测试技术 | Eclipse自动化测试 |
测试通过/失败标准 | 浏览器上正确显示操作步骤,实现功能 |
特殊考虑 | 测试用例执行时间;提前注册用户账号密码 |
歌单筛选模块测试策略
测试策略项 | 歌单筛选模块测试 |
测试类型 | 功能测试 |
测试技术 | Eclipse自动化测试 |
测试通过/失败标准 | 浏览器上正确显示操作步骤,实现功能 |
特殊考虑 | 测试用例执行时间;登录后收藏歌单功能 |
搜索模块测试策略
测试策略项 | 搜索模块测试 |
测试类型 | 功能测试 |
测试技术 | Eclipse自动化测试 |
测试通过/失败标准 | 浏览器上正确显示操作步骤,实现功能 |
特殊考虑 | 测试用例执行时间 |
歌手标签筛选模块测试策略
测试策略项 | 歌手标签筛选模块测试 |
测试类型 | 功能测试 |
测试技术 | Eclipse自动化测试 |
测试通过/失败标准 | 浏览器上正确显示操作步骤,实现功能 |
特殊考虑 | 测试用例执行时间 |
更多分项模块测试策略
测试策略项 | 更多分项模块测试 |
测试类型 | 功能测试 |
测试技术 | Eclipse自动化测试 |
测试通过/失败标准 | 浏览器上正确显示操作步骤,实现功能 |
特殊考虑 | 测试用例执行时间 |
导航栏模块测试策略
测试策略项 | 导航栏模块测试 |
测试类型 | 功能测试 |
测试技术 | Eclipse自动化测试 |
测试通过/失败标准 | 浏览器上正确显示操作步骤,实现功能 |
特殊考虑 | 测试用例执行时间 |
个人信息模块测试策略
测试策略项 | 个人信息模块测试 |
测试类型 | 功能测试 |
测试技术 | Eclipse自动化测试 |
测试通过/失败标准 | 浏览器上正确显示操作步骤,实现功能 |
特殊考虑 | 测试用例执行时间;个人信息修改时需对要修改的原有信息清空;我的收藏查看 |
查询模块并发性能测试
测试策略项 | 查询模块并发性能测试 |
测试类型 | 性能测试 |
测试技术 | JMeter 压力测试 |
测试通过/失败标准 | 网络运行稳定,所有请求有回应,所有线程均正常运行 |
特殊考虑 | 系统的响应能力、负载能力、吞吐量和资源利用率 |
2. 测试分析
(1)功能测试
功能测试在需求测试文档的基础上,补充了一些额外设计的测试用例,如:用户账号密码登录、首页中各分项模块的“更多”查看、导航栏其余项目查看、个人信息修改、我的收藏查看。一定基础上完善了对整个千千音乐网站测试的用例设计,经测试,所有功能正常并且测试通过。
(2)性能测试
性能测试的主要关注点为:时间(系统处理用户请求的响应时间)和资源(系统运行过程中系统资源的消耗情况);目的为:评估当前系统能力;要求为:每次50人,准备时长10s,运行良好。
性能测试最终按照性能测试文档完成,线程数50~100,启动时间在5~10秒内完成,控制了事务并发,在确保所有请求都成功的情况下,完成性能测试,性能良好。
七、心得与体会
本次实验旨在对Web网站进行功能测试和性能测试。它将实验4和实验5测试localhost本机挂载服务,转移到了测试公网ip上的千千音乐网站,是对前两次实验的巩固和加强。
对于功能测试,实验4只是使用Selenium进行脚本录制并进行播放测试查看是否错误,而此次功能测试则更加侧重于录制完脚本后的系统自动化Eclipse测试,故需要将其转换为代码进行测试。按照需求文档,录制脚本后导出的测试代码只能达到Mooctest的28分,因此我又自己额外设计了一些功能测试用例,如:用户账号密码登录、首页中各分项模块的“更多”查看、导航栏其余项目查看、个人信息修改、我的收藏查看,将测试分数提升到52分。后续我也思考了是否可以通过增加断言、异常等插入进行测试,如Assert、Verify等,增强测试用例的健壮性。对于性能测试,实验5仅是Jmeter进行本地测试,而此次性能测试迁移到了公网后。此处利用创建.csv文件存储搜索内容,将文件中的数据作为搜索传入的参数。
整个实验完成下来,我巩固掌握了Selenium IDE自动化功能测试工具,了解了它的测试模式和过程、录制测试脚本、执行并分析测试脚本,学会如何使用Eclipse进行自动化脚本测试。另外熟悉巩固了使用BadBoy录制Jmeter的测试脚本,使用Jmeter 修改脚本、添加事务、集结点等,进行负载测试。