软件测试:调试

合集下载

如何进行软件测试和调试

如何进行软件测试和调试

如何进行软件测试和调试软件测试和调试是在软件开发周期中至关重要的环节。

它们被用来发现和纠正软件中的错误和缺陷,确保软件的稳定性和可靠性。

本文将探讨一些常见的软件测试和调试方法,帮助读者更好地理解和应用它们。

一、单元测试单元测试是软件测试中的基础,它主要用来测试代码的独立单元(函数、方法、类等)是否按照预期工作。

单元测试通常是由开发者编写的,通过传入不同的参数,检查程序的输出是否与预期一致。

单元测试有助于发现代码逻辑错误和边界条件问题,帮助开发者更快地定位和修复bug。

在编写单元测试时,需要考虑覆盖率和边界情况。

覆盖率指的是测试用例是否覆盖了代码的所有分支和条件,边界情况指的是在边界值处进行测试,例如输入最小值、最大值、边界值等。

这样的测试策略可以帮助发现隐藏的错误和漏洞。

二、集成测试集成测试是测试软件模块之间的接口和协作,确保它们能够正确地配合工作。

集成测试可以分为自顶向下和自底向上两种方法。

自顶向下的集成测试从高层模块开始测试,逐步向下测试,直到覆盖所有模块。

自底向上的集成测试则从底层模块开始,逐步向上测试。

在进行集成测试时,需要模拟真实的环境和交互条件。

使用模拟数据、模拟网络和模拟用户行为等技术可以帮助开发者尽早发现和解决集成问题。

此外,也可以使用自动化测试框架来提高测试效率和准确性。

三、系统测试系统测试是对整个软件系统的测试,主要关注系统是否满足用户需求和预期功能。

系统测试通常由测试团队完成,模拟真实用户场景,测试整个系统的性能、稳定性和安全性。

系统测试可以分为功能测试、性能测试、安全测试等。

在进行系统测试时,需要有一个详细的测试计划和测试用例,覆盖系统的各个功能和场景。

同时,也需要有可靠的测试环境和测试数据,以确保测试的准确性和可重复性。

持续集成和持续部署技术可以帮助开发者更好地进行系统测试,并及时修复和发布软件版本。

四、调试技巧调试是在软件开发和测试过程中常常用到的技巧,它能帮助开发者定位和修复bug。

如何进行软件测试与调试

如何进行软件测试与调试

如何进行软件测试与调试在当今数字化时代,软件的应用已经渗透到了我们生活的方方面面。

无论是手机应用,还是电脑软件,几乎每一个我们所使用的产品背后都隐藏了大量的代码。

而软件的可靠性和稳定性对于用户来说至关重要,而这正是软件测试与调试所涉及的领域。

本文将探讨如何进行软件测试与调试,以确保软件的质量和效果。

软件测试是软件开发过程中不可或缺的一步。

它的目的是发现并修复软件中的错误和缺陷,确保软件的功能正常运行。

其中,黑盒测试和白盒测试是两种常见的测试方法。

黑盒测试基于测试者对于软件的需求和功能的理解,通过输入特定的数据或操作来检查软件的输出结果是否符合预期。

白盒测试则是基于对软件内部结构和代码的理解,通过检查代码的覆盖率和逻辑正确性来判定软件的质量。

在进行软件测试之前,我们应该先制定测试计划。

测试计划包括测试目标,测试资源和计划,测试环境等方面的详细信息。

这将帮助测试团队明确任务和目标,并合理分配资源。

在制定测试计划时,我们要考虑不同的测试技术和方法的选择。

例如,功能测试、性能测试、安全性测试等,可以根据实际情况选择合适的测试方法。

在进行功能测试时,我们应该首先确定测试用例。

测试用例是一组输入值和预期输出的组合,用于检查软件功能的正确性。

测试用例应该覆盖软件的各个方面和功能模块,并尽可能覆盖边界条件和异常情况。

同时,我们还可以使用自动化测试工具来提高测试效率和准确性。

自动化测试工具可以记录和执行测试脚本,节省测试人员的时间和精力。

