并发程序测试概述

来源:互联网 发布:au怎么汉化软件 编辑:程序博客网 时间:2024/04/19 14:36

一  传统程序测试:

(一)是否关心软件内部和实现划分:

1.黑盒测试:又称功能测试,通过测试来检验每个功能是否正常。从用户的角度,从输入数据和输出数据的对应关系出发进行测试。

2.白盒测试:又称结构型测试,按照程序内部的结构来测试程序。六种:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖发现错误的能力呈由弱至强的变化。

3.灰盒测试:是介于白盒测试与黑盒测试之间的,可以这样理解,灰盒测试关注的是输出对于输入的正确性,同时也关注内部表现。


(二)从是否执行程序来划分:

1.静态测试:是指不运行被测程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性。对需求规格说明书、软件设计说明书、源程序做结构分析、流程图分析、符号执行来找错。

2.动态测试:指通过运行被测程序,检查运行结果与预期结果的差异,并分析运行效率和健壮性等性能,这种方法由三部分组成:构造测试实例、执行程序、分析程序的输出结果。


(三)从软件开发阶段划分:

1.单元测试

2.集成测试

3.确认测试

4.系统测试


二 并发程序测试:

(一)并发程序测试概述:

1.并发测试过程中,不仅需要检查程序输入和输出结果的正确性,还需要验证并发程序中某些同步序列的正确性。同步序列:并发程序的一次执行过程中,由一些并发单元之间的交互或同步活动形成的序列。

2.并发错误类型:

*根据规格说明和程序实现的一致性要求,可将并发程序的同步序列分为有效同步序列和可行同步序列。

*有效同步序列:给定某并发程序CP和输入X,若同步序列Q被程序规约允许,则称Q是CP的有效同步序列。

*可行同步序列:若同步序列Q被程序实现允许,则称Q为可行同步序列。反之,不可行。

*当满足下述任一条件时,并发程序在输入X下是错误的:在输入X下至少有一个同步序列可行但不是有效,或者至少有一个同步序列有效但不可行。

*在所有可能的输入的条件下都是正确的,那么并发程序CP是正确的。


(二)非确定性测试:

1.不确定性测试使用的测试输入不包含任何同步序列信息,除了对被测程序提供必要的输入数据,它不控制被测程序的具体执行过程。不确定性测试期望通过并发程序的多次执行尽可能多地执行不同的同步序列,以增加发现错误的机会。


2.非确定性测试的步骤:

*选取一组输入数据;

*使用输入数据执行被测并发程序,记录每次执行的输出数据和执行的同步序列;

*判断输出数据是否正确以及对应的同步序列是否有效,如果输出数据不等于预期结果或者同步序列无效,都表示并发程序中存在错误。

*重复2到3,直至到达结束条件。


3.非确定性测试的问题:

*同一输入下并发程序的一部分同步序列可能重复执行,而另一部分同步序列可能从未得到执行,测试效率低且充分性得不到保证。

*非确定性测试是基于程序实现的测试方法,不能检测出规格说明有效但是不可行的同步序列。


(三)确定性测试:

1.确定性测试:在给定测试输入下通过程序运行时控制技术,使其按照给定的同步序列执行,从而检查程序的输出结果是否正确,并判断给定的同步序列(有效)是否可行。

2.确定性测试步骤:

*选取一组输入数据和一个同步序列集合;

*控制并发程序在给定输入下按照同步序列集合中的同步序列执行;

*将程序执行结果与预期结果比较,除了要检查程序输出是否为预期输出外,还要检查程序是否能够执行给定的同步序列。如果输出数据域预期输出不符或同步序列不可行,都表示并发程序存在错误。

*重复执行2和3,直到在任意输入数据下同步序列集合中的同步序列都已执行。

3.确定性测试的问题:

*同步序列的选取是难点。

*确定性执行被测程序的技术实现:目前有两种方法。第一种,通过语言自身提供的机制确定化程序事件的执行顺序,即基于语言的方式。第二种,通过修改编译器或底层操作系统确定程序的执行过程,即基于实现的方式,对java而言就是修改java虚拟机。

*基于语言的方式:易于实现,但对被测程序插装可能引入新的错误。

*基于实现的方式:无需修改被测程序,但实现难度大,不易实现。


(四)可达性测试:

(1)定义:可达性测试结合了确定性测试和非确定性测试的优点,动态生成被测程序的同步序列,而且在给定输入的前提下能够穷尽被测程序的可行的同步序列。(这样就可以判断可行的同步序列是否是有效的,从而判断并发程序是否有错,所有可行的同步序列包括所有有效的同步序列)。

(2)可达性测试的步骤:

*给定输入下,以非确定性测试执行被测并发程序,收集执行的同步序列。

*对收集到的同步序列执行竞争分析,计算出竞争变体。

*以竞争变体为前缀确定性执行被测并发程序,然后以非确定性方式执行程序后续部分,收集执行的同步序列。

*对每一个新的可行的同步序列,重复执行2和3,直到给定测试输入下没有新的可行的同步序列产生。