软件测试分类、方法和常用工具

1、软件测试分类黑盒测试----指测试人员通过各种输入和观察软件的各种输出结果来发现软件的缺陷,而不关心程序具体如何实现的一种测试方法。

静态测试----指测试不运行的部分,例如测试产品说明书,对此进行检查和审阅.静态白盒测试-----指在不执行的条件下有条理地仔细审查软件设计,体系结构和代码,从而找出软件缺陷的过程。

有时称作结构分析。

动态测试----通过运行和使用软件进行测试。

探索测试----通常用于没有产品说明书的测试,这需要把软件当作产品说明书来看待,分步骤逐项探索软件特性,记录软件执行情况,详细描述功能,综合利用静态和动态技术来进行测试。

等价区间----指测试相同目标或者暴露相同软件缺陷的一组测试用例测试设计----提炼测试方法,明确指出设计包含的特性和相关测试。

如果要求完成测试还明确指出测试案例和测试程序,指定特性通过/失败的规则。

单元测试:最微小规模的测试;以测试某个功能或代码块。

典型地由程序员而非测试员来做,因为它需要知道内部程序设计和编码的细节知识。

这个工作不容易作好,除非应用系统有一个设计很好的体系结构; 还可能需要开发测试驱动器模块或测试套具。

累积综合测试:当一个新功能增加后,对应用系统所做的连续测试。

它要求应用系统的不同形态的功能能够足够独立以可以在全部系统完成前能分别工作,或当需要时那些测试驱动器已被开发出来; 这种测试可由程序员或测试员来做。

集成测试:一个应用系统的各个部件的联合测试,以决定他们能否在一起共同工作。

部件可以是代码块、独立的应用、网络上的客户端或服务器端程序。

这种类型的测试尤其与客户服务器和分布式系统有关。

功能测试:用于测试应用系统的功能需求的黑盒测试方法。

这类测试应由测试员做,这并不意味着程序员在发布前不必检查他们的代码能否工作(自然他能用于测试的各个阶段)。

系统测试:基于系统整体需求说明书的黑盒类测试;应覆盖系统所有联合的部件。

端到端测试:类似于系统测试;测试级的“宏大”的端点;涉及整个应用系统环境在一个现实世界使用时的模拟情形的所有测试。

例如与数据库对话,用网络通讯,或与外部硬件、应用系统或适当的系统对话。

健全测试:典型地是指一个初始化的测试工作,以决定一个新的软件版本测试是否足以执行下一步大的测试努力。

例如,如果一个新版软件每5分钟与系统冲突,使系统陷于泥潭,说明该软件不够“健全”,目前不具备进一步测试的条件。

衰竭测试:软件或环境的修复或更正后的“再测试”。

可能很难确定需要多少遍再次测试。

尤其在接近开发周期结束时。

自动测试工具对这类测试尤其有用。

接受测试:基于客户或最终用户的规格书的最终测试,或基于用户一段时间的使用后,看软件是否满足客户要求。

负载测试:测试一个应用在重负荷下的表现,例如测试一个 Web 站点在大量的负荷下,何时系统的响应会退化或失败。

强迫测试:在交替进行负荷和性能测试时常用的术语。

也用于描述象在异乎寻常的重载下的系统功能测试之类的测试,如某个动作或输入大量的重复,大量数据的输入,对一个数据库系统大量的复杂查询等。

性能测试:在交替进行负荷和强迫测试时常用的术语。

理想的“性能测试”(和其他类型的测试)应在需求文档或质量保证、测试计划中定义。

可用性测试:对“用户友好性”的测试。

显然这是主观的,且将取决于目标最终用户或客户。

用户面谈、调查、用户对话的录象和其他一些技术都可使用。

程序员和测试员通常都不宜作可用性测试员。

安装/卸载测试:对软件的全部、部分或升级安装/卸载处理过程的测试。

恢复测试:测试一个系统从如下灾难中能否很好地恢复,如遇到系统崩溃、硬件损坏或其他灾难性问题。

安全测试:测试系统在防止非授权的内部或外部用户的访问或故意破坏等情况时怎么样。

这可能需要复杂的测试技术。

兼容测试:测试软件在一个特定的硬件/软件/操作系统/网络等环境下的性能如何。

比较测试:与竞争伙伴的产品的比较测试,如软件的弱点、优点或实力。

Alpha 测试:在系统开发接近完成时对应用系统的测试;测试后,仍然会有少量的设计变更。

这种测试一般由最终用户或其他人员员完成,不能由程序员或测试员完成。

Beta 测试:当开发和测试根本完成时所做的测试,而最终的错误和问题需要在最终发行前找到。

这种测试一般由最终用户或其他人员员完成,不能由程序员或测试员完成。

2.软件测试的基本方法从测试人员角度看,可分为手动测试和自动测试。

从源代码的角度可分为单元测试和功能测试。

从理论定义来分,可分为黑箱测试,白箱测试和灰箱测试。

这里要讨论的基本软件测试方法主要侧重于软件功能的黑箱测试方法:功能测试(Func tionality Test),可接受性测试(Acceptance Test),用户界面(User interface或UI)测试,Ad hoc一般指‘探讨或开放’型测试,边界条件测试(Boundary Condition),性能测试(Performance Test),回归测试(Regression Test),强力测试(Stress Test),配置和安装测试(Configuration and Setup Test),兼容性测试(Comparability Test),国际化支持测试(International Sufficiency)以及本地化语言测试(Localization)。

功能测试:验证测试软件功能能否正常按照它的设计工作。

看运行软件时的期望行为是否符合原设计。

比如,测试Microsoft Excel插入->符号的功能包括测试能够在MicrosoftExcel所选单元格中正确地插入符号并且显示正确符号?能否正确显示使用不同的字体的符号?可接受性测试:是在把测试的版本交付测试部门大范围测试以前进行的对最基本功能的简单测试。

因为在把测试的版本交付测试部门大范围测试以前应该先验证该版本对于所测试的功能基本上比较稳定。

必须满足一些最低要求。

比如不会很容易程序就挂起或崩溃。

如果一个新版本没通过可测试性的验证,就应该阻拦测试部门花时间在该测试版本上测试。

同时还要找到造成该版本不稳定的主要缺陷并督促尽快加以修正。

用户界面测试:分析软件用户界面的设计是否合乎用户期望或要求。

它常常包括菜单,对话框及对话框上所有按钮,文字,出错提示,帮助信息 (Menu 和Help content)等方面的测试。

比如,测试Microsoft Excel中插入符号功能所用的对话框的大小,所有按钮是否对齐,字符串字体大小,出错信息内容和字体大小,工具栏位置/图标等等。

‘探索或开放’型的测试:不是按部就班的按照一个又一个正式的测试用例来进行,也不局限于测试用例特定的步骤。

