你想入门软件测试?先从“用户登录”测试用例开始!
可能你会说,"用户登录"这个测试对象也有点太简单了吧,我只要找一个用户,让他在界面上输入用户名和密码,然后点击"确认"按钮,验证一下是否登录成功就可以了。的确,这构成了一个最基本、最典型的测试用例,这也是终端用户在使用系统时最典型的Happy Pass场景。
但是作为测试工程师,你的目标是要保证系统在各种应用场景下的功能是符合设计要求的,所以你需要考虑的测试用例就需要更多、更全面。于是你需要根据"用户登录"功能的需求描述,结合以下5个知识点来设计一系列的测试用例。
知识点1: 等价类划分法,是将所有可能的输入数据划分成若干个子集,在每个子集中,如果任意一个输入数据对于揭露程序中潜在错误都具有同等效果,那么这样的子集就构成了一个等价类。后续只要从每个等价类中任意选取一个值进行测试,就可以用少量具有代表性的测试输入取得较好的测试覆盖结果。
知识点2: 边界值分析法,是选取输入、输出的边界值进行测试。因为通常大量的软件错误是发生在输入或输出范围的边界上,所以需要对边界值进行重点测试,通常选取正好等于、刚刚大于或刚刚小于边界的值作为测试数据。
知识点3: 显式功能性需求(Functional requirement),指的是软件本身需要实现的具体功能, 比如"正常用户使用正确的用户名和密码可以成功登录"、"非注册用户无法登录"等,这都是属于典型的显式功能性需求描述。(测试用例1-20)
知识点4: 非功能性需求(Non-functional requirement)从软件测试的维度来看,非功能性需求主要涉及安全性、性能以及兼容性三大方面。
知识点5: "穷尽测试" 是指包含了软件输入值和前提条件所有可能组合的测试方法,完成穷尽测试的系统里应该不残留任何未知的软件缺陷。(不可能)
用户登录测试用例:
一、功能测试(Function test)
1、什么都不输入,点击提交按钮,看提示信息。(非空检查)
2、输入正确的用户名和密码,点击提交按钮,验证是否能正确登录。(正常输入)
3、输入错误的用户名或者密码, 验证登录会失败,并且提示相应的错误信息。(错误校验)
4、登录成功后能否能否跳转到正确的页面(低)
5、用户名和密码,如果太短或者太长,应该怎么处理(安全性,密码太短时是否有提示)
6、用户名和密码,中有特殊字符(比如空格),和其他非英文的情况(是否做了过滤)
7、记住用户名的功能
8、登陆失败后,不能记录密码的功能
9、用户名和密码前后有空格的处理
10、密码是否加密显示(星号圆点等)
11、牵扯到验证码的,还要考虑文字是否扭曲过度导致辨认难度大,考虑颜色(色盲使用者),刷新或换一个按钮是否好用
12、登录页面中的注册、忘记密码,登出用另一帐号登陆等链接是否正确
13、输入密码的时候,大写键盘开启的时候要有提示信息
14、不同级别的用户,比如管理员用户和普通用户,登录系统后的权限是否正确
15、页面默认焦点是否定位在用户名的输入框中
16、快捷键 Tab 和 Enter 等,是否可以正常使用
二、界面测试(UI Test)
1、布局是否合理,2个testbox 和一个按钮是否对齐
2、testbox和按钮的长度,高度是否复合要求
3、界面的设计风格是否与UI的设计风格统一
4、界面中的文字简洁易懂,没有错别字。
三、性能压力测试(performance test)
1、单用户登录的响应时间是否小于 3 秒;
2、单用户登录时,后台请求数量是否过多;
3、高并发场景下用户登录的响应时间是否小于 5 秒;
4、高并发场景下服务端的监控指标是否符合预期;
5、高集合点并发场景下,是否存在资源死锁和不合理的资源等待;
6、长时间大量用户连续登录和登出,服务器端是否存在内存泄漏。
四、安全性测试(Security test)
1、登录成功后生成的Cookie,是否是httponly (否则容易被脚本盗取)
2、用户名和密码是否通过加密的方式,发送给Web服务器
3、用户名和密码的验证,应该是用服务器端验证, 而不能单单是在客户端用javascript验证
4、用户名和密码的输入框,应该屏蔽SQL注入攻击
5、用户名和密码的的输入框,应该禁止输入脚本 (防止XSS攻击)
6、错误登陆的次数限制(防止暴力破解)
7、考虑是否支持多用户在同一机器上登录;
8、考虑一用户在多台机器上登录
五、可用性测试(Usability Test)
1、是否可以全用键盘操作,是否有快捷键
2、输入用户名,密码后按回车,是否可以登陆
3、输入框能否可以以Tab键切换
六、兼容性测试(Compatibility Test)
1、主流的浏览器下能否显示正常已经功能正常(IE,6,7,8,9, Firefox, Chrome, Safari,等)
2、不同的平台是否能正常工作,比如Windows, Mac
3、移动设备上是否正常工作,比如Iphone, Andriod
4、不同的分辨率
七、本地化测试 (Localization test)
不同语言环境下,页面的显示是否正确。
八、软件辅助性测试 (Accessibility test)
1、软件辅助功能测试是指测试软件是否向残疾用户提供足够的辅助功能
2、高对比度下能否显示正常 (视力不好的人使用)
九、其它测试
1、连续输入3次或以上错误密码,用记是否被锁一定时间(如:15分钟)?时间内不允许登录,超出时间点是否可以继续登录?
2、用户session过期后,重新登录是否还能重新返回这前session过期的页面?
3、用户名和密码输入框是事支持键盘快捷键?如:撤销、复制、粘贴等等
4、是否允许同名用户同时登录进行操作?考虑web和app同时登录
5、手机登录时,是否先判断网络可用?
6、手机登录时,是否先判断app存在新版本?
7、是否有埋点接口
总结
首先,对于高质量的软件测试,用例设计不仅需要考虑明确的显式功能性需求,还要涉及兼容性、安全性和性能等一系列的非功能性需求,这些非功能性需求对软件系统的质量有着举足轻重的作用。
其次,优秀的测试工程师必须具有宽广的知识面,才能设计出有针对性、更易于发现问题的测试用例。
最后,软件测试的用例设计是不可穷尽的,工程实践中难免受制于时间成本和经济成本,所以优秀的测试工程师需要兼顾缺陷风险和研发成本之间的平衡。