此外,在进行性能测试时,我们应该模拟真实的使用场景和负载,以评估软件的性能和响应能力。

性能测试可以测试软件的并发性、吞吐量和响应时间等指标,以确保软件在实际使用中能够满足用户的需求。

在进行软件调试时,我们需要确定问题的根本原因并解决它。

调试的过程通常包括错误定位、错误收集和错误修复。

错误定位是找出问题所在的过程,可以通过查看日志文件、跟踪代码执行流程等方式来定位错误。

错误收集是收集有关错误的相关信息,例如错误代码、堆栈跟踪等。

软件测试与调试

软件测试与调试

软件测试与调试在软件开发的过程中,软件测试与调试是不可或缺的环节。

其主要目的是确保软件的质量,减少错误并提高软件的可靠性和性能。

一、软件测试的概念与分类软件测试是指通过一系列的活动和过程来评估软件的特性和性能,以确定其是否满足预定要求。

根据测试的对象和手段的不同,软件测试可以分为功能测试、性能测试、安全测试等多个分类。

功能测试主要针对软件的各项功能进行测试,确保软件按照需求规格说明书的要求正常运行。

性能测试用于评估软件的性能指标,如响应时间、吞吐量等。

安全测试则是对软件的安全性进行评估,确保软件在各种安全威胁下能够正常运行。

二、常见的软件测试方法1. 黑盒测试黑盒测试是一种针对软件功能进行测试的方法,测试人员只关注软件的输入和输出,而不关心内部的实现细节。

通过设计各种测试用例,测试人员可以评估软件在不同输入情况下的输出是否符合预期。

黑盒测试适用于各种软件开发阶段,并且可以帮助测试人员发现可能存在的功能缺陷。

2. 白盒测试白盒测试是一种测试方法,测试人员需要了解软件的内部实现以及代码逻辑。

通过检查和执行软件的代码,测试人员可以确定是否有潜在的错误和不一致。

白盒测试主要用于评估软件的可靠性和正确性。

3. 灰盒测试灰盒测试是黑盒测试和白盒测试的结合,测试人员部分了解软件的内部结构和实现细节,并进行相应的测试。

灰盒测试可以在功能测试和白盒测试之间取得平衡,减少测试成本并提高测试效果。

三、软件调试的流程与方法软件调试是在软件开发过程中用于诊断和修复程序中的错误和故障的过程。

调试的主要目标是找到错误的根源并进行修复。

软件调试的流程可以分为以下几个步骤:1. 定位错误在调试的过程中,首先需要确定错误的位置和类型。

通过观察错误的表现现象、分析日志和堆栈信息等,可以准确地定位错误的产生点。

2. 重现错误重现错误是为了确保错误可重现,这样才能进行进一步的调试和修复。

通过提供特定的输入、环境和操作,尽可能地重现错误,并观察错误的表现情况。

软件研发如何进行软件测试和调试

软件研发如何进行软件测试和调试

软件研发如何进行软件测试和调试随着科技的快速发展,软件在现代社会中扮演着越来越重要的角色。

然而,软件的研发过程中,难免会出现一些错误和缺陷。

为了确保软件的质量和稳定性,软件测试和调试变得尤为重要。

本文将介绍软件研发过程中的测试和调试方法,以及如何在实践中应用它们。

一、软件测试的意义和分类软件测试是指通过运行程序、收集测试数据来检验软件产品是否满足需求的过程。

它的本质是发现问题、预防风险和改进质量。

软件测试的意义在于:1. 验证软件是否符合用户需求,确保软件的质量和正确性;2. 发现和修复软件中的缺陷和错误,提高软件的可靠性;3. 预防和降低软件交付和运行过程中的风险。

根据测试对象和目标的不同,软件测试可以分为黑盒测试、白盒测试和灰盒测试。

黑盒测试着重于测试软件功能和接口,而不考虑内部实现细节;白盒测试则对软件的内部结构和逻辑进行全面的测试;灰盒测试则是黑盒测试和白盒测试的综合体,既考虑软件的功能,也考虑其内部细节。