这种测试是测试人员在理解该软件功能的基础上运用灵活多样的想象力和创造力去模拟用户的需求来使用该软件的多种功能。

通常涉及很多的测试用例或者通过更复杂的步骤来使用该软件。

边界条件测试:是环绕边界值的测试。

通常意味着测试软件各功能是否能正确处理最大值,最小值或者所设计软件能够处理的最长的字符串等等。

性能测试是:通常验证软件的性能在正常环境和系统条件下重复使用是否还能满足性能指标。

或者执行同样任务时新版本不比旧版本慢。

一般还检查系统记忆容量在运行程序时会不会流失(memory leak)。

比如,验证程序保存一个巨大的文件新版本不比旧版本慢。

回归测试:根据修复好了的缺陷再重新进行的测试。

目的在于验证以前出现过但已经修复好的缺陷不再重新出现。

一般指对某已知修正的缺陷再次围绕它原来出现时的步骤重新测试。

通常确定所需的再测试的范围时是比较困难的,特别当临近产品发布日期时。

因为为了修正某缺陷时必需更改源代码,因而就有可能影响这部分源代码所控制的功能。

所以在验证修好的缺陷时不仅要服从缺陷原来出现时的步骤重新测试,而且还要测试有可能受影响的所有功能。

因此应当鼓励对所有回归测试用例进行自动化。

强力测试:它通常验证软件的性能在各种极端的环境和系统条件下是否还能正常工作。

或者说是验证软件的性能在各种极端环境和系统条件下的承受能力。

比如,在最低的硬盘驱动器空间或系统记忆容量条件下,验证程序重复执行打开和保存一个巨大的文件1000次后也不会崩溃或死机。

集成与兼容性测试:验证该功能能够如预期的那样与其他程序或者构件协调工作。

兼容性经常意味着新旧版本之间的协调,也包括测试的产品与其它产品的兼容使用。

比如用同样产品的新版本时不影响与用旧版本用户之间保存文件,格式,和其他数据等操作。

装配/安装/配置测试:验证软件程序在不同厂家的硬件上,所支持的不同语言的新旧版本平台上,和不同方式安装的软件都能够如预期的那样正确运行。

比如,把英文版的 Micr osoft Office 2003安装在韩文版的Windows Me 上,再验证所有功能都正常运行。

国际化支持测试:验证软件程序在不同国家或区域的平台上也能够如预期的那样运行,而且还可以按照原设计尊重和支持使用当地常用的日期,字体,文字表示,特殊格式等等。

比如,用英文版的 Windows XP 和 Microsoft Word 能否展示阿拉伯字符串?用阿拉伯版的Windows XP 和阿拉伯版的Microsoft Word 能否展示阿拉伯字符串?又比如,日文版的Mi crosoft Excel对话框是否显示正确翻译的日语?一旦来说执行国际化支持测试的测试人员往往需要基本上了解这些国家或地区的语言要求和期望行为是什么。

本地化语言测试:要验证所有已计划要发布的不同语言版本软件如预期的那样被正确地翻译成当地语言。

这类测试一般包括验证菜单,对话框,出错信息,帮助内容等所有用户界面上的文字都能够显示正确翻译好的当地文字。

3.测试工具静态测试工具:Telelogic公司的Logiscope软件;PR公司的PRQA软件。

动态测试工具:Compuware公司的DevPartner软件;Rational公司的Purify系列等。

黑盒测试工具:的代表有:Rational公司的TeamTest、Robot;Compuware公司的QAC enter。

测试管理工具:Rational公司的Test Manager;Compureware公司的TrackRecord;M ercury Interactive公司的TestDirector。

合集下载

常用的软件测试方法

常用的软件测试方法

常用的软件测试方法软件测试在软件开发过程中扮演着至关重要的角色,通常为了确保软件质量,开发团队会组织专门的测试组来确保软件质量,在测试过程中发现和纠正错误、提高软件质量。

通过测试,可以识别并修复潜在的问题,测试有助于确保软件在不同的情况下正常工作,从而提高软件的质量和可靠性,符合用户的预期和需求。

常用的测试方法包括:静态测试、黑盒测试、白盒测试、性能测试、安全测试、兼容性测试、用户界面测试、回归测试、接口测试、故障注入测试。

1.静态测试:通过人工检查和评估软件代码的过程。

团队成员对代码进行检查,以发现潜在的错误、不一致性和低效率的代码。

这可以通过代码走查会议、代码对比工具和代码静态分析工具来完成。

以下是静态测试的几种常见方法:a)代码走查会议:团队成员在会议中一起检查代码,通过讨论和分享经验来发现潜在的问题。

参与者可以提出问题、提供建议和意见,并确保代码符合规范和最佳实践。

b)代码对比工具:使用代码对比工具可以比较不同版本的代码或不同分支的代码,以检测代码的变更和差异。

这有助于发现潜在的错误和冲突,并确保代码的一致性和正确性。

c)代码静态分析工具:静态分析工具通过分析代码的结构、语法和语义来检测潜在的问题和错误。

这些工具可以自动化地扫描代码,并提供警告、建议或错误信息,帮助开发人员发现可能存在的问题。

静态测试的主要优势在于可以在早期阶段发现问题,并且相对于动态测试来说,成本更低。

它可以帮助团队成员共同审查代码,分享经验和知识,提高代码质量和可维护性。

然而,静态测试也有一些局限性。

它主要关注于代码本身,无法覆盖代码在运行时的实际行为。

因此,静态测试通常需要与其他测试方法(如动态测试)结合使用,以获得更全面的测试覆盖和保证软件质量。

2.黑盒测试:黑盒测试的测试方法:是由一些非编码人员根据《需求规格说明书》的要求对打包好的软件进行测试环境部署、模仿使用,以发现软件中的问题。

黑盒测试包括安装测试、功能测试、组装测试、压力测试、集成环境测试五种。

软件测试中的测试方法与工具

软件测试中的测试方法与工具

软件测试中的测试方法与工具在软件开发的过程中,软件测试起着重要的作用。

软件测试是为了保证软件的质量和稳定性,确保软件能够正常运行。

在软件测试中,有许多不同的测试方法和工具可以使用,这些方法和工具可以帮助开发团队更加高效地进行软件测试,提高软件的质量。

本文将重点介绍软件测试中常用的测试方法与工具。

一、黑盒测试方法黑盒测试方法是一种测试方法,它基于对软件的功能和需求的分析,而不考虑软件的内部结构和实现细节。

常见的黑盒测试方法包括等价类划分、边界值分析、决策表等。

等价类划分是将测试用例分组为等价类,然后选择代表性的测试用例进行测试。

边界值分析是测试边界值附近的测试用例,以检测边界条件是否正确处理。

决策表是通过列出所有可能的输入组合和相应的输出结果来设计测试用例。

这些黑盒测试方法可以有效地测试软件的功能是否符合需求。

