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

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

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

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

但是仔细想一下双 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」,十年测试老司机的原创干货,关注我,一起涨姿势!

原文地址:http://blog.51cto.com/sylan215/2347410

时间: 2024-10-10 10:36:11

如何利用分层测试概念设计针对性测试用例的相关文章

利用微软测试工具PICT生成测试用例

---恢复内容开始--- 这里使用一个登陆界面的测试作为例子,程序流程中共有5项待测环节. 1.首先,列出每个条目所需进行测试的分支: 1 账户名:空,不存在,超长,超短,正常 2 密码:空,超长,超短,不匹配,正常 3 验证码:空,超长,超短,不匹配,正常 4 会话:保存一个月,保存三个月,保存一年,不保存 5 按钮:确定,取消 2.下载PICT工具后,进行安装.在安装目录下,新建txt文件,输入上述内容. 3.打开cmd,进入PICT工具安装目录,并运行pict test.txt>test.

python利用unittest测试框架组织测试用例的5种方法

利用unittest测试框架可以编写测试用例,执行方式分两大类:利用main方法和利用testsuite,其中利用测试套件来组织测试用例可以有4种写法. 在此之前,先了解几个概念 TestCase:所有测试用例的基本类,给一个测试方法的名字,就会返回一个测试用例实例: TestSuite:组织测试用例的实例,支持测试用例的添加和删除,最终将传递给  testRunner进行测试执行: TextTestRunner:进行测试用例执行的实例,其中Text的意思是以文本形式显示测试结果.测试的结果会保

测试面试题集-测试用例设计:登录、购物车、QQ收藏表情、转账、充值、提现

以下内容首发于微信公众号[ITester软件测试小栈]: 测试面试题集-2.测试用例设计 大家好 我是coco小锦鲤 上周五给大家分享了测试基础理论题 这个周五给大家分享测试用例设计题 测试用例的考察无非是检验 是否可以理解给定的需求 是否有设计测试用例的能力是否熟悉各种测试方法 是否有灵活的发散思维 以下给大家列举 登录功能 购物车模块 QQ收藏表情包 网上银行转账 支付宝充值 支付宝提现 6大常见的测试用例设计面试题 Q: 一.登录功能,设计测试用例. A: 功能测试: 1.输入正确的账号和

按照所给的程序流程图,分别写出语句覆盖、分支覆盖的测试用例,以及它所覆盖的路径,根据程序流程图,写出代码,用JUnit生成单元测试,并利用前面设计的测试用例进行测试。

语句覆盖:路径:abc ,测试用例:x=3,y=2 分支覆盖:路径:aeg ,测试用例:x=4,y=-1 /** * 2016-04-09 * @author 吴思婷 * DoWork类用来根据程序流程图,写出代码(定义一个类和方法来实现) */ public class DoWork { public void doWork(int x,int y){ int k=0,j=0; if((x<4 || y>0)&&(y>1)){ y=y+1; } else { if(x&

【tool】利用测试概念进行代码设计时的七条基本原则

跟其它编码原则一样,这些原则也不是不容置疑或不可改变的教条.有时候打破这些规则也是必要的.因此,理解每条原则背后的动机和判断何时这些动机不适用(或应让位给更关心的问题)的能力是很重要的. 原则 1. 到 GUI 视图的外面去 尽可能把代码移到 GUI 视图的外面.然后各种 GUI 动作就能成了模型上的简单方法调用.为什么您需要这样做呢? 对 GUI 测试者来说,通过方法调用测试功能比间接地测试功能容易的多. 另一个好处是它使修改程序功能而不影响视图变的更容易. 当然,视图中也可能存在错误.在理想

SWTBOK测试实践系列(9) -- 设计的测试用例是否越详细越好?

测试人员设计测试用例的时候,面临的第一个问题就是测试用例的步骤是否越详细越好?或者如何把握测试用例的详细步骤?在这个问题上,赞成测试用例详细化的人肯定有不少,因为详细测试用例可以提供如下优点: 1)缺乏经验或者技能的测试人员,可以按照测试用例的步骤顺利开展测试执行工作.这是脚本化测试实践中的思维:有经验与技能的测试人员设计测试用例,而缺乏经验的人员去执行测试用例. 2)缺乏经验的测试人员,按照详细测试用例的步骤执行的过程,不仅可以帮助他们了解测试对象的功能与业务知识,也可以帮助他们了解测试设计技

.NET应用架构设计—重新认识分层架构(现代企业级应用分层架构核心设计要素)

阅读目录: 1.背景介绍 2.简要回顾下传统三层架构 3.企业级应用分层架构(现代分层架构的基本演变过程) 3.1.服务层中应用契约式设计来解决动态条件不匹配错误(通过契约式设计模式来将问题在线下暴露出来) 3.2.应用层中的应用控制器模式(通过控制器模式对象化应用层的职责) 3.3.业务层中的命令模式(事务脚本模式的设计模式运用,很好的隔离静态数据) 4.服务层作为SOA契约公布后DTO与业务层的DomainModel共用基本的原子类型 5.两种独立业务层职责设计方法(可以根据具体业务要求来搭

分层测试

最近在工作过程中遇到产品.测试对分层测试有些疑惑,这还只是因为我想在过程中增加接口层面的测试.有这些疑问很正常,以前也经常遇到.疑惑具体到当时情况,我理解有两点,一个是开发不想迭代提交,如果要增加分层测试,对开发有额外的要求,比如方法说明,比如概要设计.详细设计.接口规范等,是有额外的工作量的:还有一点是说,既然可以直接从页面上进行测试,那不是更简单吗,何必要在深层次上做更多的测试呢,这不是增加了工作量? 针对第二点,其实对测试是有很大的误解的.对测试来说,会增加一些工作量,但增加的工作量并没有

如何设计单元测试用例

如何编写单元测试用例(白盒测试). 一. 单元测试的概念 单元通俗的说就是指一个实现简单功能的函数.单元测试就是只用一组特定的输入(测试用例)测试函数是否功能正常,并且返回了正确的输出.        测试的覆盖种类        1.语句覆盖:语句覆盖就是设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次.        2.判定覆盖(也叫分支覆盖):设计若干个测试用例,运行所测程序,使程序中每个判断的取真分支和取假分支至少执行一次.        3.条件覆盖:设计足够的测