一、为什么测试软件

1.1 软件何时会出现问题

三个定义
软件故障: 软件中一个静态的缺陷
软件错误: 软件运行中一个不正确的内部状态,这是某个故障的表现
软件失败: 一个与软件需求或是预期行为描述不相符的、外在的行为
打个比方,病人去医院看病是带有一些外在的症状(软件失败)的,医生需要发现症状的根源(软件故障)。为了帮助诊断,比如高血压,心律不齐,高血糖或者高胆固醇,这些不正常的内部状态就是软件错误
这其中有个关键的区别是软件故障时设计失误,这些故障不是自发出现的,而是人为造成的。我们可以使软件开发近乎完美,但是不能做到绝对的万无一失。
下面是一个有关故障,错误和失败定义更加详细的例子。在此之前,我们先阐明一个关于状态的概念。在程序执行中,程序状态被定义为所有动态变量的当前值和程序运行的当前位置。这个当前位置是由程序计数器来提供的。程序计数器是程序中将被执行的下一条语句。这里用文件中的行数(PC=5)或是把语句写成字符串(PC=“if(x>y)”)来表示程序计数器。

在大部分情况下,大家很明白它指代什么。但是对于复杂的结构(例如for循环),

for(i = 1; i < N; i++)

事实上有3个语句,分别会导致不同的状态。循环初始化和循环判断条件是分开的,在每一次循环的末尾,循环增量(“i++”)才会被执行。
下面给出一段java函数:

//计算数组中0的总数
public static int numZero(int[] x)
{
    int count = 0;
    for (int i = 1; i < x.length; i++)
    {
        if (x[i] == 0)count++;
    }
    return count;
}

这个方法的故障就在于它是从索引1而不是索引0开始寻找数组中的0。举例来说,[2, 7, 0]返回1是正确的,[0, 7, 2]返回0是不正确的。这两个测试用例都执行了有故障的语句,虽然两个测试用例都产生了错误,但是只有第二个导致了失败。如果一个状态与预期不符合,那么它就是错的,如果整体不符合预期,即使在这个状态中每个变量值单独考虑是对的,这个状态依然是错的。

1.2 软件测试的目的

很多软件工程师并不清楚他们测试的目的是什么。是确认软件正确,是找出其中的问题,还是别的目的?首先我们必须要区分验证和确认。
验证: 在软件开发中,决定一个阶段的产品是否满足前一阶段需求的过程。
确认: 在软件开发的尾声,评价软件是否和预期用途相一致的过程。

验证通常会更具有技术含量,因为它用到了单个软件工件、需求和规范的知识。确认通常依赖于领域知识,即软件所应用领域的专业知识(飞机软件系统需要航空工程师和飞行员的专业知识)。
缩写“IV&V”指代的是“独立验证和确认”。独立是指由非开发人员来完成软件评价。独立验证和确认小组有时候来自同一个项目,有时候来自同一个公司,有时候全部来自公司外部的第三方评价机构。这样做的部分原因是“独立验证和确认”的独立本质。“独立验证和确认”通常在软件开发结束之后开始,并且验证和确认的专家来自软件的应用领域而非开发领域

Beizer依据一个机构的测试过程成熟度级别来论述测试的目的,而测试工程师的目标反映了每一级别的特征。Beizer定义了5个级别,而最低的级别都不值得给一个正数的符号。
第0级:测试就是程序调试。
第1级:测试的目的是显示程序的正确性。
第2级:测试的目的是找出软件失败。
第3级:测试的目的不是要证明一些具体的成功或是失败,而是减少使用软件的风险。
第4级:测试时一种精神上的修行,这种修炼可以帮助所有IT专业人员开发出质量更好的软件。

越早测试越好
测试的目的就是尽可能地消除故障,越到开发晚期发现和修复故障的代价越大,我们不可能做到完美,但是在单元测试或是更早的时候每消除一个故障都是在省钱。

你可能感兴趣的:(软件测试基础,软件测试)