二、白盒测试方法白盒测试方法是一种测试方法,它基于对软件内部结构和代码的分析,测试人员需要具备一定的编程和代码理解技能。

白盒测试方法包括语句覆盖、分支覆盖、路径覆盖等。

语句覆盖是测试用例中是否覆盖了所有的代码语句。

分支覆盖是测试用例中是否覆盖了所有的判断和选择分支。

路径覆盖是测试用例中是否覆盖了所有可能的执行路径。

白盒测试方法可以帮助开发人员发现代码中的错误和缺陷,提高代码的质量。

三、性能测试工具性能测试是一种测试方法,用于测试软件在不同负载和压力下的性能和稳定性。

常用的性能测试工具包括LoadRunner和JMeter等。

这些工具可以模拟多个用户同时访问软件,并记录软件的响应时间、吞吐量等指标。

通过性能测试,可以评估软件在实际使用情况下的性能表现,并找出性能瓶颈和问题。

四、自动化测试工具自动化测试是一种测试方法,用于通过编写脚本和使用相应的工具来实现对软件的自动化测试。

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

这些工具可以模拟用户的操作,自动执行测试用例,并生成测试报告。

自动化测试可以帮助测试人员节省时间和精力,提高测试的效率和准确性。

软件测试方法与工具

软件测试方法与工具

软件测试方法与工具软件测试是软件开发过程中至关重要的一环,它是为了评估软件的质量和准确性而进行的一系列活动。

在软件开发的不同阶段,通过运用不同的测试方法和工具,可以有效提高软件的可靠性和稳定性。

本文将介绍一些常用的软件测试方法和工具,并探讨它们的应用。

一、黑盒测试黑盒测试是一种基于软件的功能需求和规格说明进行测试的方法。

测试人员在不知道软件内部结构和代码的情况下,通过输入有效和无效的数据,检查软件的输出是否符合预期。

黑盒测试主要用于验证软件是否满足给定的功能要求。

常用的黑盒测试方法包括等价类划分、边界值分析、决策表等。

其中,等价类划分是将所有可能的输入和输出值划分为等价类,并选择代表性的值进行测试;边界值分析是确定边界值以检测软件在边缘条件下的行为;决策表是基于软件逻辑的表格,用于指定不同的输入条件和相应的输出行为。

黑盒测试可以帮助发现软件中的功能性错误和逻辑错误,提高软件的健壮性。

二、白盒测试白盒测试是一种基于软件内部结构和代码进行测试的方法。

测试人员可以访问和检查软件的内部设计、实现和逻辑结构,并使用不同的测试技术来验证软件的正确性。

白盒测试主要用于检查软件的控制流、数据流和路径覆盖等。

常用的白盒测试方法包括语句覆盖、判定覆盖、条件覆盖、循环覆盖等。

其中,语句覆盖是确保每个语句至少被执行一次;判定覆盖是确保每个判定语句的两种结果都至少被执行一次;条件覆盖是确保每个条件的所有可能取值都至少被覆盖一次;循环覆盖是确保循环体的零次、一次和多次执行都被覆盖到。

白盒测试可以发现软件中隐藏的错误和逻辑漏洞,提高软件的安全性和稳定性。

三、自动化测试工具自动化测试工具是为了加快和简化软件测试过程而开发的一类工具。

它们可以自动执行测试用例、生成测试报告和记录测试结果,提高测试效率和准确性。

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

Selenium是一款用于Web应用程序测试的自动化测试工具,它可以模拟用户操作和生成测试脚本;JUnit是一款用于Java应用程序测试的自动化测试框架,它可以进行单元测试和集成测试;SoapUI是一款用于Web服务测试的自动化测试工具,它可以模拟和测试不同的Web服务请求和响应。

软件测试学习资料

软件测试学习资料

01
敏捷测试方法与实践可以帮助团队更好地适应变化,提高软件 质量。
02
在敏捷开发过程中,测试人员需要与开发人员紧密合作,确保
软件质量。
敏捷测试方法与实践包括自动化测试、探索性测试、持续集成
03
和持续测试等。
回归测试策略
1
回归测试策略可以确保新代码不会破坏现有功能。
2
在每次代码变更后,都需要进行回归测试,以确 保新代码不会引入新的缺陷。
用例更新与维护
在实际测试过程中,根据需要对测试用例进 行修改和完善,保持其时效性。
测试执行与缺陷管理
测试执行
按照测试计划和测试用例执行测试,记录测 试结果和发现的问题。
测试环境搭建
根据测试需求搭建相应的测试环境,确保测 试顺利进行。
缺陷跟踪与管理
对发现的问题进行跟踪管理,确保其得到及 时修复和验证。
02
软件测试方法与技术
黑盒测试
定义
01
黑盒测试也称为功能测试,主要关注软件的功能和需求,不关
心内部实现细节。
测试方法
02
通过输入和输出验证软件的功能是否符合要求。
常用测试用例设计方法
03
等价类划分、边界值分析、场景法等。
白盒测试
定义
白盒测试也称为结构测试或透明盒测试,关注软件的内部结构和 实现细节。
3
回归测试策略包括自动化测试、手动测试和探索 性测试等。
用户体验与易用性测试
01
用户体验和易用性是软件质量的重要指标之一。
02
通过用户体验和易用性测试,可以发现软件在使用过
程中存在的问题,提高用户满意度。
03
用户体验和易用性测试包括功能测试、界面测试、可

软件测试理论、方法和工具

软件测试理论、方法和工具

软件测试理论、、方法和工具杨建华(广州海格通信集团股份有限公司软件测试中心,广东广州510000)廛题抖夔伪I要】软件测试伴随软件而产生,但软件测试成为一门比较完整的理论体系,历史却并不长久。

即使是现在,虽然软件测试理论领域著述颇多。

但这—领域的理论体系仍然不算成熟。

许多基本的概念-也。

还没有严格的定义。

.9毛}赣字】软件测试;理论;方法;工具1软件测试理论“软件”可简单定义为“为了实现用户需求而编写的规程(设计文档),以及按规程的约定编写的用以控制硬件实现用户需求的符号语言(代码)”。

从这个意义出发,软件开发过程一般包括从用户需求到规程(设计文档)再到代码。

软件测试是软件开发过程中相关活动及交付件的验证和检查,因此包括以下四个层次的内涵:1)代码对于代码规范符合性的测试;2)软件设计思想对用户需求符合性的测试;3)软件代码对软件设计思想符合性的测试:4)软件代码对用户需求符合性的测试。

上述四个层次的测试中,基于“软件设计思想都表述为软件设计文档”这样一个假设,上述叙述中的“软件设计思想”都可以用“软件设计文档”取代。

据此我们可将软件缺陷划分为四类缺陷,分别对应于四个层次的测试。