二、软件测试的常用方法和技术1. 单元测试:针对软件中最小的可测试单元进行测试,如函数、类等。

通过构造各种测试用例,验证功能的正确性和边界条件处理是否准确。

2. 集成测试:测试不同模块之间的接口和交互,验证模块之间的数据传递和处理是否正确。

3. 系统测试:对整个软件系统进行全面测试,确保系统按照用户需求进行功能操作。

4. 性能测试:针对软件的响应速度、并发性能等进行测试,以确保软件在高负载情况下仍能保持稳定性。

5. 安全性测试:测试软件的安全性能,验证软件是否容易受到非法侵入和攻击。

6. 兼容性测试:测试软件在不同操作系统、硬件环境和网络条件下的兼容性,确保软件在各种条件下都能正常工作。

三、软件调试的基本步骤和技巧软件调试是指在软件测试过程中,通过定位和修复问题来确保软件的正常运行。

以下是软件调试的基本步骤和技巧:1. 问题复现:首先需要能够复现问题,即在相同的环境和操作下,问题能够可靠地重现。

软件测试与调试技术概述

软件测试与调试技术概述

软件测试与调试技术概述软件测试与调试技术是软件开发过程中不可或缺的环节,其主要目的是发现和纠正软件中的错误、缺陷、故障以及性能问题。

本文将对软件测试与调试技术进行概述,并介绍一些常用的测试和调试方法。

一、概述软件测试是通过对软件系统进行验证和评估,以确定其是否满足规定的需求、设计和功能的过程。

测试可以帮助确保软件的质量、可靠性和稳定性。

调试是在软件开发过程中识别、定位和修复软件中的错误和故障的过程。

测试和调试是互相补充的,通常在软件开发的不同阶段同时进行。

二、测试方法1. 静态测试静态测试主要侧重于对软件代码和文档的分析,以发现潜在的问题和错误。

常用的静态测试方法包括代码审查、需求分析、设计评审和文档验证。

2. 动态测试动态测试通过运行软件系统,并使用各种输入数据和场景,对其进行评估和验证。

常用的动态测试方法包括黑盒测试、白盒测试和灰盒测试。

- 黑盒测试黑盒测试主要关注软件系统的功能和用户需求,而不考虑内部实现细节。

测试人员根据需求和规范,设计测试用例,并执行这些用例来验证软件的正确性和完整性。

- 白盒测试白盒测试着重于检查软件系统的内部结构和逻辑。

测试人员通过分析源代码和程序控制流程,设计测试用例,并执行这些用例来发现潜在的错误和漏洞。

- 灰盒测试灰盒测试是黑盒测试和白盒测试的结合,既考虑功能需求,又考虑内部代码实现。

测试人员可以根据需求设计测试用例,并结合对源代码的理解和分析,发现潜在的问题。

三、调试方法1. 运行时调试运行时调试是在软件运行过程中发现和修复错误的方法。

通过使用调试工具和技术,开发人员可以在代码执行期间跟踪、监控和分析程序的状态和变量,以定位和解决错误。

2. 日志记录日志记录是一种常用的调试方法,通过在代码中插入适当的日志语句,记录程序的执行过程和关键变量的值。

开发人员可以根据日志信息来分析程序的行为,定位错误的发生位置。

3. 单元测试单元测试是对软件系统中最小单元(如函数或模块)进行测试的方法。

软件测试中的性能监测和调试工具

软件测试中的性能监测和调试工具

软件测试中的性能监测和调试工具在软件开发过程中,性能监测和调试是至关重要的一步。

为了确保软件的高效运行和稳定性,开发人员需要使用各种性能监测和调试工具。

本文将介绍几种常见的软件测试中的性能监测和调试工具,并探讨它们的优点和应用场景。

一、性能监测工具性能监测工具用于监测软件在不同负载下的性能表现,从而帮助开发人员发现并解决性能问题。

下面列举了几种常见的性能监测工具。

1.性能测试工具性能测试工具广泛应用于软件测试领域。

它们可以模拟多种负载情况,并监测软件的性能。

