当前位置: 首页 > news >正文

如何利用分层测试概念设计针对性测试用例

除了纯后台测试或者纯接口测试外,我想大部分人都会接触业务测试,至少我们目前的客户端产品测试就是这样。

之前和我们组客户端测试同学沟通,总是会发现大家用例的关注点大部分都集中在业务逻辑的覆盖上,对具体逻辑的实现,以及底层实现原理的关注偏少。

这样做其实并没有错,用例不就是覆盖需求的么?而需求就是我们说的业务逻辑呀。

但是仔细想一下双 V 模型就会发现,我们缺少了概要设计(集成测试)和详细设计(单元测试)的阶段,直接进入了系统测试,而要求大家在系统测试阶段考虑单元测试和集成测试的点,确实不是每个人都能做到的,事实证明也确实如此。

前段时间看的《软件测试的艺术》刚好有提到三层应用系统的分层:表示层、业务逻辑层和数据访问层,我觉得可以利用这个分层理论,让我们也可以在系统测试阶段考虑到逻辑实现和底层原理的验证。

下面我根据我们当前项目的情况,以我的角度来按这个分层分别进行举例说明。

先说说表示层。

我把表示层对应到我们目前的系统测试阶段的需求覆盖上,所有的显性需求的覆盖,都属于表示层,部分基于需求本身的补充和完善的隐性需求也是属于表示层。

设计表示层的用例比较简单,直接和需求说明进行一一对应就行,保证用例覆盖的集合是需求说明集合的超集,那么对显性需求的覆盖率肯定是百分百了。

举个例子。

有个需求中有这么一个描述「该功能的入口是否展示,需要参考注册表 HKCU\Software\test[testvalue] 的值,值为 0 时不展示,值为非 0 时展示。」

针对显性需求的用例覆盖:
验证注册表 HKCU\Software\test[testvalue] 的值为 0 时,功能入口不展示;
验证注册表 HKCU\Software\test[testvalue] 的值为 1 时,功能入口会展示;
验证注册表 HKCU\Software\test[testvalue] 的值为 2 时,功能入口会展示;
验证注册表 HKCU\Software\test[testvalue] 的值为 4294967296 时,功能入口会展示;

针对隐性需求的用例覆盖:
验证注册表 HKCU\Software\test[testvalue] 不存在时,功能入口不展示;

看,我们用例已经覆盖了需求显式说明的所有情况,同时也对部分隐性需求进行了覆盖,如果从表示层角度看,这个覆盖率已经很完全了。

那是否还有可以补充的用例呢?我们继续往下看。

再说说业务逻辑层。

所谓的业务逻辑,可以理解为集成测试或者接口测试阶段的测试对象,比如前面那个例子是调用的哪个接口实现的,如果没有调用接口,自己又是如何实现的?

比如经过和开发沟通,我们得到的实现逻辑是这样的「我们内部没有现成的接口,我直接使用的系统提供的 RegGetValue API 来读取的注册表值进行判断的。」

别看就这么一句话,如果从程序实现的角度看,这里面涵盖的信息量可不少。

我们首先想到的,当然去 MSDN 查询 API 使用说明,地址在这里:https://docs.microsoft.com/en-us/windows/desktop/api/winreg/nf-winreg-reggetvaluew

通过文档可以发现,这个 API 的第四个参数 dwFlags 可以指定我们要获取的注册表值的类型,如果类型不匹配,API 直接返回失败,那么这就可以新增一条用例了:
验证注册表 HKCU\Software\test[testvalue] 为 REG_SZ 类型,并且值为 1 时,功能入口会展示;

接着往下看,会发现这个 API 最低支持平台是 Windows Vista,那么新的用例又来了:
验证在 Windows XP 系统上,注册表 HKCU\Software\test[testvalue] 值为 1 时,功能入口会展示;

我们现在回过头来看这两条新增的用例,它们不是显性需求的描述,也不是我们把显性需求进行等价类或边界值进行划分能够补充到的用例,他必须是对具体实现逻辑有了解,才会考虑到的用例。

当然,也有人会说,我不这么分析,我也能想到这些用例,那恭喜你,对实现逻辑的挖掘已经深入你的骨髓,你养成了一个好习惯,千万不要给丢掉了。

最后再说说数据访问层。

这里说的数据是广义的,包含数据库存储的数据、注册表里面的数据、具体的文件变化等等,都可以算,概况起来就是,如果需求有涉及到非程序本身的数据变化时,一定要对数据本身进行确认和验证。

这个如果要和标准流程对应的话,部分涉及到单元测试的范畴了,所以如果有开发代码权限的可以多加关注。

