2023年6月21日发(作者:)

【软件测试】——如何编写测试⽤例前⾔:我想把博客当作⼀个记录⾃⼰学习与成长的地⽅,会摘抄⼀些⾃⼰认为重要的内容记录下来,希望⼤家可以⼀起学习⼀起交流。如有雷同的⽂章,请见谅~============================================分割线=================================================对于测试来说,编写测试⽤例是⼗分重要的⼀步环节。从需求确定——到编写测试⽤例——测试⽤例评审——执⾏测试,测试⽤例始终是作为测试的⼀个“命脉”。那么如何编写好的测试⽤例呢?让我们先从简单的⽤户登录功能来设计⼀个测试⽤例吧!⾸先编写测试⽤例最主要的⼏个⽅法:等价类划分和边界值分析。这两个都⾪属于最常见、最典型、也是最重要的⿊盒测试⽅法。等价类划分⽅法,是将所有可能的输⼊数据划分若⼲个⼦集,在每个⼦集中,如果任意⼀个输⼊数据对于揭露程序中潜在错误都有同等效果,那么这样的⼦集就构成了⼀个等价类。后续只要从每⼀个等价类中任取⼀个值来进⾏测试,就可以⽤最少的⼯作量完成较好的测试覆盖结果。边界值分析⽅法,是选取输⼊、输出的边界值进⾏测试。因为通常⼤量的软件错误是发⽣在输⼊或输出范围的边界上,所以需要对边界值进⾏重点测试,通常选取正好等于、刚刚⼤于和刚刚⼩于边界的值作为测试数据。从⽅法论上来看,边界值分析是对等价类划分的⼀个补充,所以这两种测试⽅法经常结合起来使⽤。现在,针对“⽤户登录”功能,基于等价类划分和边界值⽅法,我们设计的测试⽤例包括:1.输⼊已注册的⽤户名和正确的密码,验证是否登录成功;2.输⼊已注册的⽤户名和不正确的密码,验证是否登录失败,并且提⽰信息正确;3.输⼊未注册的⽤户名和任意密码,验证是否登录失败,并且提⽰信息正确;4.⽤户名和密码两者都为空,验证是否登录失败,并且提⽰信息正确;5.⽤户名和密码有⼀个为空,验证是否登录失败,并且提⽰信息正确;6.如果登录功能启⽤了验证码功能,在⽤户名和密码正确的前提下,输⼊正确的验证码,验证是否登录成功;7.如果登录功能启⽤了验证码功能,在⽤户名和密码正确的前提下,输⼊错误的验证码,验证是否登录失败,并且提⽰信息正确。

上⾯的测试⽤例集涵盖了主要的功能测试场景。但是在⼀个优秀的测试⼯程师眼中,这些⽤例只能达到勉强及格的标准。有经验的测试⼯程师会再增加的测试⽤例(当然不是我,我是只菜鸟):1.⽤户名和密码是否⼤⼩写敏感;2.页⾯上的密码框是否加密显⽰;3.后台系统创建的⽤户第⼀次登录成功时,是否提⽰修改密码;4.忘记⽤户名和忘记密码的功能是否可⽤;(有忘记⽤户名功能的项⽬接触的⽐较少)5.前端页⾯是否根据设计要求限制⽤户名和密码长度;6.如果登录功能需要验证码,点击验证码图⽚是否可以更换验证码,更换后的验证码是否可⽤;7.刷新页⾯是否会刷新验证码;8.如果验证码具有时效性,需要分别验证时效内和时效外验证码的有效性;9.⽤户登录成功但是会话超时后,继续操作是否会重定向到⽤户登录界⾯;10.不同级别的⽤户,⽐如管理员和普通⽤户,登录系统后的权限是否正确;11.页⾯默认焦点是否定位在⽤户名的输⼊框中;12.快捷键Tab和Enter等,是否可以正常使⽤。

