软件测试52讲读书笔记

时间:2024-03-28 07:46:25

最近要做功能测试和性能测试,临时抱佛脚,学习点可用的概念和术语,有个大概的认知。

测试需求

一个质量过硬的软件系统,除了显式功能性需求以外,其他的非功能性需求即隐式功能性需求也是极其关键的。
显式功能性需求(Functional requirement)的含义从字面上就可以很好地理解,指的是软件本身需要实现的具体功能。
从软件测试的维度来看,非功能性需求主要涉及安全性、性能以及兼容性三大方面。

安全性测试

  • 用户密码后台存储是否加密;
  • 用户密码在网络传输过程中是否加密;
  • 密码是否具有有效期,密码有效期到期后,是否提示需要修改密码;
  • 不登录的情况下,在浏览器中直接输入登录后的URL地址,验证是否会重新定向到用户登录界面;
  • 密码输入框是否不支持复制和粘贴;
  • 密码输入框内输入的密码是否都可以在页面源码模式下被查看;
  • 用户名和密码的输入框中分别输入典型的“SQL注入攻击”字符串,验证系统的返回页面;
  • 用户名和密码的输入框中分别输入典型的“XSS跨站脚本攻击”字符串,验证系统行为是否被篡改;
  • 连续多次登录失败情况下,系统是否会阻止后续的尝试以应对暴力**;
  • 同一用户在同一终端的多种浏览器上登录,验证登录功能的互斥性是否符合设计预期;
  • 同一用户先后在多台终端的浏览器上登录,验证登录是否具有互斥性。

性能压力测试

  • 单用户登录的响应时间是否小于3秒;
  • 单用户登录时,后台请求数量是否过多;
  • 高并发场景下用户登录的响应时间是否小于5秒;
  • 高并发场景下服务端的监控指标是否符合预期;
  • 高集合点并发场景下,是否存在资源死锁和不合理的资源等待;
  • 长时间大量用户连续登录和登出,服务器端是否存在内存泄漏。

兼容性测试

  • 不同浏览器下,验证登录页面的显示以及功能正确性;
  • 相同浏览器的不同版本下,验证登录页面的显示以及功能正确性;
  • 不同移动设备终端的不同浏览器下,验证登录页面的显示以及功能正确性;
  • 不同分辨率的界面下,验证登录页面的显示以及功能正确性。

测试用例

好的测试用例

1. 概念

“好的”测试用例一定是一个完备的集合,它能够覆盖所有等价类以及各种边界值,而跟能否发现缺陷无关。

2. 特征

“好的”测试用例必须具备哪些特征?

  1. 整体完备性: “好的”测试用例一定是一个完备的整体,是有效测试用例组成的集合,能够完全覆盖测试需求。
  2. 等价类划分的准确性: 指的是对于每个等价类都能保证只要其中一个输入测试通过,其他输入也一定测试通过。
  3. 等价类集合的完备性: 需要保证所有可能的边界值和边界条件都已经正确识别。

三种最常用的测试用例设计方法

对大多数的软件测试而言,综合使用等价类划分、边界值分析和错误推测这三大类方法就足够了。

1. 等价类划分

等价类中任意一个输入数据对于揭露程序中潜在错误都具有同等效果。只要从每个等价类中任意选取一个值进行测试,就可以用少量具有代表性的测试输入取得较好的测试覆盖结果。
等价类划分方法的另一个关键点是要找出所有“无效等价类”
案例:
学生信息系统中有一个“考试成绩”的输入项,成绩的取值范围是0~100之间的整数,考试成绩及格的分数线是60。
在考虑了无效等价类后,最终设计的测试用例为:

  • 有效等价类1:0~59之间的任意整数;
  • 有效等价类2:59~100之间的任意整数;
  • 无效等价类1:小于0的负数;
  • 无效等价类2:大于100的整数;
  • 无效等价类3:0~100之间的任何浮点数;
  • 无效等价类4:其他任意非数字字符。

2. 边界值分析方法

大量的错误发生在输入输出的边界值上,所以需要对边界值进行重点测试,通常选取正好等于、刚刚大于或刚刚小于边界的值作为测试数据。
eg. “考试成绩”的例子,选取的边界值数据应该包括:-1,0,1,59,60,61,99,100,101。

3. 错误推测方法

错误推测方法是指基于对被测试软件系统设计的理解、过往经验以及个人直觉,推测出软件可能存在的缺陷,从而有针对性地设计测试用例的方法。

比如,Web界面的GUI功能测试,需要考虑浏览器在有缓存和没有缓存下的表现;Web Service的API测试,需要考虑被测API所依赖的第三方API出错下的处理逻辑;对于代码级的单元测试,需要考虑被测函数的输入参数为空情况下的内部处理逻辑等等。
建立常见缺陷知识库,在测试设计的过程中,会使用缺陷知识库作为检查点列表(checklist),去帮助优化补充测试用例的设计。
建立一个简单的wiki页面,让测试工程师完成测试用例的最初设计后对应这个wiki页面先做一轮自检,如果在后续测试中发现了新的点,就会继续完善这个wiki页面。

如何设计

在具体的用例设计时,首先需要搞清楚每一个业务需求所对应的多个软件功能需求点,然后分析出每个软件功能需求点对应的多个测试需求点,最后再针对每个测试需求点设计测试用例。
以用户登录为例:
软件测试52讲读书笔记

两个关键点:

  1. 从软件功能需求出发,全面地、无遗漏地识别出测试需求是至关重要的,这将直接关系到用例的测试覆盖率。 比如,如果你没有识别出用户登录功能的安全性测试需求,那么后续设计的测试用例就完全不会涉及安全性,最终造成重要测试漏洞。
  2. 对于识别出的每个测试需求点,需要综合运用等价类划分、边界值分析和错误推测方法来全面地设计测试用例。以“用户登录”的功能性测试需求为例,你首先应该对“用户名”和“密码”这两个输入项分别进行等价类划分,列出对应的有效等价类和无效等价类,对于无效等价类的识别可以采用错误猜测法(比如,用户名包含特殊字符等),然后基于两者可能的组合,设计出第一批测试用例。等价类划分完后,你需要补充“用户名”和“密码”这两个输入项的边界值的测试用例,比如用户名为空(NULL)、用户名长度刚刚大于允许长度等。

其他经验

  1. **只有深入理解被测试软件的架构,你才能设计出“有的放矢”的测试用例集,去发现系统边界以及系统集成上的潜在缺陷。**必须对内部的架构有清楚的认识,比如数据库连接方式、数据库的读写分离、消息中间件Kafka的配置、缓存系统的层级分布、第三方系统的集成等等。
  2. 必须深入理解被测软件的设计与实现细节,深入理解软件内部的处理逻辑。单单根据测试需求点设计的用例,只能覆盖“表面”的一层,往往会覆盖不到内部的处理流程、分支处理,不要以开发代码的实现为依据设计测试用例。应该根据原始需求设计测试用例
  3. 需要引入需求覆盖率和代码覆盖率来衡量测试执行的完备性,并以此为依据来找出遗漏的测试点。