通过性能测试工具,开发人员可以了解软件在不同负载下的响应时间、吞吐量、并发性等指标,以便及时优化和调整软件。

2.性能分析工具性能分析工具可以帮助开发人员深入了解软件的性能瓶颈。

它们通过收集软件运行时的数据,分析各个模块的性能指标,并提供可视化的性能报告。

开发人员可以根据这些报告找到性能问题的根源,并进行优化。

二、调试工具调试工具用于定位和修复软件中的bug和错误。

在软件开发过程中,由于各种原因,软件可能会出现各种问题,如崩溃、死锁、内存泄漏等。

下面介绍几种常见的调试工具。

1.断点调试工具断点调试工具是调试工具中最基本、最常用的一种。

通过在代码中设置断点,开发人员可以逐行调试程序的执行过程。

当程序运行到断点处时,开发人员可以查看变量的值、调用栈信息等,从而找到代码的问题所在。

2.内存分析工具内存分析工具可以帮助开发人员查找和修复内存泄漏等问题。

它们可以监测程序在运行时的内存使用情况,并生成内存分析报告。

开发人员可以根据报告找到内存泄漏的地方,并进行相应的优化。

三、性能监测和调试工具的应用场景性能监测和调试工具在软件测试过程中有广泛的应用。

它们可以帮助开发人员发现和解决性能问题,提高软件的性能和稳定性。

1.在软件开发过程中,性能监测工具可以帮助开发人员评估软件的性能表现,找到性能瓶颈,并及时进行优化。

例如,在开发一个网站时,可以使用性能测试工具模拟多种负载情况,并监测网站的响应时间和吞吐量,从而确定网站是否能够承受大量访问。

软件开发工作内容和工作范围

软件开发工作内容和工作范围

软件开发工作内容和工作范围
软件开发工作的内容及工作范围主要包括系统分析、程序设计、软件
编码、测试、调试、维护等。

1、系统分析:需要分析用户的需求,实现业务逻辑,梳理系统框架,把握全局,把客户的需求、市场变化以及技术限制融入开发模式中,以便
于后期的实现。

2、程序设计:根据系统分析的结果,结合项目的需求,构建程序框架,开发出程序结构设计及接口文档,并做出相应的详细设计,细化系统
分析中的系统规划。

3、软件编码:根据程序设计所提供的框架,编写各种模块代码,然
后进行功能测试,确保每个模块的正确性。

4、测试:当软件完成编码阶段之后,进行完整的系统测试,从而保
证软件的可用性和可靠性。

5、调试:当系统测试发现存在错误或者问题时,需要及时进行调试,确保系统的可靠运行。

6、维护:完成软件的开发、测试及调试以后,需要进行常规的维护,以免出现新的bug。

总之,软件开发工作的内容及范围非常广泛,要求软件工程师拥有扎
实的专业知识,并具有良好的思维能力与设计能力,为客户提供优质的解
决方案。

怎样进行软件测试与调试

怎样进行软件测试与调试

怎样进行软件测试与调试如何进行软件测试与调试在当今数字化时代,软件已经渗透到了我们生活的方方面面,它为我们提供了便捷的服务和创新的功能。

然而,软件的质量往往是一个关键问题。

无论是为了确保软件的功能正常运行,还是为了保护用户数据的安全,都需要进行有效的软件测试和调试。

本文将探讨如何进行软件测试与调试的一些基本方法和策略。

1. 理解软件测试的概念软件测试是一种通过执行软件来验证其是否符合预期的过程。

它涉及到对软件功能、性能和安全性的评估,以确保软件的可靠性和稳定性。

软件测试将通过一系列测试用例和技术手段来检测错误和缺陷,并帮助开发人员进行修复和改进。

2. 制定测试计划在进行软件测试之前,制定一个详细的测试计划是非常重要的。

测试计划应该明确列出测试的目标、范围和时间表。

此外,还可以定义测试用例、测试环境以及测试所需的资源。

测试计划的制定有助于提高测试的效率和准确性,并为项目管理提供依据。