我觉得其中的3、8和10条,应该是属于产品需求⽅⾯的。如果有对应的需求那⽆可厚⾮,但是就我⽬前接触到的项⽬⽽⾔,这些需求不⼀定每个项⽬都具有。开发基本不会去做产品没有设计的需求点。以上所有的测试⽤例都是围绕功能性需求的验证展开的,但是⼤佬⼜会说了,⼀个质量过硬的软件系统,除了⼀些功能测试外,还有安全性、性能和兼容性三⼤⽅⾯的测试要涵盖。安全性测试⽤例包括:1.⽤户密码后台存储是否加密;2.⽤户密码在⽹络传输过程中是否加密;3.密码是否具有有效期,密码有效期到期后,是否提⽰需要修改密码;4.不登陆的情况下,在浏览器中直接输⼊登录后的URL地址,验证码是否会重定向到⽤户登录界⾯;5.密码输⼊框是否不⽀持复制和粘贴;6.密码输⼊框输⼊的密码是否可以在页⾯源码模式下被查看;7.⽤户名和密码的输⼊框中分别输⼊典型的“SQL注⼊攻击”字符串,验证系统的返回页⾯;8.⽤户名和密码的输⼊框中分别输⼊典型的“XXS跨站脚本攻击”字符串,验证码系统⾏为是否被篡改;9.连续多次登录失败情况下,系统是否会阻⽌后续的尝试以应对暴⼒破解;10.同⼀⽤户在同⼀终端的多种浏览器上登录,验证登录功能的互斥性是否符合设计预期;11.同⼀⽤户先后在多台终端的浏览器上登录,验证登录是否具有互斥性。

性能压⼒测试⽤例包括:1.单⽤户登录的响应时间是否⼩于3秒;2.单⽤户登录时,后台请求数量是否过多;3.⾼并发场景下⽤户登录的响应时间是否⼩于5秒;4.⾼并发场景下服务端的监控指标是否符合预期;5.⾼集合点并发场景下,是否存在资源死锁和不合理的资源等待;6.长时间⼤量⽤户连续登录和登出,服务器端是否存在内存泄漏。

兼容性测试⽤例包括:1.不同浏览器下,验证登录页⾯的显⽰以及功能正确性;2.相同浏览器的不同版本下,验证登录页⾯的显⽰以及功能正确性;3.不同移动设备终端的不同浏览器下,验证登录页⾯的显⽰以及功能正确性;4.不同分辨率的界⾯下,验证登录页⾯的显⽰以及功能正确性。

测试⽤例除了要覆盖明确的功能性需求,还需要考虑其他诸多的⾮功能性需求。通过这些⽤例的设计,⼀个优秀的测试⼯程师必须具有很宽⼴的知识⾯,如果不能对被测系统的设计有深⼊的理解,不明⽩安全攻击的基本原理,没有掌握性能测试的基本设计⽅法,很难设计出“有的放⽮”的测试⽤例。其实还有⼀些遗漏的测试点没有覆盖到,这个功能的测试点还不够全⾯。接下来谈⼀谈测试的不可穷尽性,即绝⼤多数情况下,是不可能进⾏穷尽测试的。所谓的“穷尽测试”是指包含了软件输⼊值和前提条件的所有可能组合的测试⽅法,完成穷尽测试的系统⾥应该不残留任何未知的软件缺陷。因为如果有未知的软件缺陷,你可以通过做更多的测试来找到它们,也就是说你的测试还没有穷尽。但是在绝⼤多数的软件⼯程实践中,测试由于受限于时间成本和经济成本,是不可能去穷尽所有可能的组合的,⽽是采⽤基本风险驱动的模式,有所侧重地选择测试范围和设计测试⽤例,以寻求缺陷风险和研发成本之间的平衡。总结⾸先,对于⾼质量的软件测试,⽤例设计不仅需要考虑明确的显式功能性需求,还要涉及兼容性、安全性和性能等⼀系列的⾮功能性需求,这些⾮功能性需求对软件系统的质量有着举⾜轻重的作⽤。其次,优秀的测试⼯程师必须具有宽⼴的知识⾯,才能设计出有针对性、更易发现问题的测试⽤例。最后,软件测试的⽤例设计是不可穷尽的,⼯程实践中难免受到时间成本和经济成本,所有优秀的测试⼯程师需要兼顾缺陷风险和研发成本之间的平衡。