其中Il、…、I V类缺陷我们称之为真缺陷,因为它门真正关系到前述定义中“软件”的两项内容“设计文档”和“代码”能否“实现用户需求”;而在I类测试中,其测试的标准为软件开发组织自己定义的高于编程语言语法要求的规范,因此其发现的缺陷,I类缺陷并不必然地意味着前述定义中“软件”中的任何一项(代码或者文档)不能“实现用户需求”,所以我们称之为“假性缺陷”。

当然,假性缺陷并不一定就不是真缺陷,因为对软件开发组织定义的规范的违反,往往意味着代码的潜在危险性可能影响其正鬻运行,正因为如此软件开发组织才将这些尽管符合标准语法规范的代码编写方法自定义为非法。

但是显而易见的是多数用户更关心的是在测试过程中如何尽可能地发现||类、…类、I v类“真缺陷”,因为它们直接影响软件的正确性。

软件测试的方法和工具

软件测试的方法和工具

软件测试的方法和工具软件测试是指对计算机软件进行验证和确认的过程,以确定该软件是否满足设计要求,并且是否对用户和应用场景可用。

软件测试主要是通过测试方法和测试工具来完成的。

本文将从测试方法和测试工具两个方面进行讨论。

一、测试方法1.黑盒测试黑盒测试是指在测试过程中,测试人员对于软件系统内部的功能和结构的情况并不关心,只需关注外部输出的结果。

黑盒测试侧重于测试软件应用系统的功能是否符合设计要求,是否满足用户需求以及在不同环境下是否具备可用性。

在测试过程中,需要设计测试用例,通过输入不同的数据,判断系统能否正确响应输出。

常用的黑盒测试方法包括:等价类划分、边界值分析、因果图和决策表等。

2.白盒测试白盒测试是指在测试过程中,测试人员关注系统内部细节,包括代码、结构、逻辑等方面,从而验证系统是否符合设计要求。

在测试之前需要对系统的内部结构有深入的掌握,测试人员需要编写测试用例和测试代码,通过覆盖率分析来判断代码是否正确。

常用的白盒测试方法包括:语句覆盖、判定覆盖、条件覆盖和路径覆盖等。

3.灰盒测试灰盒测试是黑盒测试和白盒测试的一种混合测试方法,既关注了测试对象的功能特性,又关注了系统的内部细节。

测试人员需要同时了解软件系统的内在逻辑和外部特性,通过测试用例的设计来完成灰盒测试。

4.自动化测试自动化测试是指在软件测试过程中,使用测试工具来自动化完成测试用例的运行。

自动化测试的优点是可以高效地运行重复性较高的测试用例,提高测试效率,并降低测试成本。

自动化测试工具包括:Selenium、Appium、JMeter等。

二、测试工具1.缺陷管理工具缺陷管理工具是用于管理缺陷信息的工具。

缺陷管理工具可以记录、统计、跟踪和分析测试中发生的缺陷情况,包括缺陷报告、缺陷类型、缺陷状态等。

常用的缺陷管理工具包括:Bugzilla、JIRA、Mantis等。

2.性能测试工具性能测试工具是用于测试软件系统性能,包括服务器的硬件和软件配置,软件系统的并发处理能力,系统的负载均衡等方面。

计算机软件测试软件测试方法和工具

计算机软件测试软件测试方法和工具计算机软件测试是指通过运行软件,检查软件的功能、性能、可靠性、稳定性等方面的测试活动。

软件测试是确保软件质量的重要步骤,以便在发布之前发现和修复潜在的缺陷和问题。

在软件测试的过程中,选择合适的测试方法和工具是至关重要的,下面将介绍几种常用的软件测试方法和工具。

一、黑盒测试黑盒测试是基于软件外部行为的测试方法,也叫功能测试。

测试人员对软件进行测试,不需要了解软件内部的结构和实现细节,只需关注软件的输入和输出以及与之相关的功能。

黑盒测试方法将软件看作一个黑盒子,测试人员只需要关注输入数据、操作和对应的输出结果,通过设计合理的测试用例进行测试,以验证软件是否满足预期的功能需求。

常用的黑盒测试方法包括等价类划分法、边界值分析法、错误推测法等。

等价类划分法将输入值划分为等价类,从每个等价类中选择一组测试数据来进行测试,以代表该等价类内的所有数据。

边界值分析法重点测试输入数据的边界值,因为边界值通常是最容易出错的。

错误推测法基于测试人员的经验和直觉来推测可能出错的地方,并进行相应的测试。

二、白盒测试白盒测试是基于软件内部结构的测试方法,也叫结构测试。

测试人员需要了解软件的内部逻辑、代码实现和运行流程,以设计测试用例和测试方法。

白盒测试方法侧重于测试软件的逻辑路径、条件覆盖和代码覆盖等方面,以尽可能地发现潜在的错误。

常用的白盒测试方法包括语句覆盖、判定覆盖、条件覆盖、路径覆盖等。

语句覆盖要求测试用例能够执行到每条语句至少一次。

判定覆盖要求测试用例能够使得每个判定语句的真假分支至少被执行一次。

条件覆盖要求测试用例能够使得每个条件的真假值至少被执行一次。

路径覆盖要求测试用例能够覆盖软件的所有可能路径。

三、性能测试性能测试是测试软件在特定工作负载下的性能和稳定性的测试方法。

通过模拟实际使用场景,测试人员可以评估软件的响应时间、吞吐量和资源占用情况等指标。

常用的性能测试方法包括负载测试、压力测试和稳定性测试。

软件测试基础知识

软件测试基础知识一、软件测试的描述:测试能提高软件的质量,但是提高质量不能依赖测试;测试只能证明错误存在,不能证明错误不存在;测试的主要困难是不知道该如何进行有效地测试,也不知道什么时候能够放心的结束测试;每个程序员都应当测试自己的程序(份内事),但不能作为程序已通过测试的依据(所以项目需要独立的测试人员);80-20原则:80%的错误聚集在20%的模块中,经常出错的模块改错后还是会经常出错;测试应当循序渐进,不要企图一次性做完。

"欲速则不达"。

一个好的测试用例是指很可能找到迄今为至尚未发现的错误的测试用例一个成功的测试是指揭示了迄今为至尚未发现的错误的测试二、软件分类:1)按功能分:系统软件(OS、硬件驱动程序)应用软件(Office、QQ)2)按技术架构分:单机版软件(Office、画图工具)C/S结构软件(客户端Client/服务器端Server,QQ、MSN)B/S结构软件(浏览器Browser/服务器Server,WEB项目)<现在软件的主流> 3)按用户分:产品软件:目标用户是大众用户(win 8)项目软件:目标用户是具体用户软件测试的目的:为了发现错误,不能证明程序正确,设计合适的测试用例,用尽可能少的测试用例,来发现尽可能多的软件错误。