3. 选择合适的测试方法软件测试可以采用多种不同的方法和技术。

常见的测试方法包括单元测试、集成测试、系统测试和验收测试等。

在选择测试方法时,可以根据软件的不同阶段和特点来确定。

例如,在开发初期可以集中进行单元测试,而在软件完善后可以进行系统测试来模拟真实环境。

4. 使用自动化测试工具为了提高测试的效率和准确性,可以借助自动化测试工具来辅助进行软件测试。

自动化测试可以快速执行大规模的测试用例,并生成详细的测试报告。

常用的自动化测试工具包括Selenium、JUnit和Appium等。

通过使用这些工具,可以极大地减少人工测试的工作量,加快测试速度。

5. 进行边界测试和异常情况测试软件在正常使用过程中经常会遇到各种异常情况和边界条件。

因此,在进行软件测试时,特别需要重点测试这些边界情况和异常输入。

通过边界测试和异常情况测试,可以有效地发现潜在的错误和漏洞,并进行相应的修复和改进。

6. 与开发团队紧密合作软件测试和调试是一个不断迭代的过程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

软件测试:调试(DEBUGGING)简单地讲,调试是执行一次成功的测试之后所要进行的工作。

记住,所谓成功的测试,是指它可以证明程序没有实现预期的功能。

调试是一个包含两个步骤的过程,从执行了一个成功的测试用例、发现了一个问题之后开始。

第一步,确定程序中可疑错误的准确性质和位置;第二步,修改错误。

虽然调试对于程序测试来说非常必要、不可或缺,但它似乎是软件开发过程中最不受程序员欢迎的部分之一。

其主要原因可能包括以下几点:•个人自尊会从中阻挠。

不管我们是否喜欢,调试都说明了程序员并不完美,要么在软件的设计,要么在程序编码时会犯错。

•热情耗尽。

在所有的软件开发活动中,调试是最耗费脑力的苦差事,况且,进行调试往往经受着来自机构或自身的巨大压力,必须尽可能快地改正问题。

•可能会迷失方向。

调试是艰苦的脑力工作,因为发现的错误实际上可能会出现在程序的任何语句中。

也就是说,如果不首先检查程序,我们就不能绝对地肯定在一个薪金管理程序出具的支票中出现的数字错误不是由某个子程序引起的,该子程序要求操作员将一个特定的表格传输给打印机。

让我们以诊断一个物理系统为例子作对比,如汽车。

假如汽车在爬坡时熄火了(症状),那么我们可能会迅速而有效地排除掉某些部件——调频/调幅收音机、速度表或汽车门锁——引起该故障的可能。

根据我们对汽车引擎的整体了解,该故障一定是发生在引擎上,我们甚至可以排除掉某些引擎部件,如水箱和滤油器。

•必须自力更生。

与其他软件开发活动相比,关于调试过程的研究、资料和正式的指南都比较少。

尽管本书是关于软件测试的,并不讨论调试,但这两个过程显然是相互联系的。

针对调试的两个步骤,即错误定位和错误修改,对错误进行定位可能解决了95%的问题。

因此,本章集中讨论错误的定位过程,当然是假定某个成功的测试用例已经发现了一个错误。

7.1 暴力法调试(Debugging by Brute Force)调试程序的最为普遍的模式是所谓的“暴力”方法。

这种方法之所以流行,是因为它不需要过多思考,是耗费脑力最少的方法,但同时也效率低下,通常来讲不是很成功。

暴力调试方法可至少被划分为三种类型:1. 利用内存信息输出来调试。

2. 根据一般的“在程序中插入打印语句”建议来调试。

3. 使用自动化的调试工具进行调试。

第一种类型,使用内存信息输出(通常使用十六进制或八进制格式粗略地显示所有的存储区域)是最缺乏效率的暴力调试方法,原因如下:•难以在内存区域写源程序中的变量之间建立对应关系。

•即使对下复杂程度较低的程序,内存信息输出也会产生数最非常庞大的数据,其中的大多数都是与调试无关的。

