目录
一、软件项目介绍........................................................... 1
二、测试计划............................................................... 1
三、测试用例............................................................... 2
(一) 黑盒测试......................................................... 2
(二) 白盒测试......................................................... 9
(三) 性能测试........................................................ 13
四、过程记录.............................................................. 15
(一) 缺陷报告........................................................ 15
(二) 功能报告........................................................ 17
(三) 性能报告........................................................ 19
五、测试总结报告.......................................................... 25
一、软件项目介绍
读书对于我们每个大 读者来说都不陌生,现如今大学阶段的阅读很多时候都离不开网上阅读,在不同的时期,在只能居家的那段时间, 起点读书网为我们提供了一个良好的阅读平台和 有着丰富的资源。起点读书网是基于微服务架构打造的阅读平台,知识传播与管理分享平台。它利 用起点 20 余年来积累的海量图书、期刊、报纸、专题创 作,办公应用为一体,为读者提供一站式阅读环境。
除了这些,起点读书网还有很多功能,如创建图书,评论区评论,点赞等,丰富的功能点让我们各类人群对它爱不释手。为此,我选择 web 端起点读书网作为我此次软件测试的被测软件。
1、测试目标
本测试的目标主要是测试起点读书网,测试各项功能可靠实现,在系统的安全性方面和 性能方面满足用于的需求等。
2、测试需求和范围
测试的需求来自于需求规格说明文档即是功能规格说明书,功能性测试需求以及性能测试 需求是我在本次的测试中最主要的。
测试的范围包括了文档和 web 软件系统, 如文档有起点读书网数据库设计说明书、详细 设计说明书等; 软件各功能模块,重点需要测试的是登录模块、考试模块以及 模块。 3、测试风险
在我们安装的 LoadRunner 中,最多只能模拟 50 个用户访问系统,对于上百上千人同时访 问系统的情况不能得出结论,只能在系统正式投入供用户使用之后, 才能发现问题,然后进行 完善。
4、测试策略
制定测试整体策略、所使用的测试技术和方法。本系统采用的策略是:黑盒法-- 白盒法--黑盒 法的循环过程。对逻辑结构复杂的模块采用白盒法;对于以输入、输出为主的模块,采用黑盒法测 试以提高测试效率。鉴于本系统测试为基于 web 的系统测试, 所以需额外测试系统在不同 Windows 操作系统下的浏览器端的显示是否正常以及进行安全性和可用性测试。因此在功能测 试中需添加 Cookies 测试;性能测试中添加浏览速度测试以及安全性测试。
5、测试阶段划分:划分合理的测试阶段, 并定义每个阶段的金福要求及完成的标准。
6 、项目资源:各个测试阶段的资源分配。
7、日程:确定各个测试阶段的结束日期以及最后测试报告的递交日期。
8、跟踪和控制机制: 问题跟踪报告、变更控制、缺陷预防和质量管理等
1、等价类划分
等价类划分法是将程序的输入域划分成若干个不相交的子集, 然后从每个独立子集 中选择部分有代表性的输入数据作为测试用例。在具体操作时,首先构造等价类表,并 赋予每个等价类一个唯一的编号。然后设计测试用例以覆盖尽可能多的等价类,直至包 含了系统中所有的等价类。最后设计覆盖无效等价类的测试用例, 直至包含了系统中的 所有无效等价类。
(1)注册模块
对注册模块的三个要素要求划分等价类,确定有效等效类和无效等价类,为每个等价类规 定一个唯一的编号。
表 1-1 注册进行等价类划分
输入数据 | 有效等价类 | 无效等价类 |
用户名 | ①有效用户名 ②未注册 | ③无效用户名 ④已注册 |
密码 | ①密码长度 8~16 位 ②密码由字母、数字、符号两 种及以上的组合 | ③密码长度小于 8 ④密码长度大于 16 ⑤密码只包含了字母 ⑥密码只包含了数字 |
验证码 | ①正确验证码 | ②点击过【获取验证码】,但 输入的验证码不正确 ③未点击过【获取验证码】, 输入了验证码 |
表 1-2 注册模块测试用例
用 例 编 号 | 输入 | 预期结果 | |||||
用户名 | 覆盖等 价类 | 密码 | 覆盖等 价类 | 验证码 | 覆盖等 价类 | ||
1 | 15502266503 | ①② | Awdadwa165 | ①② | 正确验证码 | ① | 注册成功 |
2 | 18599106892 | ④ | Awda255 | ①② | 正确验证码 | ① | 注册失败 |
3 | 88812345 | ③ | Awda62. | ①② | 正确验证码 | ① | 注册失败 |
4 | 15502266503 | ①② | Ljj0327 | ③ | 正确验证码 | ① | 注册失败 |
5 | 15502266503 | ①② | Akjkawd21 | ④ | 正确验证码 | ① | 注册失败 |
6 | 15502266503 | ①② | …… .. | ⑦ | 正确验证码 | ① | 注册失败 |
7 | 15502266503 | ①② | ljj0327. | ①② | 点击过【获取验证码】, | ② | 注册失败 |
(2)登录模块
对登录模块要求划分等价类,确定有效等效类和无效等价类,为每个等价类规定一个唯一 的编号。
表 1-3 登录进行等价类划分
输入数据 | 有效等价类 | 无效等价类 |
用户名 | ①有效用户名 ②已注册 | ③无效用户名 ④未注册 |
密码 | ①正确密码 | ②错误密码 |
2、边界值分析法
对用户注册进行边界值分析,确定边界,为每个输入属性规定序号,并写出相应的测试用 例。
表 1-5 用例设计
输入类型 | 序号 | 输入属性 |
密码 | 8 个字符以上 16 个字符以下 | |
左边界(8 个字符) | ||
1 | 1234567 | |
2 | 123456b8 | |
3 | 1234a6b89 | |
右边界(16 个字符) | ||
4 | 12345a789012345 | |
5 | 12345612aaaa1234 | |
6 | 12345612aaaa1234a |
表 1-6 测试用例
用例编号 | 用例标题 | 项目/模块 | 前置条件 | 测试步骤 | 测试数据 | 预期结果 |
1 | 合法(7 个字符) | 注册 | 打开注册页 面 | 1、输入用户名、 密码、验证码 2、点击注册 | 用例设计 1 | 不合法 |
2 | 合法(8 个字符) | 注册 | 打开注册页 面 | 1、输入用户名、 密码、验证码 2、点击注册 | 用例设计 2 | 合法 |
3 | 合法(9 个字符) | 注册 | 打开注册页 面 | 1、输入用户名、 密码、验证码 2、点击注册 | 用例设计 3 | 合法 |
4 | 合法(15 个字符) | 注册 | 打开注册页 面 | 1、输入用户名、 密码、验证码 2、点击注册 | 用例设计 4 | 合法 |
5 | 合法(16 个字符) | 注册 | 打开注册页 面 | 1、输入用户名、 密码、验证码 2、点击注册 | 用例设计 5 | 合法 |
6 | 合法(17 个字符) | 注册 | 打开注册页 面 | 1、输入用户名、 密码、验证码 2、点击注册 | 用例设计 6 | 不合法 |
3、全面测试
全面测试需要对所有输入的各个取值之间的各种组合情形进行相应的测试, 测试用例多, 拍错率低,这个系统主要是人工测试为主的软件测试,全面测试的可行性会大打折扣,因此在 本测试中不采用全面测试。
4、单因素覆盖
(1)注册模块
注 册 模 块 需 要 接 收 三 个 输 入 值 — — 手 机 号 、 密 码 、 验 证 码 , 用 户 名 从 集 合 {15502266503,10999,1 }中取值,密码从{ ljjyuiop,YYYNNNLL,null} 中取值,验证码从{正确验证码, 点击过【获取验证码】但输入的验证码不正确,未点击过【获取 验证码】输入了验证码,null}中取值, 则测试用例集的规模为 5。
表 1-7 用例测试表
Hbase 点查询
QueryByCondition1(String tableName,String rowkey)
已知一个 ROWKEY,查询结果
测试结果:
毫秒级
Hbase 范围查询
queryRange(String tableName,byte[] startrow,String msisdn)
测试参数
参数
备注
Test
表名
hadoop21,hadoop22,hadoop31,hadoop32,hado
op41,hadoop42,hadoop51,hadoop52,hadoop6
Hbase 数据库连接
15835103286
手机号码
20170910000000
日期时间(YYYYMMDDHH24MISS)
查询该手机号码在某日期时间前发生的记录
5、正交试验设计法
注册功能共有两个因子,但各个因子的水平数是不同的,“A:用户名”有 2 个水平(A1: 15502266503,A2:10999,A3:18599106892,A4:null),“B:密码”有 4 个水平(B1: ljj0327. , B2 :12345678 ,B3 :ljjyuiop ,B4 :YYYNNNLL ,B5 :null),“C:验证码”有 2 个水平(C1:正确 验证码, C2 :点击过【获取验证码】但输入的验证码不正确,C3:未点击过【获取验证码】输 入了验证码,C4 :null)。
将各注册项抽象表示,如表 1-9;
表 1-9 注册功能因子/水平的抽象表示
水平 | 因子 | A | B | C |
1 | A1 | B1 | C1 | |
2 | A2 | B2 | C2 | |
3 | A3 | B3 | C3 | |
4 | A4 | B4 | C4 | |
5 | B5 |
表 1-10 注册功能的正交表
水平 | 因子 | A | B | C |
1 | A1 | B1 | C1 | |
2 | A1 | B2 | C2 | |
3 | A1 | B3 | C3 | |
4 | A1 | B4 | C4 | |
5 | A1 | B5 | — |
6、两两组合
注册功能接受 3 个输入值x1,x2,x3,
x1 可取值为 a1 :15502266503 、a2 :10999 、a3 :18599106892 、a4 :null,
x2 可取值为 b1 :ljj0327. 、b2 :12345678 、b3 :ljjyuiop 、b4 :YYYNNNLL 、b5 :null,
x3 可取值为 c1:正确验证码、 c2 :点击过【获取验证码】但输入的验证码不正确、c3:未点击 过【获取验证码】输入了验证码、c4 :null,
x1 、x2 、x3 所有取值的两两组合为:
(a1,b1),(a1,b2),(a1,b3),(a1,b4),(a1,b5),(a2,b1),(a2,b2),(a2,b3),(a2 , b4),(a2 ,b5),(a3 ,b1),(a3 ,b2),(a3 ,b3),(a3 ,b4),(a3 ,b5),(a4 ,b1),(a4 ,b2) (a4 ,b3),(a4 ,b4),(a4 ,b5)
表 1-11 满足两两组合覆盖标准的测试用例集合
测试用例序号 | x1 | x2 | x3 |
1 | a1 | b1 | c1 |
2 | a1 | b2 | c2 |
3 | a1 | b3 | c3 |
4 | a1 | b4 | c4 |
7、因果图法
对注册功能进行因果图分析:
输入条件(原因):
①注册按钮
②电话号码(非空、未注册、有效用户名)
③密码(非空、 8~16 位、由大小写字母、数字、符号三种以上组合)
④验证码(非空、正确验证码)
⑤用户名(为空、已注册、无效用户名)
⑥密码(为空、小于 8 位、大于 16 位、只包含了大写字母、只包含了小写字母、只包含了
数字、只包含了符号)
⑦验证码(为空、点击过【获取验证码】但输入的验证码不正确、未点击过【获取验证码】
输入了验证码)
输出(结果)为:
a.注册成功
b.注册失败
1 | 2 | 3 | 4 | ||
输 入 | ①注册按钮 | 1 | |||
②用户名(非空、未注册、有效用户名) | 1 | ||||
③密码(非空、 8~16 位、字母、数字、符号三种以上组合) | 1 | ||||
④验证码(非空、正确验证码) | 1 | ||||
⑤用户名(为空、已注册、无效用户名) | 1 | ||||
⑥密码(为空、小于 8 位、大于 16 位、只包含了字母、只包含了数字、只 包含了符号) | 1 | ||||
⑦验证码(为空、点击过【获取验证码】但输入的验证码不正确、未点击 过【获取验证码】输入了验证码) | 1 | ||||
输 出 | a.注册成功 | 1 | |||
b.注册失败, 返回重新注册 | 1 | 1 | 1 |
图 1-2 判定表
测试过程 :
1. 导入数据
通过如下命令依次导入 7 个文件
load data local inpath '/root/Downloads/sqllder100w.dat' into table test;
2. 聚集方法测试
INSERT OVERWRITE TABLE test_group1 select F2,COUNT(*) from test GROUP BY F2;
MapReduce 费时 174.473 seconds
结束后:test_group1 为 100 万行记录
3. 排序测试
INSERT OVERWRITE TABLE test_group2
select F2,RESULT from (
select F2,COUNT(*) AS RESULT from test GROUP BY F2 cluster by F2
) t sort by F2;
MapReduce 两阶段执行,费时 210.968 seconds
4. 外连接测试
做 count,avg 聚集函数,左连接。其中表 TEST_GROUP1 有 100 万行,表 TEST 有 700
万行。
INSERT OVERWRITE TABLE test_group select F2,COUNT(*),avg(f3) from test LEFT
OUTER JOIN TEST_GROUP1 ON (test.f2=test_group1.name) GROUP BY F2;
MapReduce 两阶段执行,费时 180.489 seconds
表 1-12 注册测试用例
编号 | 用例说明 | 预期结果 |
1 | ①注册按钮 ②用户名(非空、未注册、有效用户名) ③密码(非空、8~16 位、由字母、数字、符号两种 | 注册成功 |
及以上组合) ④验证码(非空、正确验证码) | ||
2 | ⑤用户名(为空、已注册、无效用户名) | 注册失败 |
3 | ⑥密码(为空、小于 8 位、大于 16 位、只包含了 小写字母、只包含了数字、只包含了符号) | 注册失败 |
4 | ⑦验证码(为空、点击过【获取验证码】但输入的 验证码不正确、未点击过【获取验证码】输入了验 证码) | 注册失败 |
8、决策表法
表 1-13 初始化的决策表
条件及动作 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | |
条 件 | 有效用户名 | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y |
手机已注册 | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N | N | N | N | N | N | |
密码由字母、数字、 符号两种及以上组合 | Y | Y | Y | Y | N | N | N | N | Y | Y | Y | Y | N | N | N | N | |
密码 8~16 位 | Y | Y | N | N | Y | Y | N | N | Y | Y | N | N | Y | N | N | N | |
验证码 | Y | N | Y | N | Y | N | Y | N | Y | N | Y | N | Y | N | Y | Y | |
动 作 | 注册成功 | √ | |||||||||||||||
注册失败 | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
续表
条件及动作 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | |
条 件 | 有效用户名 | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N |
手机已注册 | Y | Y | Y | Y | Y | Y | Y | Y | N | N | N | N | N | N | N | N | |
密码由字母、 数字、符号两 种及以上组合 | Y | Y | Y | Y | N | N | N | N | Y | Y | Y | Y | N | N | N | N | |
密码 8~16 位 | Y | Y | N | N | Y | Y | N | N | Y | Y | N | N | Y | N | Y | N | |
验证码 | Y | N | Y | N | Y | N | Y | N | Y | N | Y | N | Y | Y | N | N | |
动 作 | 注册成功 | ||||||||||||||||
注册失败 | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
表 1-14 简化后的决策表
条件及动作 | 1 | 2 | 3 | 5 | 9 | 17 | |
条件 | 有效用户名 | Y | Y | Y | Y | Y | N |
手机已注册 | Y | Y | Y | Y | N | -- | |
密码 8~16 位 | Y | Y | Y | N | -- | -- | |
密码由字母、数字、符号两种及以上组合 | Y | Y | -- | -- | -- | -- | |
验证码 | Y | N | -- | -- | -- | -- | |
动作 | 注册成功 | √ | |||||
注册失败 | √ | √ | √ | √ | √ |
(二)白盒测试
1、注册登录业务
6.1 软件质量总体评估
6.2 软件能力评估
1 功能性
该小说管理系统正确实现了对小说信息、阅读信息、小说种类信息和小说信息的录入和删除功能,对录入的小说信息进行多种排列方式,例如按种类排列、按价格排列、按销量排列等,能从不同角度查看小说的信息,实现了友好的用户界面。利用图表形象而直观的实现了对小说信息、阅读信息、小说种类信息和小说信息的管理操作,并提供了小说和视图的打印功能,可以将小说和视图信息打印出来更为直观的方便用户查看和店员修改和删除。同时该系统针对用户和商家做了权限处理,用户仅能看到小说的部分信息,而商家可以看到全部信息,增加了数据的安全性。
2 易用性
现有系统实现了如下易用性:查询,添加,删除,修改操作相关提示信息的一致性,可理解性 。
3 可靠性
现有系统的可靠性较高。无论从文件系统的可靠性和JAVA程序的可靠性考虑,都有较高的可靠性。该系统独有的文件系统,使得其他软件或系统不能读取其中的数据,因此该系统的可靠性比较高。
4 兼容性
现有系统支持window下的JAVA环境运行,兼容性良好。 现有系统未进行其他兼容性测试。
5 安全性
由于软件由JAVA语言编写,继承了JAVA语言的安全性
②语句覆盖
用例编号 | 测试用例 | 覆盖语句 | 预期结果 |
1 | 账号存在、密码正确 | ②③⑧ | 登录成功并返回主页 |
2 | 账号不存在、注册成功 | ②③⑤ | 注册成功 |
③判定覆盖
用例编号 | 测试用例 | 覆盖路径 | 预期结果 |
1 | 账号存在、密码正确 | ②③④⑦⑧ | 登录成功并返回主页 |
2 | 账号存在、密码错误 | ②③④⑦③ | 登录失败 |
3 | 账号不存在、注册失败 | ②③④⑤⑥⑤ | 注册失败 |
4 | 账号不存在、注册成功 | ②③④⑤⑥ | 注册成功 |
③条件覆盖
用例编号 | 测试用例 | 覆盖路径 | 预期结果 |
1 | 账号存在、密码正确 | ②③④⑦⑧ | 登录成功并返回主页 |
2 | 账号存在、密码错误 | ②③④⑦③ | 登录失败 |
3 | 账号不存在、注册失败 | ②③④⑤⑥⑤ | 注册失败 |
4 | 账号不存在、注册成功 | ②③④⑤⑥ | 注册成功 |
⑤条件组合覆盖
用例编号 | 测试用例 | 覆盖路径 | 预期结果 |
1 | 账号存在、密码正确 | ②③④⑦⑧ | 登录成功并返回主页 |
2 | 账号存在、密码错误 | ②③④⑦③ | 登录失败 |
3 | 账号不存在、注册失败 | ②③④⑤⑥⑤ | 注册失败 |
4 | 账号不存在、注册成功 | ②③④⑤⑥ | 注册成功 |
⑥基本路径覆盖
用例编号 | 测试用例 | 覆盖路径 | 预期结果 |
1 | 账号存在、密码正确 | ②③④⑥⑦ | 登录成功并返回主页 |
2 | 账号存在、密码错误 | ②③④⑥③ | 登录失败 |
3 | 账号不存在、注册失败 | ②③④①⑤① | 注册失败 |
4 | 账号不存在、注册成功 | ②③④①⑤③ | 注册成功 |
2、参与课程业务
图 1-4 参与课程业务流程图
②语句覆盖
用例编号 | 测试用例 | 覆盖语句 | 预期结果 |
1 | 已登录、取消放弃 | ②③④⑤⑧⑨⑩ ○13 | 参加成功且未取消课程 |
2 | 未登录 | ②③④⑤⑦ | 未登录、参加失败 |
3 | 已登录、放弃学习 | ②③④⑤⑧⑨⑩ ○12 | 参加成功且取消课程 |
③判定覆盖
用例编号 | 测试用例 | 覆盖路径 | 预期结果 |
1 | 已登录、取消放弃 | ①②③④⑤⑥⑧⑨⑩ ○11○13○14 | 参加成功且未取消课程 |
2 | 未登录 | ①②③④⑤⑦④ | 未登录、参加失败 |
3 | 已登录、放弃学习 | ①②③④⑤⑥⑧⑨⑩ ○11○12○14 | 参加成功且取消课程 |
④条件覆盖
用例编号 | 测试用例 | 覆盖路径 | 预期结果 |
1 | 已登录、取消放弃 | ①②③④⑤⑥⑧⑨⑩ ○11○13○14 | 参加成功且未取消课程 |
2 | 未登录 | ①②③④⑤⑦④ | 未登录、参加失败 |
3 | 已登录、放弃学习 | ①②③④⑤⑥⑧⑨⑩ ○11○12○14 | 参加成功且取消课程 |
⑤判定-条件覆盖
用例编号 | 测试用例 | 覆盖路径 | 预期结果 |
1 | 已登录、取消放弃 | ①②③④⑤⑥⑧⑨⑩ ○11○13○14 | 参加成功且未取消课程 |
2 | 未登录 | ①②③④⑤⑦④ | 未登录、参加失败 |
3 | 已登录、放弃学习 | ①②③④⑤⑥⑧⑨⑩ ○11○12○14 | 参加成功且取消课程 |
⑥基本路径测试
用例编号 | 测试用例 | 覆盖路径 | 预期结果 |
1 | 已登录、取消放弃 | ①②③④⑤⑥⑧⑨⑩ ○11○13○14 | 参加成功且未取消课程 |
2 | 未登录 | ①②③④⑤⑦④ | 未登录、参加失败 |
3 | 已登录、放弃学习 | ①②③④⑤⑥⑧⑨⑩ ○11○12○14 | 参加成功且取消课程 |
3、创建课程业务
①流程图
②语句覆盖
用例编号 | 测试用例 | 覆盖语句 | 预期结果 |
1 | 不创建课程 | ②③④⑤⑥⑦ | 创建课程失败 |
2 | 创建课程 | ②③④⑤⑥⑦⑧ | 创建课程成功 |
③判定覆盖
用例编号 | 测试用例 | 覆盖路径 | 预期结果 |
1 | 不创建课程 | ①②③④⑤⑥⑦⑧③ | 创建课程失败 |
2 | 创建课程 | ①②③④⑤⑥⑦⑧⑨⑩ | 创建课程成功 |
(三)性能测试
性能测试的定义为: 在一定的负载情况下,系统的响应时间等特性是否满足特定的性能需 求, 对于基于网络架构(如 C/S 架构或 B/S 架构) 的系统, 当众多终端用户对系统进行访问时, 用户越多, 那么服务器需要处理的客户请求也越多,从而形成负载。
1、制定性能测试目标
系统需要满足 50 个用户同时登录、然后同时在线(因LoadRunner 免费的人数上限是 50 人)、 20 个用户并发操作加入同一个课程的情况下, 加入课程响应时间不超过 2s。
2、选择性能测试工具
本次对性能测试采用的是 LoadRunner,此软件是一种适用于许多软件体系架构的自动负载 测试工具,从用户关注的响应时间、吞吐量,并发用户和性能计数器等方面来衡量系统的性能 表现,辅助用户进行系统性能的优化。 LoadRunner 主要是通过虚拟用户发生器、 监控中心、 压力调度、 结果分析工具及压力生成器构成, 虚拟用户发生器指的是集成开发环境, 但是监 控中心属于架空及框架程序, 其主要目的就是将虚拟用户器中的脚本通过多线程的方式在压力
生成器中运行。结果分析工具属于数据分析工具, 其主要目的就是全面分析测试之后的结果。
3、脚本设计及运行场景(标注: 测试用例根据书 219 页所写)
慕课系统需要从登录、注册、搜索课程、显示课程信息、查询个人信息、查询参与的课程 等多个方面对系统进行测试。 测试之前首先要明确测试的方法路径、工具和需测试的功能。本 文使用 LoadRunner12.55 作为性能测试工具。
表 1-15 起点中文网登录模块的性能测试用例
测试用例名称 | 起点中文网登录模块的性能测试用例 |
测试用例标识 | xn-1 |
测试覆盖需求 (性能特性) | (1) 在登录场景下 50 个用户并发处理能力 (2) 登录响应时间不超过 2s |
功能简述 | 查看 50 个用户进行登录情况, 系统的并发处理能力,同时考察登录业务响应 时间是否符合响应时间要求 |
(前置/假设) 条件 | 应用服务器要求: 操作系统: Windows10 内存: 8GB |
用例描述 | 模拟 50 个用户在线使用系统的登录 |
操作步骤 | (1) 启动 LR 的 VuGen (2) 录制登录脚本, 加入事务、集合点、参数化账号、密码, 保存为 xn_login (3) 设置 Run-Time Settings 后启动 LR 的 Controller (7) 根据用例描述在 Controller 中建立场景 (5) 启动 LR 的 Analysis (6) 分析测试结果,验证相关指标是否达标, 记录相关结果, 提出修改意见 |
期望结果 | 支持 50 个用户在线操作,登录的响应时间不超过指定要求 |
四、过程记录
(一)缺陷报告
软件缺陷(Defect),常常又被叫做 Bug。所谓软件缺陷,即为计算机软件或程序中存在的 某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷。 缺陷的存在会导致软件产品在某 种程度上不能满足用户的需要。 IEEE729-1983 对缺陷有一个标准的定义:从产品内部看,缺 陷是软件产品开发或维护过程中存在的错误、毛病等各种问题;从产品外部看,缺陷是系统所 需要实现的某种功能的失效或违背。
1. 阅读卡顿
字段 | 描述 |
缺陷 ID | 1 |
缺陷标题 | 阅读卡顿 |
前置条件 | 良好的网络 |
环境 | Windows10 家庭版、谷歌浏览器 |
操作步骤 | 1. 端投票到电脑上,可以 阅读 2. 读者加入 间 |
期望结果 | 体验不卡顿,能够一直流畅,没有延迟 |
实际结果 | 卡顿并且有延迟 |
严重程度 | 1 级 |
优先级 | P3 |
缺陷类型 | 性能缺陷 |
缺陷状态 | 存在 |
缺陷提交人 | 姜伟 |
模块 | 模块 |
2. 经典名著时长记录不准确 | |
字段 | 描述 |
缺陷 ID | 4 |
缺陷标题 | 经典名著时长记录不准确 |
前置条件 | 在课程当中/已选该课程 |
环境 | Windows10 家庭版、谷歌浏览器 |
操作步骤 | 1. 打开课程 2. 点进知识点 3. 打开 经典名著 |
期望结果 | 时长记录准确无误 |
实际结果 | 时长记录有问题,记录的时长比体验 经典名著市场少 |
严重程度 | 1 级 |
优先级 | P2 |
缺陷类型 | 功能缺陷 |
缺陷状态 | 存在 |
缺陷提交人 | 姜伟 |
模块 | 经典名著模块 |
3. 网络不稳定导致的无法 | |
字段 | 描述 |
缺陷 ID | 5 |
缺陷标题 | 网络不稳定导致的无法 |
前置条件 | 在课程当中/已选该课程 |
环境 | Windows10 家庭版、谷歌浏览器 |
操作步骤 | 1. 端发布 2. 读者端接受到 消息 3. 读者 时网络不稳定 |
期望结果 | 不稳定时可以自动延迟 时间 |
实际结果 | 超过规定时间则不能再 |
严重程度 | 2 级 |
优先级 | P3 |
缺陷类型 | 性能缺陷 |
缺陷状态 | 存在 |
缺陷提交人 | 姜伟 |
模块 | 模块 |
缺陷描述:tomcat 日志有乱码,日志无项目名称,查看不方便
缺陷影响:其他项目日志都有项目名称,日志无项目名称,查看不方便
推迟原因:目前的日志为了调试方便,显示了很多其它信息,在项目正式发布时会统一
处理的。
4. 缺陷描述:取消政策管理要么,取消时间“天/小时”缺少单位补充字段
缺陷影响:该处因为是两个不同的单位时间,需要有另外一个单位补充字段补充所所填
写内容的单位
推迟原因:该缺陷单位补充字段本来存在,翻译不够准确,不能理解为补充单位的字段,
需要等翻译完毕后再确认。
5. 缺陷描述:数据字典种类修改,默认值设置后,在调用该数据字典种类的数据字典,默
认值无显示
缺陷影响:数据字典种类的默认值设置后,不能显示设置的默认值,相当于数据字典种
类默认值设置功能未实现
推迟原因:该功能暂时不好实现,需要和和系统的默认语种一起处理。
6. 缺陷描述:担保政策管理页面,“Edposit Due”缺少解释行输入描述信息
缺陷影响:缺少解释性输入描述信息,用户不理解应该输入什么内容
推迟原因:需求没有描述,需要解释性说明文字由项目经理整理后,在升级版本中添加
7. 缺陷描述:多媒体添加,文件上传功能未实现
缺陷影响:文件上传功能未实现
推迟原因:该功能暂时不好完成,在下个版本中完成
8. 缺陷描述:参照点添加权限和修改权限单独控制出现权限异常错误
缺陷影响:用户执行添加,修改时,出现权限异常,无法完成任务
推迟原因:B9 版本发现该权限,B10 版本未通过验证,目前该模块开发人员调休,无
法修改 bug。
测试过程
1.Oracle 与 Hbase 比较
用 Oracle 的 SQLLDR 导入
命令:sqlldr ntmserver/ntmserver@ORCL control=testinsert.ctl direct=true
开始时一般在 2 分 40 秒左右,随着导入次数的增加,时间开始变长,到 700W,花费 4
分 30 秒左右。因为 ORACLE 的数据文件在一台机子上,磁盘容量是固定。可以预计,随着
表的膨胀,花费会更慢。
用 Hadoop MapReduce 导入 Hbase 花费时间在 5 分钟 18 秒(不写 WAL 日志),随着导
入次数的增加,时间无明显变长,比较平稳。因为它是分布式,容量由集群平摊,伸缩性好。
2.Oracle 与 HIVE 比较
HIVE 的导入是直接移动文本文件到 HDFS,因此 HIVE 的“导入”比 Oracle 要快得多。
用 Oracle 与 HIVE 对以上测试的 700W 的数据进行 GROUP,COUNT 聚集统计分析
select F2,COUNT(*) from TESTINSERT GROUP BY F2 ORDER BY F2;
发现 Oracle 要花 537 秒。而 HIVE 只用了 174 秒,所花费时间不到 Oracle 的一半,充
分体现的 Hadoop 的分布式计算的威力。
(二)功能报告
1. 测试环境
服务器类型 | 数量(台) | 内存 |
服务器 | 1 | 8GB |
2. 测试用例执行情况表格
测试模块 | 执行用例总数 | 通过用例总数 | 发现 bug 数 | 通过率 | 备注 |
登录模块 | 10 | 9 | 1 | 90% | |
注册模块 | 5 | 5 | 0 | 100% | |
模块 | 5 | 4 | 2 | 80% | |
选人模块 | 10 | 8 | 1 | 80% | |
分类图书模块 | 5 | 5 | 1 | 100% | |
男生阅读模块 | 5 | 3 | 1 | 60% | |
女生阅读模块 | 5 | 4 | 1 | 80% | |
讨论模块 | 10 | 10 | 10 | 100% |
3. 脚本
登录模块脚本
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="update" method="post">
姓名:<input type="text" name="username"><br>
年龄:<input type="text" name="age"><br>
姓别:<input type="text" name="sex"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
UserDao.java:
package yznu.cn.SpringBootDemo01.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import yznu.cn.SpringBootDemo01.entity.User;
@Mapper
public interface UserDao {
@Select("select * from user")
public List<User>findAll();
@Insert("insert into user values(#{username},#{age},#{sex})")
public int insert(User user);
@Insert("delete from user where username=#{username}")
public int delete(String username);
@Update("update user set age=#{age},sex=#{sex} where username=#{username}")
public int update(User user);
}
相关模块脚本
UserController.java:
package yznu.cn.SpringBootDemo01.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import yznu.cn.SpringBootDemo01.entity.User;
import yznu.cn.SpringBootDemo01.mapper.UserDao;
@Controller
public class UserController {
@Autowired
private UserDao userdao;
@RequestMapping("/query")
public String query(Model model) {
List<User> users=userdao.findAll();
model.addAttribute("users",users);
System.out.println(users);
return "show";
}
@RequestMapping("/save")
public String save(User user,Model model) {
int temp=userdao.insert(user);
if(temp!=0) {
List<User> users=userdao.findAll();
model.addAttribute("users",users);
System.out.println(users);
return "show";
}
else {
return "error";
}
}
@RequestMapping("/delete")
public String delete(String username,Model model) {
int temp=userdao.delete(username);
if(temp!=0) {
List<User> users=userdao.findAll();
model.addAttribute("users",users);
System.out.println(users);
return "show";
}
else {
return "error";
}
}
@RequestMapping("/update")
public String update(User user,Model model) {
int temp=userdao.update(user);
if(temp!=0) {
List<User> users=userdao.findAll();
model.addAttribute("users",users);
System.out.println(users);
return "show";
}
else {
return "error";
}
}
}
Login.java:
package yznu.cn.SpringBootDemo01.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import yznu.cn.SpringBootDemo01.entity.User;
@Controller
//@RestController
public class Login {
@RequestMapping("/user/hello")
@ResponseBody
public String login() {
return "Hello, world! 你好springBoot!";
}
@RequestMapping("/sh")
public String tc(Model model){
model.addAttribute("name","yznu");
model.addAttribute("age",20);
model.addAttribute("sex",'男');
return "show";
}
//直接绑定表单参数
@RequestMapping("/login01")
public String login01(String username,String age,String sex,Model model){
model.addAttribute("name",username);
model.addAttribute("age",age);
model.addAttribute("sex",sex);
return "show";
}
//通过Bean传参数
@RequestMapping("/login02")
public String login02(User user,Model model){
model.addAttribute("name",user.getUsername());
model.addAttribute("age",user.getAge());
model.addAttribute("sex",user.getSex());
return "show";
}
//测试返回有表单的网页log.html,然后由表单提交数据给/login01方法
@RequestMapping("/log")
public String log(){
return "log";
}
//测试get请求
@RequestMapping(value="/login03",method=RequestMethod.GET)
@ResponseBody
public String login03(String name,String age,String sex){
return "姓名"+name+"年龄"+age+"性别"+sex;
}
//测试post请求
@RequestMapping(value="/login04",method=RequestMethod.POST)
@ResponseBody
public String login04(User user){
return "姓名"+user.getUsername()+"年龄"+user.getAge()+"性别"+user.getSex();
}
}
(三)性能报告
总体测试情况:
指标 | 测试值 |
压测时长 | 20 分 10 秒 |
并发数 | 50 个线程(等价 50 个虚拟用户) |
平均响应时间 | 10556 毫秒 |
最大响应时间 | 41595 毫秒 |
吞吐量 | 7.3/sec |
容错率 | 0.01% |
总点击次数 | 3156 |
平均每秒点击次数 | 15014 |
注解:
1、平均响应时间:单个请求平均响应时间(毫秒)
2、最大响应时间:在事物全部响应时间中求 MAX
3、吞吐量:表示每秒完成的请求数(Request per Second),是指在没有帧丢失的情况下,设备能够接受的最大速率
4、错误率:出现错误的请求的数量/请求的总数
5、总点击次数
6、平均每秒点击次数:即运行场景过程中虚拟用户每秒向 Web 服务器提交的 HTTP 请求数。
说明: 用户的整个执行流程都录制在 Action( 循环) 部分,所以 Vuser_int ( 开始) 和
Vuser_end(结束)部分为空。Action_Transaction 部分的时间为运行整个Action 脚本所需的时间。
登录模块:
采用 20 个user 并发运行时的性能报告如下:
正在运行Vuser-整个场景:
Bug图数:
平均事务响应时间
功能测试:
结果分析:TC2002实际输出与预期输出不符,考虑为代码缺陷,开发者并未考虑在下单时对用户余额进行判断是否大于订单金额,而是直接相减,出现余额为负数的情况。TC2001测试结果与预期相符,说明整体功能流程设计成功。
平均事务响应时间
五、测试总结报告
经过多次测试和数据报表分析,可以得出如下结论:
1、此次测试操作流程相对比较简单,所以并未对服务器造成高度负载,是数目相对比较轻松的人数访问网站。
2、从模拟环境来看,加入相对频繁的基数访问的思考时间,更符合真实用户的操作。
3、从设置少量人数的压力分析,响应速度很快,完全在用户的感觉快速响应时间内,从整个系统对应脚本分析,把整个反应时间减去登录时间为缩短一定秒数,首页的访问时间相比较长,首页图片较多,如果用户量访问量继续加大,必定会影响系统性能。
4、从系统资源方面,内存占用率始终处于高位水平,磁盘空间由于日志写入而不断被占用。
5、在数据删除中,当下社会中对于项目开发中的删除功能是十分敏感的,因为数据十分重要。所以我们不能点击删除后数据就永远从数据库消失,这可能给后续带来严重的生产问题。
6、建议设计逻辑删除功能,对于书籍删除后仅不会向用户展示,但依然存在数据库中,具体实现方案可以通过添加数据库字段实现,0表示逻辑删除,1表示未删除。
7、测试程度较浅,没有足够多的测试次数,系统吞吐量较低,并未检查代码复杂度测试、判断代码覆盖情况。
标签:注册,yznu,密码,作业,验证码,登录,测试用例,测试,软件测试 From: https://blog.csdn.net/weixin_58678536/article/details/139770554