第七章:Testing the Software with X-Ray Glasses。

Dynamic White-Box Testing(动态白盒测试)-动态,就是软件在运行;白盒,我们能看见里面怎么运行。所以就好像是带了X-光眼镜一样。它还有另外一个名字,就是结构测试(Structural Testing)。动态白盒测试通常包含了四个方面。

1.直接对底层的函数,过程,库~等进行测试。也就是对API的测试
2.站在一个比较高的层次来测试软件,而且是根据你对软件行为的认知的情况下进行,根据code具体的情况设计有针对性的case进行测试
3.验证已经设计好的case是否真的符合了当初设计的初衷。还有就是强行改变一些通过正常途径很难达到的软件的状态。这个例如说,一般软件都有很多错误的提示信息,但是要把全部错误信息通过正常渠道(用这个软件)得到,是比较困难的。不过在白盒测试里面,我们可以直接在debug器里面改相应的flag变量来达到目的
4.根据各种code coverage的结果来对已有test case的增加和修改,以达到更好的测试效果。
个人的一些体会,其实测试就是一个动态的过程,test case需要动态的维护、更新和增加,以达到好的效果。呵呵,动态可不单只是指软件运行~一语双关啊~或者说这个词被重载(Overload)了。


动态白盒测试和调试(Debugging)的区别
可以抓住一个要点,他们的目的分别是什么。白盒测试是一种测试手段,测试的目的是为了找到bug,所以白盒测试的目的是找bug。而Debug的目的是什么?是修复bug。之所会让人分不清,是因为他们有一些重叠。就是在分离并确定(Isolating)发生bug的原因。

单元测试(Unit Testing)和集成测试(Integration Testing)
单元测试通常是由程序员来执行的,集成测试也是。不过有些公司是Tester来完成集成测试的,我比较怀疑这个是否应该由Tester来完成~对于集成测试通常有3种。

1.大爆炸形式。就是一次把所有东西搞到一次然后测,虽然都觉得这个模式比较扯淡,但是实际上很多公司都是这样的方式来工作,呵呵~
2.Bottom-up(自底向上)。就是现在有了底层的模块,然后需要一步一步做集成测试,通常会让测试的人员编写驱动模块(Test Drives)。驱动模块能模拟上层模块对下层模块的调用,从而实现了测试的目的。
3.Top-Down(自上向下)。就是有了上层的模块然后需要编写桩模块(Stub)来模拟对底层的调用。
其实后面的两种方法就跟单元测试里面用的一种技术(mock)是很相似的。都是模拟一个东西出来,不需要实现内部的功能,只需要把接口定义好,然后设计一些输入输出就好了。

一个软件,其实是由数据+程序实现。所以也就有以下两种覆盖。

数据覆盖(Data Coverage)
1.数据流(Data Flow) – 对于黑盒测试,我们只知道输入数据和输出数据,我们对这一对数据的中间处理是一无所知的,但是在运用白盒测试的技术以后,我们可以对中间的变量转换还有变化会有一个清晰的了解。正是基于对这些的了解,所以我们可以修改或者增加一些Test Case来对那些风险比较高的地方进行充分的测试,不要忽略了白盒测试的优势–对内部的了解。
2.次边界值(Sub-Boundaries)
3.公式(Formulars)和等式(Equations)-这里面可以考虑到如果一些公式里面用到除法,那么就应该考虑一下这个如果除数是0的时候程序有没有正确处理。
4.强制错误(Error Forcing)-这个就是刚开始说的需要强制的把一些flag改未错误的标记然后看看结果是否正确。不过这里需要知道做的要合适才行。就例如说前面一个例子,一个除数是N,而且N不是直接用户输入而且结果一些计算得出最后给赋值的,我们可以考虑N=0的时候有没有错。但是如果我们通过这个“强制错误”的方法,把N赋值为0,然后报错,这样子是不合理的。因为在生成N的时候有可能已经是经过检验的不可能出现N=0的情况,如果我们硬要把N赋值为0那么其实这不是一个有效的测试用例。

代码覆盖(Code Coverage)
通常做代码覆盖都需要用工具作为辅助~通过软件的帮助我们可以得到以下的信息:
1.软件的哪些部分我们没有覆盖到,我们需要补充更多的case来覆盖他
2.那些测试用例是冗余的,我们可以把那些冗余的case用等价类来减少case的数量
3.对于覆盖率不高的模块可以增加case来覆盖

语句覆盖(Statement Coverage)行覆盖(Line Coverage)
这个是代码覆盖里面最简单的覆盖,而且要做到100%的语句覆盖是比较容易的,不过意义不大,以为即使做到100%覆盖,还是没法很好的检查软件,因为大部分的错误都是逻辑错误。

分支覆盖(Branch Coverage)判定覆盖(Decision Coverage)
似的程序中的每个判断至少取真分支和假分支一次。做到100%的判定覆盖是有可能的。不过对于符合条件(就是出现 IF A AND B AND C)分支覆盖会在其中一个组合中被测试到。这是分支覆盖的一些弱点。

条件覆盖(Condition Coverage)
条件覆盖要求是每个判断中的每个条件的可能只至少满足一次。例如(IF A AND B)那么需要有1) A=TRUE,B=FALSE,2)A=FALSE,B=TRUE。这样就完成了,这2个测试用例达到了条件覆盖的要求但是可以看看,没有达到分支覆盖。

Share and Enjoy:
  • RSS
  • Google Bookmarks
  • Digg
  • del.icio.us
  • Facebook
  • 豆瓣
  • 豆瓣九点
  • FriendFeed
  • LinkedIn
  • Live
  • Ping.fm
  • QQ书签
  • Twitter

Related posts:

  1. 《Software Testing》第五章 – 黑盒测试
  2. 用PDB库调试Python程序
  3. 《Software Testing》(软件测试)读书笔记系列 – 第十六章