•内存信息输出显示的是程序的静态快照,仅能显示出在某一个时刻程序的状态;为了发现错误,还需要研究程序的动态状态(随时间的状态变化)。

•内存信息输出很少可以精确地在错误发生的地方产生,因此无法显示在错误发生时程序的状态。

错误发生到输出内存信息这段时间之内程序执行的活动,可能会掩盖掉发现错误所需的线素。

•通过分析输出的内存信息来发现问题的方法并不大多(因此很名程序员都是密切注视,急切地渴望着错误能神奇地从内存信息输出中自行暴露出来)。

第二种类型,在失效的程序中插入输出变量值的语句,这种做法也不具有很强的优势。

它可能比内存信息输出要好一些,因为可以显示程序的动态状态,让我们检查的信息可以相对容易地与源程序联系起来。

但是这种方法同样也有很多缺点:•它不是鼓励我们去思考程序中的问题,而主要是一种碰运气的方法。

•它所产生的需要分析的数据量非常庞大。

•它要求我们修改程序,这些修改可能会掩盖掉错误、改变关键的时序关系,或者会引入新的错误。

•它可能对小型程序有效,但如果应用到大型程序,成本就相当高。

况且对于某些类型的程序,如操作系统或过程控制软件,这种办法甚至无法使用。

第三种类型,自动化调试工具的工作机制类似于在程序中插入打印语句,但是并不修改程序本身。

可以使用编程语言的调试功能,或使用特殊的交互式调试工具来分析程序的动态状态。

可能会用到的典型的语言功能有:产生可打印的语句执行轨迹的机制、子程序调用以及/或者对特定变量的修改等。

调试工具的一个共同的功能是可以设置断点,使程序在执行到某条特定语句或改动了某个特定变量的值时暂停执行,然后程序员就可以检查程序的当前状态。

同样,这种方法也主要是在碰运气,常常会生成数量过于庞大的无关数据。

这些暴力调试方法的主要问题在于:它们都忽略了思考的过程。

我们可以在调试程序和侦破谋杀案之间找出相似点来。

实际上,在几平所有的谋杀悬念小说中,谜案都是通过仔细分析线索,将表面上不重要的细节全联结起来而最终侦破的。

这不是一个使用蛮力的方法,要使用蛮力的是寻觅障碍物或搜寻财宝。

还有些证据表明,无论调试小组成员是富有经验的程序员还是学生,肯动脑筋而不是依赖别人帮助的人能够更快、更准确地发现程序错误。

因此,我们建(2)作为我们议仅在下列情况下使用暴力调试方法:(l)其他的方法都失败了:下面将会讨论的思考过程的补充,而不是替代方法。

7.2 归纳法调试(Debugging by Induction)很显然,认真的思考能够发现大部分错误,甚至不需要调试人员使用调试工具.归纳是一种特殊的思考过程,可以从细节转到全局,也就是从线索(即错误的症状,可能是一个或多个测试用例的结果)出发,寻找线索之间的联系。

归纳的过程如图7-1 所示。

图7-1 使用归纳法的调试过程归纳调试的步骤如下:1. 确定相关数据。

调试人员犯的一个主要错误是未能将所有可用的数据或症状都考虑进去。

第一步是列举出所有知道的程序执行的正确和不正确之处,这些不正确之处即是症状,让我们相信确实存在错误。

那些相似却不相同、且未引起症状出现的测试用例提供了额外的有价值的线索。

2. 组织数据。

记住,归纳意味着从特殊到一般,因此第二步是组织这些相关数据,以便观察线索间的模式,尤其重要的是要找到矛盾、事件,比如仅当客户的保险金账户收支不太平衡时出现的错误。

我们可以采用图 7-2 所示的表格来组织现有的数据。

“是什么”框列举的是总体的症状,“在何处”框描述了这些症状出现的地方,“多大程度”框描述了这些症状的范围和重要性。

注意“是”和“否’列,它们所描述的矛盾之处最终可能会导致对错误的假设。

图7-2 组织线索的一种方法______________________________________________________________________________________________________________3. 做出假设。

下一步是研究线索之间的联系,利用线索结构里可能的模式做出一个或多个关于错误原因的假设。