2023年6月21日发(作者:)

【软件测试】——如何编写测试⽤例前⾔:我想把博客当作⼀个记录⾃⼰学习与成长的地⽅,会摘抄⼀些⾃⼰认为重要的内容记录下来,希望⼤家可以⼀起学习⼀起交流。如有雷同的⽂章,请见谅~============================================分割线=================================================对于测试来说,编写测试⽤例是⼗分重要的⼀步环节。从需求确定——到编写测试⽤例——测试⽤例评审——执⾏测试,测试⽤例始终是作为测试的⼀个“命脉”。那么如何编写好的测试⽤例呢?让我们先从简单的⽤户登录功能来设计⼀个测试⽤例吧!⾸先编写测试⽤例最主要的⼏个⽅法:等价类划分和边界值分析。这两个都⾪属于最常见、最典型、也是最重要的⿊盒测试⽅法。等价类划分⽅法,是将所有可能的输⼊数据划分若⼲个⼦集,在每个⼦集中,如果任意⼀个输⼊数据对于揭露程序中潜在错误都有同等效果,那么这样的⼦集就构成了⼀个等价类。后续只要从每⼀个等价类中任取⼀个值来进⾏测试,就可以⽤最少的⼯作量完成较好的测试覆盖结果。边界值分析⽅法,是选取输⼊、输出的边界值进⾏测试。因为通常⼤量的软件错误是发⽣在输⼊或输出范围的边界上,所以需要对边界值进⾏重点测试,通常选取正好等于、刚刚⼤于和刚刚⼩于边界的值作为测试数据。从⽅法论上来看,边界值分析是对等价类划分的⼀个补充,所以这两种测试⽅法经常结合起来使⽤。现在,针对“⽤户登录”功能,基于等价类划分和边界值⽅法,我们设计的测试⽤例包括:1.输⼊已注册的⽤户名和正确的密码,验证是否登录成功;2.输⼊已注册的⽤户名和不正确的密码,验证是否登录失败,并且提⽰信息正确;3.输⼊未注册的⽤户名和任意密码,验证是否登录失败,并且提⽰信息正确;4.⽤户名和密码两者都为空,验证是否登录失败,并且提⽰信息正确;5.⽤户名和密码有⼀个为空,验证是否登录失败,并且提⽰信息正确;6.如果登录功能启⽤了验证码功能,在⽤户名和密码正确的前提下,输⼊正确的验证码,验证是否登录成功;7.如果登录功能启⽤了验证码功能,在⽤户名和密码正确的前提下,输⼊错误的验证码,验证是否登录失败,并且提⽰信息正确。

上⾯的测试⽤例集涵盖了主要的功能测试场景。但是在⼀个优秀的测试⼯程师眼中,这些⽤例只能达到勉强及格的标准。有经验的测试⼯程师会再增加的测试⽤例(当然不是我,我是只菜鸟):1.⽤户名和密码是否⼤⼩写敏感;2.页⾯上的密码框是否加密显⽰;3.后台系统创建的⽤户第⼀次登录成功时,是否提⽰修改密码;4.忘记⽤户名和忘记密码的功能是否可⽤;(有忘记⽤户名功能的项⽬接触的⽐较少)5.前端页⾯是否根据设计要求限制⽤户名和密码长度;6.如果登录功能需要验证码,点击验证码图⽚是否可以更换验证码,更换后的验证码是否可⽤;7.刷新页⾯是否会刷新验证码;8.如果验证码具有时效性,需要分别验证时效内和时效外验证码的有效性;9.⽤户登录成功但是会话超时后,继续操作是否会重定向到⽤户登录界⾯;10.不同级别的⽤户,⽐如管理员和普通⽤户,登录系统后的权限是否正确;11.页⾯默认焦点是否定位在⽤户名的输⼊框中;12.快捷键Tab和Enter等,是否可以正常使⽤。