测试人员的主要工作:1)规划测试任务2)设计测试(包括编写测试用例等等)3)建立一个合适的测试环境4)评估、获取、安装和配置自动测试工具5)执行测试6)撰写适当的测试文档软件测试与软件质量:QA(Quality Assurance),(关注的是过程);QC(Quality Control),即质量控制(关注的是结果)。

软件能力成熟度模型(CMM)CMM将软件组织的过程能力成熟度级别分为5个级别:初始级、可重复级、已定义级、已管理级、优化级。

SQA(Software Quality Assurance,软件质量保障)测试是在发现问题,SQA是在预防问题ISO/IEC9126国际标准所定义的软件质量包括六个部分,分别为功能性、可靠性、可用性、有效性、可维护性和可移植性。

软件测试分类

软件测试分类软件测试是一项复杂的系统工程,从不同的角度考虑可以有不同的划分方法,对测试进行分类是为了更好的明确测试的过程,了解测试究竟要完成哪些工作,尽量做到全面测试。

1,按是否需要执行被测软件的角度按是否需要执行被测软件的角度,可分为静态测试和动态测试,前者不利用计算机运行待测程序而应用其他手段实现测试目的,如代码审核。

(我认为主要是让测试人员对编译器发现不了的潜在错误进行分析,如无效的死循环,多余的变量等),而动态测试则通过运行被测试软件来达到目的。

2、按阶段划分:1 单元测试单元测试是对软件中的基本组成单位进行的测试,如一个模块、一个过程等等。

它是软件动态测试的最基本的部分,也是最重要的部分之一,其目的是检验软件基本组成单位的正确性。

因为单元测试需要知道内部程序设计和编码的细节知识,一般应由程序员而非测试员来完成,往往需要开发测试驱动模块和桩模块来辅助完成单元测试。

因此应用系统有一个设计很好的体系结构就显得尤为重要。

一个软件单元的正确性是相对于该单元的规约而言的。

因此,单元测试以被测试单位的规约为基准。

单元测试的主要方法有控制流测试、数据流测试、排错测试、分域测试等等。

2 集成测试集成测试是在软件系统集成过程中所进行的测试,其主要目的是检查软件单位之间的接口是否正确。

它根据集成测试计划,一边将模块或其他软件单位组合成越来越大的系统,一边运行该系统,以分析所组成的系统是否正确,各组成部分是否合拍。

集成测试的策略主要有自顶向下和自底向上两种。

3 系统测试系统测试是对已经集成好的软件系统进行彻底的测试,以验证软件系统的正确性和性能等满足其规约所指定的要求,检查软件的行为和输出是否正确并非一项简单的任务,它被称为测试的“先知者问题”。

因此,系统测试应该按照测试计划进行,其输入、输出和其他动态运行行为应该与软件规约进行对比。

软件系统测试方法很多,主要有功能测试、性能测试、随机测试等等。

4 验收测试验收测试旨在向软件的购买者展示该软件系统满足其用户的需求。

常用的测试方法和测试工具

