En provenance du cours de Nanjing University
软件测试 (Software Testing)
从认识和理解软件Bug开始,介绍软件测试的基本理论,阐述软件测试设计的多样性原理。基于多样性原理,介绍白盒测试方法和黑盒测试,具体包括随机测试、等价类测试、控制流测试、数据流测试等;邀请业界专家讲解功能测试、性能测试、移动应用测试技术。
À partir de la leçon
软件测试基础
本节主要熟悉课程系统,了解测试基本概念,重点理解Bug及其测试原理。
Rencontrer les enseignants
Zhenyu Chen
Associate Professor
Software Institute
我们回顾一下
它的三个经典的定义
Fault是指静态存在
在代码当中的缺陷
Error是指在执行到
这个缺陷的时候
产生了一个错误的中间状态
Failure是指这个错误的中间状态
传播出去
被测试人员或者用户观测到
我们通过这个构建PIE模型
使得整个测试来发现这个
Failure
进一步确定Fault
当程序员看到一个缺陷代码
如何确定这就是Fault
Error 比如程序员
在应用断点调试的时候
如何来断定这个状态
Failure 假如我们是有一个
正确的规格文档
通过规格文档和输出的比较
来判定是否是Failure
相对于前两者更加容易
和更加可行
接下来
我用一段小程序来演示
程序员是如何确定
这是一个Fault
当程序员去做Code Review
或者其他时候
觉得这段代码可疑
通过追踪它的整个传播链
我们来确定这个第四行
好像真的就是一个Fault
所以这时候程序员会断定
刚才修改的第四行代码
就是所谓的Fault
这个简单的例子展示了程序员
是如何发现可疑的代码
如何用测试进一步验证
如何通过修复
确定这就是一个Fault
我们来看这里会存在哪些问题
但刚才的过程
好像Fault其实是通过修复来定义
也就是我们通过修复
发现测试
从Failure到Pass
有一个程序员是修改了
第四行代码
使得原来Failure变成Pass
所以他断定第四行
是一个Fault
他可能修改了第三和第五行代码
同样可以使得这个测试
从Failure变成Pass
那我的问题就是
到底是第四行是Fault
还是第三 第五行代码
是Fault
因为通常程序员认为
一个极小的修复更像一个Fault
假如你对整个程序改变很大
那这么复杂的Fault
可能看起来不像一个Fault
刚才那段代码
测试人员跑3和5
发现输出是3
跟预期的5不一样
所以他发现了一个Failure
依然是第五行
依然是MX=Y修改为MX=X
但是测试 3和5的测试
修改为5和3的测试
我们这个修复
可以使得原来Failure的测试
变成Pass
所以对于这样的一个测试
程序员可能会判断
第五行是Fault
所以通过这个例子
我们可以发现即使是
相同的一个修复
由于不同的测试
也可能使得测试人员
断定Fault与否的结果完全不一样
有时候我们很难判断
这是一个Fault还是两个Fault
我们依然拿刚才的例子
输入测试3和5
重新执行测试
发现Pass
好像第三行是一个Fault
在修复以后的程序执行
发现结果是3 Failure
那这时候程序员可能会觉得
是不是还有其他的Fault呢
所以他把第五行MX=Y
修订为MX=X
重新执行第二个测试
好 这时候它看起来是
两个Fault
但对于另外一个程序员
依然是刚才的例子
依然是这么一个计算两个值
当中的大的这么一个小程序
这时候程序员有可能
会觉得我可能修改对了
但是修改得不够完整
所以这时候他断定3和5的代码
共同构成了一个Fault
也就是在这个过程当中
他会判断为这是一个Fault
大家有没有发现我们讲了
这么几个章节
到现在为止
我们依然搞不清
什么叫一个Fault
什么叫两个Fault
我们把刚才的程序
扩充为3个数
即输入3个数输出最大的一个
第一列程序是正确的
所以输入测试2 5 3
它应该输出5
中间的那段代码
第五 第七行发生了Fault
所以对于第一个测试2 5 3
它是Pass
对于第二个测试 它是Failure
我们来看第三段代码
它只有第五行只有一个Fault
大家有没有发现
只有一个Fault的时候
它两个测试都Failure
而它有两个Fault的时候
它有一个是Pass一个是Failure
也就是第二个Fault
其实干扰了第一个Fault
使得在对于第一个测试的时候
原来的Failure变成Pass
我们可以构造更复杂的例子
更多的测试
使得Pass和Failure之间
在Fault之间会互相干扰
课后作业我们会留若干道
这样的例题
给大家作为练习
所以这一节
我的目标是让大家明白
其实我们不明白什么叫BUG
也就是这里的Fault