如果还无法做出推测,就需要更多的数据。

如果可能有多个假设存在,首先选择最有能的一个。

4. 证明假设。

考虑到调试在进行时所承受的压力,这个时期最主要的错误是忽略了这个阶段,直接跳到结论去改正问题。

但是在继续下一步之前,证明这些假设的合理性是非常重要的。

如果忽略了这一步,可能接下去只修改了问题症状,而没解决问题本身。

应将假设与其最初的线索或数据相比较,以此来证明假设的合理性,确定这些假设可以完全解释这些线索的存在。

如果无法解释,要么这些假设是无效的或不完整的,要么还有更多的错误存在。

举一个简单的例子、假设在第4 章描述的考试评分软件报告了一个明显的错误。

错误是在某些但不是所有情况下,中间值似乎不正确。

在某个特殊的测试用例中,有 51 名学生被评分。

正确打印出宋的平均分数为 73.2,但打印出的中间值是26 分,而不是预期的82 分。

经过对该测试用例及其他一些测试用例结果的检查,线索按图7-3 所示的形式进行组织。

图7-3 组织线索的例子下一步是通过寻找模式和矛盾之处,做出关于该错误的假设。

我们看到的一个矛盾是这个错误似乎出现在学生人数为奇数的测试用例中,这也许是个巧合,但看来很重要,因为我们要根据学生人数为奇数或偶数而不同地计算中间值。

还有一个奇怪的模式:在些测试用例中,计算出来的中间值总是小于或等于学生的人数(26 小等于 51,l 小等于 1)。

这时,一个可能的方法是再重新运行一次学生人数为 51 名的测试用例,给学生打与以前不同的分数,看一下是如何影响中间依的计算的。

如果中间值仍然是26,那么“否——多大程度”框可以填上“中间值似乎与实际分数无关”。

尽管这个结果提供了一条有价值的线索,但即使没有它,我们可能已经______________________________________________________________________________________________________________能够猜出这个错误来。

从现有数据计算出的中间值似乎等于学生人数的一半,经过四舍五入后得到最接近的一个整数。

换句话说,如果将分数设想为存储在一个分类表里,该程序打印的是中间学生的人数而不是其成绩。

因此,我们有了一个关于该错误准确性质的坚定的假设。

下一步就是通过检查代码或执行一些附加的测试用例来证明这个假设。

7.3 演绎法调试(Debugging by Deduction)演绎的过程是从一些普遍的理论或前提出发,使用排除和精炼的过程,达到一个结论(错误的位置),参见图7- 4 。

图7-4 使用演绎法的调试过程举个谋杀犯的例子,与归纳过程相反,首先从一系列嫌疑人入手,通过排除(花匠有当时不在现场的合理证词)和提炼(罪犯可能是红色头发)的过程,判断出管家可能犯了罪。

演绎的步骤如下:1. 列举出所有可能的原因或假设.第一步是建立一份所有想象得到的错误线索的清单,线索不需要有完整的解释,它们纯粹是一些推测,帮助我们组织和分析现有的数据。

2. 利用数据排除可能的原因。

详细检查所有的数据,尤其寻找存在矛盾的地方(图7-2 可以用在此处),然后尽量排除所有可能的原因,仅留下一条,如果所有的原因都排除掉了,需要增加额外的测试用例,得到更多的数据来______________________________________________________________________________________________________________设计新的推测。

如果剩下的原因多于一个,那么首先选择最有可能的原因,即主要假设。

3. 提炼剩下的假设。

此时的可能原因也许是正确的,但可能不够具体,不能指出错误来。

因此,下一步是使用现有的线索来提炼这个推侧.举例来说,我们可能会首先想到“对文件中最后事务的处理可能存在错误”,并将其提炼为“缓冲区中的最后事务被文件结束指示器覆盖”。

4. 证明剩下的假设。

这个重要步骤与归纳法中的第4步骤相同。

举个例子,假设我们着手对第4 章讨论的DISPLAY 命令进行功能测试。

相关文档
最新文档