10.1 能否跳过测试

2013-10-07 12:59:37 · 作者: · 浏览: 84

第10章 并行程序的测试和逻辑容错

第8章介绍了应用程序的谓词分解结构(PBS)和并行应用程序设计层(PADL)分析模型。这些是自上而下的方法,用来产生有着并发或并行编程(www.cppentry.com)要求的应用程序的声明式架构。PBS和PADL的最终目标之一就是为应用程序的并发要求建立占有链(chain of possession)或审计追踪(audit trail),它们引导了如何从解决方案模型转换到操作系统级的线程或进程。本章中将把PBS和PADL分析同应用程序的软件测试及异常处理关联起来。PBS和PADL告诉您应当对哪些方面进行测试以及什么构成了错误或异常。您可以使用异常处理来为声明式架构提供一种逻辑容错。也就是说,如果应用程序由于未知的或不可控制的原因违反了PBS中的陈述、断言、规则、谓词或约束,您希望抛出异常然后体面地退出,因为一旦违反了谓词,那么应用程序的正确性、可靠性和含义都会被损害。

本章还将介绍应当作为任何软件开发生命周期(Software Development Life Cycle,SDLC)的一部分的各种类型的测试,尤其是对于那些需要进行并行编程(www.cppentry.com)的软件开发。我们将解释什么是异常处理、异常处理与错误处理之间的区别有哪些以及多线程和并行编程(www.cppentry.com)的一些问题。我们还将简要介绍模型检测(model checking)的概念、可能世界语义(possible-world semantics)同并行编程(www.cppentry.com)的声明式解释的相关性以及如何将它们应用到测试和异常处理。

具体来讲,本章将讲述以下内容:

将PBS和PADL分析同应用软件测试及异常处理关联起来

对应当是任何SDLC的一部分的各种类型的测试进行说明

定义异常处理以及错误处理与异常处理之间的区别

介绍模型检测的概念以及可能世界语义同并行编程(www.cppentry.com)的声明式解释的相关性

10.1  能否跳过测试

对软件进行测试的目的是为了确保软件所做的事情恰好是您所希望的。应用程序往往被要求为所需功能的列表。这个列表可以表现为由上百页组成的正式规范,或者可以像雇主口头提出十余条详细要求那样简单。不管对软件的要求列表是如何产生的,测试过程必须确保软件能够满足这些要求,并且这些要求能够满足用户的期望。在涉及并行计算机或多处理器的许多场合,用户的期望包括性能提高或特定级别的高性能吞吐能力。当为了满足用户期望而加入多线程或多处理时,软件错误的种类会增加。当软件不按照规范执行时,软件就会处于错误状态,即使违背规范的表现是系统执行速度过慢。需要并行编程(www.cppentry.com)的软件非常难以测试与调试。测试与调试位于第3章讨论的并行编程(www.cppentry.com)的十大挑战之中。测试与调试多线程或多处理程序所特有的一些主要问题是:

模拟最小到最大的容积负荷(volume load)

在调试期间复制精确的控制流

在调试期间复制竞争条件错误

复制全系统的进程竞争和线程竞争

寻找隐藏的不安全线程函数

测试与调试非确定算法

证明在软件中不可能出现死锁或数据竞争

模拟边界和平均负荷的混合

当上百或上千个线程或进程运行时,检测中间结果

确定要产生可接受的性能所需要的线程或进程的准确数量

第8章中介绍的PADL和PBS分析建立了初步的并发底层结构(infrastructure)、测试阶段确认(validate)和验证(verify)的实现模型。声明式方法和基于谓词的方法使得它们成为模型检测和测试的更加自动化的形式。声明式的设计带来声明式的实现。声明式的实现使得中等规模到大规模并行程序的测试复杂度位于软件开发者的能力范围之内。无论测试或调试过程的复杂性有多大,其目标是无错且容错地部署软件。测试过程必须找到每个错误和软件缺陷,并将它们去除。

关于程序员道德规范和软件可靠性的公共服务声明

本书中的代码实例很少包含或不包含错误及异常处理。这是因为代码实例仅用于说明目的。我们希望代码实例保持简短,并且不希望将读者的注意力从要展现的概念转移。然而,真实世界的应用程序必须是"防弹的"(bulletproof)。因为作为软件开发者,我们生产应用于医药、制造业、国家安全、交通、金融、教育、科学研究、商业所有领域的应用程序,我们有着伦理和道德上的责任来生产安全、正确、可靠、容错的软件。否则就是玩忽职守。