我觉得其中的3、8和10条,应该是属于产品需求⽅⾯的。如果有对应的需求那⽆可厚⾮,但是就我⽬前接触到的项⽬⽽⾔,这些需求不⼀定每个项⽬都具有。开发基本不会去做产品没有设计的需求点。以上所有的测试⽤例都是围绕功能性需求的验证展开的,但是⼤佬⼜会说了,⼀个质量过硬的软件系统,除了⼀些功能测试外,还有安全性、性能和兼容性三⼤⽅⾯的测试要涵盖。安全性测试⽤例包括:1.⽤户密码后台存储是否加密;2.⽤户密码在⽹络传输过程中是否加密;3.密码是否具有有效期,密码有效期到期后,是否提⽰需要修改密码;4.不登陆的情况下,在浏览器中直接输⼊登录后的URL地址,验证码是否会重定向到⽤户登录界⾯;5.密码输⼊框是否不⽀持复制和粘贴;6.密码输⼊框输⼊的密码是否可以在页⾯源码模式下被查看;7.⽤户名和密码的输⼊框中分别输⼊典型的“SQL注⼊攻击”字符串,验证系统的返回页⾯;8.⽤户名和密码的输⼊框中分别输⼊典型的“XXS跨站脚本攻击”字符串,验证码系统⾏为是否被篡改;9.连续多次登录失败情况下,系统是否会阻⽌后续的尝试以应对暴⼒破解;10.同⼀⽤户在同⼀终端的多种浏览器上登录,验证登录功能的互斥性是否符合设计预期;11.同⼀⽤户先后在多台终端的浏览器上登录,验证登录是否具有互斥性。

性能压⼒测试⽤例包括:1.单⽤户登录的响应时间是否⼩于3秒;2.单⽤户登录时,后台请求数量是否过多;3.⾼并发场景下⽤户登录的响应时间是否⼩于5秒;4.⾼并发场景下服务端的监控指标是否符合预期;5.⾼集合点并发场景下,是否存在资源死锁和不合理的资源等待;6.长时间⼤量⽤户连续登录和登出,服务器端是否存在内存泄漏。

兼容性测试⽤例包括:1.不同浏览器下,验证登录页⾯的显⽰以及功能正确性;2.相同浏览器的不同版本下,验证登录页⾯的显⽰以及功能正确性;3.不同移动设备终端的不同浏览器下,验证登录页⾯的显⽰以及功能正确性;4.不同分辨率的界⾯下,验证登录页⾯的显⽰以及功能正确性。

测试⽤例除了要覆盖明确的功能性需求,还需要考虑其他诸多的⾮功能性需求。通过这些⽤例的设计,⼀个优秀的测试⼯程师必须具有很宽⼴的知识⾯,如果不能对被测系统的设计有深⼊的理解,不明⽩安全攻击的基本原理,没有掌握性能测试的基本设计⽅法,很难设计出“有的放⽮”的测试⽤例。其实还有⼀些遗漏的测试点没有覆盖到,这个功能的测试点还不够全⾯。接下来谈⼀谈测试的不可穷尽性,即绝⼤多数情况下,是不可能进⾏穷尽测试的。所谓的“穷尽测试”是指包含了软件输⼊值和前提条件的所有可能组合的测试⽅法,完成穷尽测试的系统⾥应该不残留任何未知的软件缺陷。因为如果有未知的软件缺陷,你可以通过做更多的测试来找到它们,也就是说你的测试还没有穷尽。但是在绝⼤多数的软件⼯程实践中,测试由于受限于时间成本和经济成本,是不可能去穷尽所有可能的组合的,⽽是采⽤基本风险驱动的模式,有所侧重地选择测试范围和设计测试⽤例,以寻求缺陷风险和研发成本之间的平衡。总结⾸先,对于⾼质量的软件测试,⽤例设计不仅需要考虑明确的显式功能性需求,还要涉及兼容性、安全性和性能等⼀系列的⾮功能性需求,这些⾮功能性需求对软件系统的质量有着举⾜轻重的作⽤。其次,优秀的测试⼯程师必须具有宽⼴的知识⾯,才能设计出有针对性、更易发现问题的测试⽤例。最后,软件测试的⽤例设计是不可穷尽的,⼯程实践中难免受到时间成本和经济成本,所有优秀的测试⼯程师需要兼顾缺陷风险和研发成本之间的平衡。