计算机科学领域的一条定律是世人对更高性能的追求永远不会满足。如今,这些需求不仅仅针对速度,而且还针对体积更小、功能更加强大的移动设备。为了满足不断增长的用户期望,IDC 公司预期原始设备制造商 (OEM) 将会选择速度更快的多核处理器来支持他们的设备。在这种背景下,并行程序将在移动设备中大量使用以充分利用多核技术。

  测试是软件开发周期中成本高的阶段之一。大型软件厂商将其开发成本的 50% 用在测试上。如果我们再考虑并行软件,该成本将进一步增加。这样的预算成本使得选择一种高效、合适的测试方法对于任何软件开发战略都变得至关重要。

  在前面的几篇文章中,我们讨论了如何将应用从串行编程移植到并行编程以及如何为并行优化做准备。本文的目的是简单介绍几种不同的并行软件测试方法。

  通常而言,并行程序可使用三种高级方法来测试:

  黑盒测试:这一方法对应用的功能进行测试,无需对并行应用代码的具体了解。黑盒测试的局限性在于我们不知道覆盖了多少代码。为了克服这个缺点,可使用测试数据充分性准则来规划要测试的对象。另一方面,这一方法的优势在于它能够轻松实现自动化。另外,由于它无需涉及有关程序结构的信息,因此比白盒测试更省力。

  白盒测试:这一方法对用于实施软件功能的并行源代码和算法进行测试。在白盒测试中,需要对系统内部和数据结构有所了解,以及具备一定的并行编程技巧(用于设计测试案例)。测试人员需要规划使用哪些输入以检验代码路径并确定合适的输出,从而确保功能正常运行。要使用这一方法,不仅需要耗费较多精力,而且需要娴熟的技术人员。

  尽管白盒测试能够应用于软件测试过程的不同系统级别,但通常应用于单元级测试。它能够测试单元内的路径、单元之间的路径(集成中),还能在系统级测试中测试子系统之间的路径。尽管这一方法能够发现许多错误或问题,但却可能无法发现规格的未实施部分或遗漏的需求。

  混合法:这种方法是黑盒测试法和白盒测试法的组合。这一方法通常在使用专用库来实施并行算法的某些部分或出于测试战略目的时使用。

  测试战略

  测试并行程序主要有四种战略:

  压力测试:压力测试重点关注在繁重工作负载之下的稳定性、可用性和错误处理能力,而非被视作正常情况下正确行为的一些问题。具体而言,并行测试的目的是发现少见的交错并确保软件不会在计算资源不足的情况下发生崩溃。

  系统测试:系统测试是一种符合性软件测试方法。系统测试中,根据测试假设条件,被测试单元需显示是否完全符合规格。实施系统测试的一种方法是使用模型检查器机制。这一工具有助于针对特定的输入数据系统地探索不同的线程交错。

  随机测试:随机测试的目的是随机挑选交错以测试行为。需要重点关注的是主动测试。主动测试分两个阶段进行:首先,它利用预测性商业化静态或动态程序分析来识别可能的并发性错误,如数据竞争、死锁和违反原子性。在第二个阶段,主动测试使用来自预测性分析的报告来明确控制并发程序的底层调度程序以准确、快速地发现实际的并发性错误(如果有)。这种测试发现问题的可能性极高,开销却较低。

  直觉驱动测试:使用这种战略时,测试人员对怀疑存在问题的调度进行仔细规划。通常而言,这种测试需要测试人员主要从剖面和分析的角度来理解程序。

  规划和测量

  并行应用测试的第一步是通过确定可接受的性能阈值来设置和合适的性能期望。这些阈值应当在项目规划阶段确定,并将作为产品的非功能性需求来实现。

  在阈值确定期间,架构师应当确定测试生命周期中将要收集和测试的指标。用于测量应用性能的指标有多种:单项任务的挂钟时间(也称作周转时间)、多项任务的挂钟时间(吞吐量测量)、MFLOPS(每秒百万浮点运算次数)比例、内存使用量、I/O 利用率、MIPS(每秒百万指令数)和网络使用等等。因此,根据应用的特征来确定使用什么指标非常重要。

  此外,测试规划中非常重要的一点是确定执行测试用例时将要使用的数据集。数据集和执行环境应当慎重选择,并应能够充分代表应用的实际使用情况。性能指标评测测量应当使用相当的数据集和设置环境来执行。另外,建议您在从一个实验转到另一个实验时,仅更换一个变量(例如,编译器标志或系统设置)。这样做有助于将性能改变的效果与性能变量的更改关联起来。对于利用不同工具或技术获得的数据应尽可能进行交叉检查。

  总之,测试是软件开发中成本高的阶段之一。因此,选择一种经济高效的战略非常重要。本文介绍的方法和技巧将能够帮助为特定项目确定合适的测试方法。