如果继续使用前面这个例子来说明的话,那就是相关注册表值的位置、值的类型、值的内容等,这个例子里面这部分内容显性需求里面其实有说明,所以我们换个例子。

比如我们有个流程管理系统,每个流程阶段都需要经过对应角色确认,才能让这个流程继续下去,当初我们定的角色名称有开发、产品和测试,实现的时候,有人就直接把开发、产品和测试这样的字符串写入到数据库了,并把这些字段放到了逻辑判断的语句里面,仅从黑盒测试的角度看,没有任何问题,所有用例都可以通过,但是,如果有一天我们需要把产品改名为产品经理,就会发现要改的地方特别多,测试也几乎需要把所有相关逻辑重跑一遍,并且还避免不了部分日志记录中根本无法分离出这部分数据。

碰到这种情况,我们建议的方式是把一些变化的内容使用不变的代号来表示,比如开发用代号 DEV,那么不管你叫开发、开发经理、开发工程师还是其他的,DEV 的代号是唯一且不变的,那么对逻辑的影响就是微乎其微的了。

同样的,涉及数据库的时候,还需要关注哪些是主键,是否需要建立索引等等(业务测试人员也需要关注这些内容?看你心情了)。

再比如我们有些逻辑涉及到注册表的更新操作,某个操作只需要更新某一个注册表值就行,但是通过过滤规则发现,实现时竟然是把所有相关注册表值都进行了一次重写,如果不去关注数据的变化,仅仅从功能上看是发现不了问题的。

文件操作也是类似,有时候我们仅需要读取部分内容即可,但是实现时是全部读取,甚至是频繁的进行全部读取的操作,造成不必要的 IO 浪费。

说了这么多,有没有对前面说的分层有更好的理解呢?有没有可能借助这个理论让我们的用例更深入也更有针对性?

再总结一下:
表示层,就是要关注显性需求以及和显性需求相关联的隐性需求,并设计对应的用例;
逻辑层,就是要关注具体的代码实现逻辑,根据实现补充一些针对性的测试用例;
数据层,就是所有和广义上的数据相关的操作,都要关注实现的合理性和正确性。

以上,希望对你有所帮助,有任何问题欢迎留言沟通。

本文首发于公众号「sylan215」,十年测试老司机的原创干货,关注我,一起涨姿势!

转载于:https://blog.51cto.com/sylan215/2347410

相关文章:

  • Firefox 66 将自带自动屏蔽声音功能
  • npm install 报错
  • as3调用外部应用程序 as调用外部exe文件as3调用bat文件 未测试
  • 使用Linux中的 v i m 编辑器
  • Chrome 72 禁止第三方程序代码注入
  • python博客
  • windows2012服务器中安装php7+mysql5.7+apache2.4环境
  • Python 基础起步 (十) 什么叫函数?
  • mysql innodb 索引使用指南
  • linux命令行模式下输入Ctrl+s后界面锁定,假死。
  • CLR的执行模型(1):将源代码编译成托管模块
  • 聊聊flink的TableFactory
  • SpringAOP源码分析总结
  • mongodb分片
  • 某些编程语言更容易出错?研究人员提出质疑
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • Apache Spark Streaming 使用实例
  • bearychat的java client
  • C++类中的特殊成员函数
  • crontab执行失败的多种原因
  • iOS 颜色设置看我就够了
  • Spring Boot快速入门(一):Hello Spring Boot
  • storm drpc实例
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 将 Measurements 和 Units 应用到物理学
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 前端临床手札——文件上传
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 使用Swoole加速Laravel(正式环境中)
  • ​卜东波研究员:高观点下的少儿计算思维
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (8)STL算法之替换
  • (AngularJS)Angular 控制器之间通信初探
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (Oracle)SQL优化技巧(一):分页查询
  • (差分)胡桃爱原石
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • ******IT公司面试题汇总+优秀技术博客汇总
  • *1 计算机基础和操作系统基础及几大协议
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Core 中的路径问题
  • @RunWith注解作用
  • [AX]AX2012 SSRS报表Drill through action
  • [BZOJ4566][HAOI2016]找相同字符(SAM)
  • [IE编程] IE中使网页元素进入编辑模式
  • [LeetCode]—Longest Palindromic Substring 最长回文子串
  • [Linux]----文件操作(复习C语言+文件描述符)
  • [MYSQL]mysql将两个表结果合并到一起
  • [noip2015 d1t2] 信息传递
  • [oeasy]python001_先跑起来_python_三大系统选择_windows_mac_linux