Complexity of Testing Software
- the term correctness has no meaning
- Instead considering reliability, safety, maintainability, security, and efficiency
关于正确性
-
更多是用来描述古典科学
- 数学模型正确
- 。。。。
-
Better viewpoint: a relative term — program P is correct with respect to specification S.(软件测试的对于正确的描述)
-
Bottom Line: Do the specification and the program meet the customer/user’s expectations?
程序的行为空间
说明中有的,但是程序中 未实现叫作缺陷故障,程序实现的,但是并不在预期范围的,叫作过失故障
我们需要测试正确性的部分,是S和P相交的部分,我们希望S和P的交集越大越好
规定行为、实现行为和测试行为:
目标范围是1的范围,程序说明中说明了,程序也实现了,测试时也测试了1,我们需要尽量扩大1的范围
左为基于规格说明的测试,右为基于代码的测试
基于规格说明的测试:
基于规格说明不需要知道它的具体实现,只考虑是否实现了预期目标。(黑盒测试)
经典测试类型:
- Boundary Value Testing(基于边界值的测试)
- Equivalence Class Testing(基于等价类的测试)
- Decision Table-based Testing(决策表的测试)
优点:
- 测试与具体实现方法无关(更改实现方法后,测试用例依然可以用)
- 测试与开发并行
A对于1的测试范围更大,但是冗余范围更大?(猜测)
附:从图中可以看出,基于规格说明的测试方法只会在规格说明的范围内,不会超出这个范围
基于代码的测试(Code-based testing)
也叫做结构化测试、白盒测试、玻璃盒测试
包括:
- 基于图的测试
- 基于数据流的测试
优点:
- 有很强的理论基础
- 允许定义和使用测试覆盖指标
- 能够明确地表示 软件被测试程度
测试方法A更好。
附:基于代码的测试方法只会在代码范围内,而不会超出范围,因为压根不知道规格说明是什么
两种测试方法的比较
黑盒测试是建立可信度,白盒测试则是为了寻找代码故障
如果程序做了不该做的事情,spec-based无法测试出来。
如果有些行为规定了,但是没有实现,黑盒测试没法测出来
要将两种测试方法结合起来
软件测试基础
测试只能找到失效的存在,如果测试通过,不能说明没有失效
Testing & Debugging
- 测试:通过观察软件的执行以评估软件
- Test Failure 测试失效: 执行测试用例后导致软件 失效
- 调试:在软件失效的情况下,寻找软件故障的过程
故障与失效模型(RIPR)
Four conditions necessary for a failure to be observed
- Reachability 可达 测试用例必须要到达故障相应的代码(测试用例跑不到故障代码)
- Infection 影响 故障执行以后必须导致一个不正确的状态
- Propagation 传播 导致的不正确的状态必须要传到output这里来
- Reveal 揭示 必须要被观察到(比如观察的值是a, b, c,但是出错的值是d,则此时无法观察到)
经典:执行故障:代码运行到错误的地方
产生错误状态:与原来运行的状态不一样(中间变量值不同等等)
Traditional Testing Levels:
- unit testing 每个方法测试清楚
- Module testing 将每个模块(C的文件 java的类)测试清楚
- Integration testing 集成测试 每个单元之间的交互、通信、调用的测试清楚
- System testing 系统测试
- Acceptance testing 验收测试
Object-Oriented Testing Levels:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A0Dtqf35-1583717773055)(F:\WHU\大三(下)\我\软件测试技术\课件\chapter2\image-20200224092648868.png)]
Coverage Criteria 覆盖准则
即便是一个很小很小的程序,它也具有太多种输入方式才能够完全测试到
比如对于一个算均值的函数,有三个输入值A,B,C,对于A,B,C有很多很多的值,几乎无法穷尽
覆盖准则的作用
- 使用最少的输入发现最多的问题
- 给了测试者一种结构化可实现的方式去
- 完全搜索输入域
- 判断在测试中没有更多的情况
覆盖准则的优点
测试需求和准则
- 测试需求:测试用例必须满足或覆盖的软件工件的指定元素
- 覆盖准则:一条或一组生成测试需求的原则
覆盖准则就是指:测试需要以什么样的原则去覆盖(覆盖每个语句?每个路径?每个需求?)
而测试需求就是指:在这个原则下,需要覆盖的那些对象
- 完全搜索输入域
- 判断在测试中没有更多的情况
覆盖准则的优点
测试需求和准则
- 测试需求:测试用例必须满足或覆盖的软件工件的指定元素
- 覆盖准则:一条或一组生成测试需求的原则
覆盖准则就是指:测试需要以什么样的原则去覆盖(覆盖每个语句?每个路径?每个需求?)
而测试需求就是指:在这个原则下,需要覆盖的那些对象