常用的测试方法一、黑盒测试1.黑盒测试其实是一种功能测试,主要在软件的接口处进行;主要测试的以下几类错误:·是否有不正确或遗漏的功能·在给出的接口处正确的输入是否有正确的输出·是否有数据结构错误或外部信息访问错误·性能上是否满足要求·是否有初始化或终止性错误2.黑盒测试用例·等价类划分等价类即输入域的子集合,测试用例设计时应设计出对应的有效等价类和无效等价类·边界值边界值法是对等价类划分方法的补充,主要是测试发生在输入和输出域边界上的错误.等价类划分和边界值着重考虑输入条件,但测试时还应考虑输入条件之间的关系,各种条件的组合情况,即因果图·因果图根据输入条件间的关系生成判定表,根据判定表的每一列来设计测试用例·功能图包括状态迁移图和逻辑模型二、白盒测试1.白盒测试是对软件过程性细节做细致的检查;主要对软件程序模块做以下检查:·对模块的所有路径至少执行一次·对模块的所有逻辑判断,取“真”和“假”两种情况各执行一次·在循环边界和运行界限内执行循环体·测试内部数据结构的有效性2.白盒测试用例1逻辑覆盖·语句覆盖·分支覆盖对程序模块中的每个取真分支和取假分支执行一遍·条件覆盖对程序模块中的每个判断的每个条件执行一遍由于以上的测试用例都有较大的缺陷,所以一般不会使用,采用条件组合覆盖更为合理有效·条件组合覆盖逻辑覆盖的主要方法2基本路径测试用例测试步骤:①根据详细设计或源代码导出程序控制流图②计算程序环路复杂性,即独立路径的数目一条新的路径必须包含一条新边③生成测试用例辅助工具:图形矩阵测试策略一、单元测试1.单元测试时主要对模块的以下5个方面进行检查:·模块接口·局部数据结构·边界条件·独立路径·出错处理二、集成测试1.集成测试时主要要考察程序的以下几个方面:·各个模块连接时,穿越模块接口的数据是否会丢失·一个模块是否会对另一个模块的功能产生不利的影响·各个子功能组合起来,能否达到预期的父功能·全局数据结构是否有问题·单个模块的误差累积起来,是否会被放大,从而达到不可接受的程度2.集成测试的组织和实施中考虑的因素:·选用何种系统集成方法来进行集成测试·各个模块连接的顺序·模块代码编制和测试进度是否集成测试的顺序是否一致·测试过程中是否需要有专门的硬件3.集成测试完成的标志·成功执行了测试计划中规定的所有组装测试·修正了所发现的错误·测试结果通过了专门小组的评审三、确认测试1.确认测试流程:·进行有效性测试,即在模拟的环境下可能是开发环境,运用黑盒测试的方法,验证所没软件是否满足需求说明书列出的需求;对于测试结果与预期结果不相符进,要提交一份问题报告;·软件配置复查软件配置复查的目的是保证软件配置的所有成份都齐全,各方面的质量都符合要求;·a测试和测试a测试是一个用户在开发环境下进行的测试,也可以是开发机构内部的用户在模拟实际操作环境下进行的测试;测试是由软件的多个用户在一个或多个用户的实际使用环境下进行的测试·验收测试验收测试时软件开发人员和QA人员也应参加,由用户参加设计测试用例,使用用户界面输入测试数据,并分析测试结果;四、系统测试即通过确认测试的软作为整个系统中的一个元素而进行的测试;嵌入式系统测试方法及工具通常嵌入式系统对可靠性的要求比较高;嵌入式系统安全性的失效可能会导致灾难性的后果,即使是非安全性系统,由于大批量生产也会导致严重的经济损失;这就要求对嵌入式系统,包括嵌入式软件进行严格的测试、确认和验证;一般来说,软件测试有7个基本阶段,即单元或模块测试、集成测试、外部功能测试、回归测试、系统测试、验收测试、安装测试;嵌入式软件测试在4个阶段上进行,即模块测试、集成测试、系统测试、硬件/软件集成测试;前3个阶段适用于任何软件的测试,硬件/软件集成测试阶段是嵌入式软件所特有的,目的是验证嵌入式软件与其所控制的硬件设备能否正确地交互;1.白盒测试与黑盒测试由于严格的安全性和可靠性的要求,嵌入式软件测试同非嵌入式软件测试相比,通常要求有更高的代码覆盖率;对于嵌入式软件,白盒测试一般不必在目标硬件上进行,更为实际的方式是在开发环境中通过硬件仿真进行,所以选取的测试工具应该支持在宿主环境中的测试;因为黑盒测试与需求紧密相关,需求规格说明的质量会直接影响测试的结果,黑盒测试只能限制在需求的范围内进行;在进行嵌入式软件黑盒测试时,要把系统的预期用途作为重要依据,根据需求中对负载、定时、性能的要求,判断软件是否满足这些需求规范;为了保证正确地测试,还须要检验软硬件之间的接口;嵌入式软件黑盒测试的一个重要方面是极限测试;在使用环境中,通常要求嵌入式软件的失效过程要平稳,所以,黑盒测试不仅要检查软件工作过程,也要检查软件换效过程;2、目标环境测试和宿主环境测试在嵌入式软件测试中,常常要在基于目标的测试和基于宿主的测试之间作出折衷;基于目标的测试消耗较多的经费和时间,而基于宿主的测试代价较小,但毕竟是在模拟环境中进行的;目前的趋势是把更多的测试转移到宿主环境中进行,但是,目标环境的复杂性和独特性不可能完全模拟;在两个环境中可以出现不同的软件缺陷,重要的是目标环境和宿主环境的测试内容有所选择;在宿主环境中,可以进行逻辑或界面的测试、以及与硬件无关的测试;在模拟或宿主环境中的测试消耗时间通常相对较少,用调试工具可以更快地完成调试和测试任务;而与定时问题有关的白盒测试、中断测试、硬件接口测试只能在目标环境中进行;在软件测试周期中,基于目标的测试是在较晚的“硬件/软件集成测试”阶段开始的,如果不更早地在模拟环境中进行白盒测试,而是等到“硬件/软件集成测试”阶段进行全部的白盒测试,将耗费更多的财力和人力;2.常用的嵌入式软件测试工具1内存分析工具在嵌入式系统中,内存约束通常是有限的;内存分析工具用来处理在动态内存分配中存在的缺陷;当动态内存被错误地分配后,通常难以再现,可能导致的失效难以追踪,使用内存分析工具可以避免这类缺陷进入功能测试阶段;目前有两类内存分析工具——软件和硬件的;基于软件的内存分析工具可能会对代码的性能造成很大影响,从而严重影响实时操作;基于硬件的内存分析工具价格昂贵,而且只能在工具所限定的运行环境中使用;2性能分析工具在嵌入式系统中,程序的性能通常是非常重要的;经常会有这样的要求,在特定时间内处理一个中断,或生成具有特定定时要求的一帧;开发人面临的问题是决定应该对哪一部分代码进行优化来改进性能,常常会花大量的时间去优化那些对性能没有任何影响的代码;性能分析工具会提供有关的数据,说明执行时间是如何消耗的,是什么时候消耗的,以及每个例程所用的时间;根据这些数据,确定哪些例程消耗部分执行时间,从而可以决定如何优化软件,获得更好的时间性能;对于大多数应用来说,大部分执行时间用在相对少量的代码上,费时的代码估计占所有软件总量的5%-20%;性能分析工具不仅能指出哪些例程花费时间,而且与调试工具联合使用可以引导开发人员查看需要优化的特定函数,性能分析工具还可以引导开发人员发现在系统调用中存在的错误以及程序结构上的缺陷;3GUI测试工具很多嵌入式应用带有某种形式的图形用户界面进行交互,有些系统性能测试足根掘用户输入响应时间进行的;GUI测试工具可以作为脚本工具有开发环境中运行测试用例,其功能包括对操作的记录和回放、抓取屏幕显示供以后分析和比较、设置和管理测试过程;很多嵌入式设备没有GUI,但常常可以对嵌入式设备进行插装来运行GUI测试脚本,虽然这种方式可能要求对被测代码进行更改,但是节省了功能测试和回归测试的时间;4覆盖分析工具在进行白盒测试时,可以使用代码覆盖分析工具追踪哪些代码被执行过;分析过程可以通过插装来完成,插装可以是在测试环境中嵌入硬件,也可以是在可执行代码中加入软件,也可以是二者相结合;测试人员对结果数据加以总结,确定哪些代码被执行过,哪些代码被巡漏了;覆盖分析工具一般会提供有关功能覆盖、分支覆盖、条件覆盖的信息;对于嵌入式软件来说,代码覆盖分析工具可能侵入代码的执行,影响实时代码的运行过程;基于硬件的代码覆盖分析工具的侵入程度要小一些,但是价格一般比较昂贵,而且限制被测代码的数量;嵌入式测试的十大秘诀在嵌入式软件开发过程中,一般来说,花在测试和花在编码的时间比为3:1实际上可能更多;这个比例随着你的编程和测试水平的提高而不断下降,但不论怎样,对一般人来讲很重要;很多年前,一位开发人员为了对嵌入式有更深层次的理解,向Oracle询问了这样的一个问题:我怎么才能知道并懂得我的系统到底在干些什么呢Oracle面对这个问题有些吃惊,因为在当时没有人这么问过,而同时代的嵌入式开发人员问的最多的大都围绕“我怎么才能使程序跑的更快”、“什么编译器最好”等肤浅的问题;所以,面对这个不同寻常却异乎成熟的问题,Oracle感到欣喜并认真回复了他:你的问题很有深度很成熟,因为只有不断地去深入理解才有可能不断地提高水平;并且Oracle为了鼓励这位执着的程序员,把10条关于嵌入式软件开发测试的秘诀告诉了他:1.懂得使用工具2.尽早发现内存问题3.深入理解代码优化4.不要让自己大海捞针5.重现并隔离问题6.以退为进7.确定测试的完整性8.提高代码质量意味着节省时间9.发现它,分析它,解决它10.利用初学者的思维这十条秘诀在业界广为流传,使很多人受益;本文围绕这十条秘诀展开论述;1.懂得使用工具通常嵌入式系统对可靠性的要求比较高;嵌入式系统安全性的失效可能会导致灾难性的后果,即使是非安全性系统,由于大批量生产也会导致严重的经济损失;这就要求对嵌入式系统,包括嵌入式软件进行严格的测试、确认和验证;随着越来越多的领域使用软件和微处理器控制各种嵌入式设备,对门益复杂的嵌入式软件进行快速有效的测试愈加显得重要;就象修车需要工具一样,好的程序员应该能够熟练运用各种软件工具;不同的工具,有不同的使用范围,有不同的功能;使用这些工具,你可以看到你的系统在干些什么,它又占用什么资源,它到底和哪些外界的东西打交道;让你郁闷好几天的问题可能通过某个工具就能轻松搞定,可惜你就是不知道;那么为什么那么多的人总是在折腾个半死之后才想到要用呢原因很多,主要有两个;一个是害怕,另一个是惰性;害怕是因为加入测试用具或测试模块到代码需要技巧同时有可能引入新的错误,所以他们总喜欢寄希望于通过不断地修改重编译代码来消除bug,结果却无济于事;懒惰是因为他们习惯了使用printf之类的简单测试手段;下面来介绍一些嵌入式常用的;.源码级调试器Source-level Debugger这种调试器一般提供单步或多步调试、断点设置、内存检测、变量查看等功能,是嵌入式调试最根本有效的调试方法;比如VxWorks TornadoII提供的gdb就属于这一种;.简单实用的打印显示工具printfprintf或其它类似的打印显示工具估计是最灵活最简单的调试工具;打印代码执行过程中的各种变量可以让你知道代码执行的情况;但是,printf对正常的代码执行干扰比较大一般printf占用CPU比较长的时间,需要慎重使用,最好设置打印开关来控制打印;.ICE或JTAG调试器In-circuit EmulatorICE是用来仿真CPU核心的设备,它可以在不干扰运算器的正常运行情况下,实时的检测C PU的内部工作情况;像桌面调试软件所提供的:复杂的条件断点、先进的实时跟踪、性能分析和端口分析这些功能,它也都能提供;ICE一般都有一个比较特殊的CPU,称为外合bo nd-outCPU;这是一种被打开了封装的CPU,并且通过特殊的连接,可以访问到CPU的内部信号,而这些信号,在CPU被封装时,是没法“看到”的;当和工作站上强大的调试软件联合使用时,ICE就能提供你所能找到的最全面的调试功能;但ICE同样有一些缺点:昂贵;不能全速工作;同样,并不是所有的CPU都可以作为外合CPU的,从另一个角度说,这些外合CPU也不大可能及时的被新出的CPU所更换;JTAGJoint Test Action Group虽然它最初开发出来是为了监测IC和电路连接,但是这种串行接口扩展了用途,包括对调试的支持; AD公司为Blackfin设计的Visual Dsp++就支持高速的JTAG调试;.ROM监视器ROM MonitorROM监控器是一小程序,驻留在嵌入系统ROM中,通过串行的或网络的连接和运行在工作站上的调试软件通信;这是一种便宜的方式,当然也是最低端的技术;它除了要求一个通信端口和少量的内存空间外,不需要其它任何专门的硬件;并提供了如下功能:下载代码、运行控制、断点、单步步进、以及观察、修改寄存器和内存;因为ROM监控器是操作软件的一部分,只有当你的应用程序运行时,它才会工作;如果你想检查CPU和应用程序的状态,你就必须停下应用程序,再次进入ROM监控器;.Data监视器Data Monitor这种监视器在不停止CPU运行的情况下不仅可以显示指定变量内容,还可以收集并以图形形式显示各个变量的变化过程;.OS监视器Operating System Monitor操作系统监视器可以显示诸如任务切换、信号量收发、中断等事件;一方面,这些监视器能够为你呈现事件之间的关系和时间联系;另一方面,还可以提供对信号量优先级反转、死锁和中断延时等问题的诊断;.性能分析工具Profiler可以用来测试CPU到底耗在那里;profiler工具可以让你知道系统的瓶颈在那里、CPU的使用率以及需要优化的地方;.内存Memory Teseter可以找到内存使用的问题所在,比如内存泄露、内存碎片、内存崩溃等问题;如果发现系统出现一些不可预知的或间歇性的问题,就应该使用内存测测看;.运行跟踪器Execution Tracer可以显示CPU执行了哪些函数、谁在调用、参数是什么、何时调用等情况;这种工具主要用于测试代码逻辑,可以在大量的事件中发现异常的那些;.覆盖工具Coverage Tester主要显示CPU具体执行了那些代码,并让你知道那些代码分支没有被执行到;这样有助于提高代码质量并消除无用代码;.GUIGUI Tester很多嵌入式应用带有某种形式的图形用户界面进行交互,有些系统性能测试足根掘用户输入响应时间进行的;GUI可以作为脚本工具有开发环境中运行测试用例,其功能包括对操作的记录和回放、抓取屏幕显示供以后分析和比较、设置和管理测试过程Rational公司的robot和Mercury的Loadrunner工具是杰出的代表;很多嵌入式设备没有GUI,但常常可以对嵌入式设备进行插装来运行GUI测试脚本,虽然这种方式可能要求对被测代码进行更改,但是节省了功能测试和回归测试的时间;.自制工具Home-made tester在嵌入式应用中,有时候为了特定的目的,需要自行编写一些工具来达到某种测试目的;本人曾经编写的视频流录显工具在测试视频会议数据流向和变化上帮了大忙,帮公司找到了几个隐藏很深的bug;2.尽早发现内存问题内存问题危害很大,不容易排查,主要有三种类型:内存泄露、内存碎片和内存崩溃;对于内存问题态度必须要明确,那就是早发现早“治疗”;在软件设计中,内存泄露的“名气”最大,主要由于不断分配的内存无法及时地被释放,久而久之,系统的内存耗尽;即使细心的编程老手有时后也会遭遇内存泄露问题;有测试过内存泄露的朋友估计都有深刻地体验,那就是内存泄露问题一般隐藏很深,很难通过代码阅读来发现;有些内存泄露甚至可能出现在库当中;有可能这本身是库中的bug,也有可能是因为程序员没有正确理解它们的接口说明文档造成错用;在很多时候,大多数的内存泄露问题无法探测,但可能表现为随机的故障;程序员们往往会把这种现象怪罪于硬件问题;如果用户对系统稳定性不是很高,那么重启系统问题也不大;但,如果用户对系统稳定很高,那么这种故障就有可能使用户对产品失去信心,同时也意味着你的项目是个失败的项目;由于内存泄露危害巨大,现在已经有许多工具来解决这个问题;这些工具通过查找没有引用或重复使用的代码块、垃圾内存收集、库跟踪等技术来发现内存泄露的问题;每个工具都有利有弊,不过总的来说,用要比不用好;总之,负责的开发人员应该去测试内存泄露的问题,做到防患于未然;内存碎片比内存泄露隐藏还要深;随着内存的不断分配并释放,大块内存不断分解为小块内存,从而形成碎片,久而久之,当需要申请大块内存是,有可能就会失败;如果系统内存够大,那么坚持的时间会长一些,但最终还是逃不出分配失败的厄运;在使用动态分配的系统中,内存碎片经常发生;目前,解决这个问题最效的方法就是使用工具通过显示系统中内存的使用情况来发现谁是导致内存碎片的罪魁祸首,然后改进相应的部分;由于动态内存管理的种种问题,在嵌入式应用中,很多公司干脆就禁用malloc/free 的以绝后患;内存崩溃是内存使用最严重的结果,主要原因有数组访问越界、写已经释放的内存、指针计算错误、访问堆栈地址越界等等;这种内存崩溃造成系统故障是随机的,而且很难查找,目前提供用于排查的工具也很少;总之,如果要使用内存管理单元的话,必须要小心,并严格遵守它们的使用规则,比如谁分配谁释放;3.深入理解代码优化讲到系统稳定性,人们更多地会想到实时性和速度,因为代码效率对嵌入式系统来说太重要了;知道怎么优化代码是每个嵌入式软件开发人员必须具备的技能;就象女孩子减肥一样,起码知道她哪个地方最需要减,才能去购买减肥药或器材来减掉它;可见,代码优化的前提是找到真正需要优化的地方,然后对症下药,优化相应部分的代码;前面提到的p rofile性能分析工具,一些功能齐全IDE都提供这种内置的工具能够记录各种情况比如各个任务的CPU占用率、各个任务的优先级是否分配妥当、某个数据被拷贝了多少次、访问磁盘多少次、是否调用了网络收发的程序、测试代码是否已经关闭等等;但是,profile工具在分析实时系统性能方面还是有不够的地方;一方面,人们使用pr ofile工具往往是在系统出现问题即CPU耗尽之后,而profile工具本身对CPU占用较大,所以profile对这种情况很可能不起作用;根据Heisenberg效应,任何测试手段或多或少都会改变系统运行,这个对profiler同样适用总之,提高运行效率的前提是你必须要知道CPU到底干了些什么干的怎么样;4.不要让自己大海捞针大海捞针只是对调试的一种生动比喻;经常听到组里有人对自己正在调试的代码说shit可以理解,因为代码不是他写的,他有足够的理由去shit bug百出的代码,只要他自己不要写出这种代码,否则有一天同组的其它人可能同样会shit他写的代码;为何会有大海捞针呢肯定是有人把针掉到海里咯;那针为何会掉在海里呢肯定是有人不小心或草率呗;所以当你在抱怨针那么难找的时候,你是否想过是你自己草率地丢掉的;同样,当你调试个半死的时候,你是否想过你要好好反省一下当初为了寻求捷径可能没有严格地遵守好的编码设计规范、没有检测一些假设条件或算法的正确性、没有将一些可能存在问题的代码打上记号呢关于如何写高质量请参考林锐的高质量c++/c编程指南或关于C的0x8本“经书”;如果你确实已经把针掉在海里是,为了防止在找到之前刺到自己,你必须要做一些防范工作,比如戴上安全手套;同样,为了尽能地暴露和捕捉问题根源,我们可以设计比较全面的错误跟踪代码;怎么来做呢尽可能对每个函数调用失败作出处理,尽可能检测每个参数输入输出的有效性包括指针以及检测是否过多或过少地调用某个过程;错误跟踪能够让你知道你大概把针掉在哪个位置;5.重现并隔离问题如果你不是把针掉在大海了,而是掉在草堆里,那要好办写;因为至少我们可以把草堆分成很多块,一块一块的找;对于模块独立的大型项目,使用隔离方法往往是对付那些隐藏极深bug的最后方法;如果问题的出现是间歇性的,我们有必要设法去重现它并记录使其重现的整个过程以备在下一次可以利用这些条件去重现问题;如果你确信可以使用记录的那些条件去重现问题,那么我们就可以着手去隔离问题;怎么隔离呢我们可以用if def把一些可能和问题无关的代码关闭,把系统最小化到仍能够重现问题的地步;如果还是无法定位问题所在,那么有必要打开“工具箱”了;可以试着用ICE或数据监视器去查看某个可疑变量的变化;可以使用跟踪工具获得函数调用的情况包括参数的传递;检查内存是否崩溃以及堆栈溢出的问题;6.以退为进猎人为了不使自己在森林里迷路,他常常会在树木上流下一些标记,以备自己将来有一天迷路时可以根据这些标记找到出路;对过去代码的修改进行跟踪记录对将来出现问题之后的调试很有帮助;假如有一天,你最近一次修改的程序跑了很久之后忽然死掉了,那么你这时的第一反映就是我到底改动了些什么呢,因为上次修改之前是好的;那么如何检测这次相对于上次的修改呢没错,代码控制系统SCS或称版本控制系统VCSConcurrent Version Control,CVS是VCS的演化版本;将上个版本check in下来后和当前测试版本比较;比较的工具可以是SCS/VCS/CVS自带的diff工具或其它功能更强的比较工具,比如BeyondCompare和ExamDiff;通过比较,记录所有改动的代码,分析所有可能导致问题的可疑代码;7.确定测试的完整性你怎么知道你的测试有多全面呢覆盖测试coverage testing可以回答这个问题;覆盖可以告诉你CPU到底执行了那些代码;好的覆盖工具通常可以告诉你大概20%到40%代码没有问题,而其余的可能存在bug;覆盖工具有不同的测试级别,用户可以根据自己的需要选择某个级别;即使你很确信你的单元测试已经很全面并且没有dead code,覆盖工具还是可以为你指出一些潜在的问题,看下面的代码:if i >= 0 && almostAlwaysZero == 0 || last = i如果almostAlwaysZero为非0,那么last=i赋值语句就被跳过,这可能不是你所期望的;这种问题通过覆盖工具的条件测试功能可以轻松的被发现;总之,覆盖测试对于提高代码质量很有帮助;8.提高代码质量意味着节省时间有研究表明软件开发的时间超过80%被用在下面几个方面:.调试自己的代码单元测试.调试自己和其他相关的代码模块间测试.调试整个系统系统测试更糟糕的是你可能需要花费10-200倍的时间来找一个bug,而这个bug在开始的时候可能很容易就能找到;一个小bug可能让你付出巨大的代价,即使这个bug对整个系统的性能没有太大的影响,但很可能会影响让那些你可以看得到的部分;所以我们必须要养成良好的编码和测试手段以求更高的代码质量,以便缩短调试的代码;9.发现它,分析它,解决它这世界没有万能的膏药;profile再强大也有力不从心的时候;内存监视器再好,也有无法发现的时候;覆盖工具再好用,也有不能覆盖的地方;一些隐藏很深的问题即使用尽所有工具也有可能无法查到其根源,这时我们能做的就是通过这些问题所表现出来的外在现象或一些数据输出来发现其中的规律或异常;一旦发现任何异常,一定要深入地理解并回溯其根源,直到解决为止;10.利用初学者的思维。

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