高质量代码中往往缺陷更少!确保高的 Java 代码质量有两个步骤:尽早并经常地编写各个层次的测试用例,以及持续的监测质量状况。那么我们又该如何实践呢?本专题汇集了大量来自代码质量专家们的专业经验、最佳实践以及实用技巧,内容涵盖了软件测试理论、Bug 模式与代码诊断、代码静态分析、测试驱动、单元测试、覆盖率、测试工具和 IBM Rational 测试平台等方面,其丰富的文章、教程及系列专栏将为您的代码质量加油提速!。
软件质量与软件测试
什么是软件质量?
软件质量(software quality)是与软件产品满足明确或隐含需求的能力有关的特征和特性的总和。高质量的软件通常具备了这样一些特性:
- 满足用户的需求。
- 合理的进度、成本、功能关系。
- 具备扩展性和灵活性,能够适应一定程度的需求变化。
- 足够的强壮、足够的鲁棒,能够有效的处理例外的情况。
- 保持成本和性能的平衡。
- 能够可持续的发展。
关于软件质量的具体讲述,您可以请阅读这个由五个部分组成的系列文章:“软件质量之路”。
什么是软件测试?
软件测试是为了发现程序代码中的错误(Bug)而执行程序的过程,是软件质量保证的重要手段,属于软件工程领域。其目的是:
- 为了寻找错误,并尽可能地为修正错误提供更多的信息;(参阅 如何诊断与调试 Java 代码中的 Bug?)
- 为了证明软件有错误,而不是证明软件没有错误;
软件测试技术根据测试原理,又分为:
- 静态测试:不实际运行程序,而是通过代码检查的手段来发现错误并评估代码质量的软件测试技术;(参阅 如何静态测试 Java 代码?)
- 动态测试:实际运行程序,并通过观察程序运行的实际结果来发现错误的软件测试技术;
代码质量专家 Andrew Glover 在他的专栏“追求代码质量”中介绍了如何使用最新的测试工具来保证代码质量,他重点阐述一些看上去比较神秘的东西。
什么是测试驱动开发(TDD)?
测试驱动开发(Test-Driven Development)起源于极限编程(XP)开发过程中所提倡的测试先行实践。测试先行实践重视单元测试(Unit Testing),强调程序员除了编写代码之外,还应该编写单元测试代码。在开发的顺序上,它改变了以往先编写代码,再编写测试的过程,而采用先编写测试,再编写代码来满足测试的方法。这种方法在实际中能够起到非常好的效果,使得测试工作不仅仅是单纯的测试,而成为设计的一部分。(具体请参见后面的 如何实践测试驱动开发?)
如何诊断与调试 Java 代码中的 Bug?
BUG 模式与 Java 诊断
正如好的编程技能涉及很多设计模式(您可以在不同的程序上下文中组合和应用这些模式)的知识一样,好的代码诊断和 Bug 调试技能也涉及对错误模式的一定了解。错误模式就是已发生的错误和程序中潜在的错误之间的重复出现的相互关系。很多错误都遵循我们可以识别的几种错误模式的其中一种。一旦您可以识别出这些错误模式,您就可以诊断出错误的原因并且更快地纠正它。错误模式与反模式有关,反模式是一次又一次被证明是失败的公共软件设计的模式。虽然反模式是设计模式,错误模式却是与编程错误相关的错误的程序行为的模式。这与设计根本没有关系,而是与编程和调试过程有关。
了解各种具体的错误模式以及如何诊断和纠正 Java 程序中反复出现的错误类型,请参阅 Eric Allen 的系列专栏:
在此专栏中,Eric Allen 针对各种错误模式进行了一些具体的讨论:
- 错误模式简介
- Dangling Composite 错误模式
- Null Flag 错误模式
- Double Descent 错误模式
- Liar View 错误模式
- Saboteur Data 错误模式
- Broken Dispatch 错误模式
- Imposter Type 错误模式
- Split Cleaner 错误模式
- Fictitious Implementation 错误模式,第 1 部分
- Fictitious Implementation 错误模式,第 2 部分
- 孤线程(Orphaned Thread)错误模式
- 连续初始化器错误模式
- 将时态逻辑用于错误模式
另外,他还讨论了许多其它关于 Java 代码诊断的主题:
Java 调试
即使是最高级的开发人员所开发的最简单的应用程序也可能包含错误。如果要成为好的调试人员,不必象大侦探那样调查蛛丝马迹。您只需了解概念并熟悉正确的工具。
- “教程:Java 调试”提供了关于基本 Java 调试概念和更高级调试类型的详细信息。
如何静态测试 Java 代码?
Java 开发人员现在拥有很多通过代码度量、静态分析等方法来度量代码质量的工具。所有的这些新的工具使得确保代码质量比以前简单得多,不过您还需要知道如何使用它们。
代码度量
- “监视圈复杂度”展示如何使用简单的代码度量工具和基于 Java 的工具来监视代码复杂度。
- “软件架构的代码质量”解释了如何持续地监视并纠正会影响软件架构的长期生存能力的代码质量方面。
- “用代码度量进行重构”介绍如何使用相同的代码度量方法和提取方法模式进行有针对性的重构。
静态分析工具
静态分析工具承诺无需开发人员费劲就能找出代码中已有的缺陷。当然,如果有多年的编写经验,就会知道这些承诺并不是一定能兑现。尽管如此,好的静态分析工具仍然是工具箱中的无价之宝:
- FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题:
- “FindBugs,第 1 部分”和“第 2 部分”分别介绍使用 FindBugs 的原因和方法 以及如何编写自定义检测器以查找特定于应用程序的问题。
- “消除 bug”展示了这个静态分析工具如何帮助分析代码。
- “平衡测试,第 1 部分、第 2 部分 和 第 3 部分”讨论如何通过引进 FindBugs 静态代码分析工具来改进管理软件质量的方式。
- PMD 是一个开源的静态分析工具,它分析 Java 源代码,并找出潜在的 bug:
- “用 PMD 铲除 bug”解释如何使用 PMD 内置的规则以及您自己定制的规则集来提高 Java 代码质量。
- “驯服复杂的冗长代码”展示了如何使用诸如 PMD 和 JavaNCSS 之类的工具,在您需要的时候获得更高的代码复杂度测试精度。
- Eclipse 静态分析插件,能在构建代码前便发现代码中潜在的问题:
- “用 Eclipse 插件提高代码质量”将带来一些关于 Eclipse 插件的例子,您可以安装、配置和使用这些静态分析插件,以便在开发生命周期的早期预防问题。
- IBM Checking Tool for Bugs Errors and Mistakes,可用于分析并查找 C、C++ 和 Java 代码中的一些不容易发现的潜在错误:
- “使用 IBM 静态工具优化 Java 代码,第 1 部分: 工具入门”介绍如何在 Windows 上成功运行 BEAM,检查 Java 代码中的潜在错误,从而提高代码的安全性和稳定性。
- “使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告”学习如何对其输出的报告结果文件进行分析,并修改代码中的潜在错误。
如何实践测试驱动开发?
测试驱动开发
测试驱动开发是敏捷开发的最重要的部分。该方法主要是先根据客户的需求编写测试程序,然后再编码使其通过测试。在敏捷开发实施中,开发人员主要从两个方面去理解测试驱动开发。
- 在测试的辅助下,快速实现客户需求的功能。通过编写测试用例,对客户需求的功能进行分解,并进行系统设计。我们发现从使用角度对代码的设计通常更符合后期开发的需求。可测试的要求,对代码的内聚性的提高和复用都非常有益。
- 在测试的保护下,不断重构代码,提高代码的重用性,从而提高软件产品的质量。
更多请参见文章“使用模拟对象(Mock Object)技术进行测试驱动开发”。
单元测试
单元测试测的是独立的一个工作单元。在 Java 应用程序中,“独立的一个工作单元”常常指的是一个方法(但并不总是如此)。作为对比,集成测试和验收测试则检查多个组件如何交互。一个工作单元是一项任务,它不依赖与其他任何任务的完成。
相关技术文章:
- 利用 Ant 和 JUnit 进行增量开发
- 怎样使用 JUnit 框架编写单元测试
- AspectJ 和模仿对象的测试灵活性
- 使用模仿对象进行单元测试
- 安全抵达!:防御性编码和单元测试“交通规则”
- 用 Jython 构建 JUnit 测试包
- 用 Groovy 更迅速地对 Java 代码进行单元测试
- Hibernate 配置文件在单元测试中的灵活运用
- TestNG 使 Java 单元测试轻而易举
- Eclipse 3.1 中使用TestNG:基于注释的单元测试框架
- JUnit 4 抢先看
- 自动进行团队构建和单元测试过程
- 对方面进行单元测试
- 使用 ConTest 进行多线程单元测试
- 测试对象串行化
- 使用 TestNG 的新特性管理实际项目中的大量单元测试
- 单元测试利器 JUnit 4
- 利用 Eclipse 进行单元测试
- 对 Ajax 应用程序进行单元测试
- 使用 Grester 简化 Java 应用程序的 JUnit 测试
- 应用设计模式编写易于单元测试的代码
- 使用 JUnit 对规则进行单元测试
- 扩展 JUnit 测试并行程序
测试覆盖率
测试改进了代码质量,但这也只是针对实际测试到的那部分代码而言的。您需要有一个工具告诉您程序的哪些部分没有测试到,这样就可以针对这些部分编写测试代码并找出更多 Bug。
软件测试自动化
软件的手动测试非常耗时,劳动强度高,并且很单调,而且还会引入一些人为的错误,因此测试自动化势在必行。通常自动化测试是通过一些测试自动化工具开发和执行测试脚本,达到评估软件质量的目的。自动化测试不仅能够大大减轻测试人员的工作量,并减少了测试过程中人为出现的错误。
更多的相关内容,请参见:“软件测试自动化专题”。
Java 开发测试与 IBM Rational 产品平台
Rational 软件交付平台简介
面对 IT 开发日益增长的复杂性和越来越短的项目开发周期,您是否在寻找能统一企业开发团队的开发平台,和能全面管理您基于面向服务体系结构(SOA)资产的解决方案?Rational 软件交付平台(SDP)V7 产品正是您的最好选择!
Rational SDP V7 产品为您的 IT 开发带来了更多的灵活性,支持您实现全球跨地域分布开发团队的同步开发,更好地实现和管理软件交付及系统架构,并能显著改进 IT 资产的生命周期和产品质量的管理。当中的热门产品 Rational Software Architect V7.0 能帮助您更快更好地设计 SOA 解决方案,Rational Functional Tester V7.0 能帮助您全面测试软件产品的功能特性,而 Rational Unified Process V7.0 更是指导软件团队开发的经典软件过程。
Rational Java 测试解决方案
IBM Rational 质量管理解决方案通过自动化以及人工测试工具,可帮助测试人员最大化测试的成果并增加工作的有效性,这些测试工具同时保证了业务关键应用在功能性,可靠性以及性能方面的品质。Rational 工具通过在通用的框架上进行集成,支持广泛的开发环境,并且在紧密协作、以及在跨软件交付生命周期管理分布式测试资产和信息方面具有强大的能力。
IBM Rational Functional Tester 是专门为关注其 Java™、.NET® 以及基于 Web 的应用品质的质量保证(QA)团队而准备的自动化功能测试以及回归测试解决方案。
最新产品文档:
- IBM Rational Functional Tester 7.0 版本介绍
- 使用 Rational Functional Tester 给开发人员带来的好处
- 用 Rational Functional Tester 创建随需应变的自动测试脚本
- 将调用封装到 Rational Functional Tester API 中
IBM Rational Robot是为需要对基于多种 C/S GUI 技术进行应用的功能,和性能自动化测试的质量保证(QA)团队准备的测试工具。现在 Rational 为此产品提供了固定期限的许可证。
IBM Rational Manual Tester 是专门的人工测试认证和执行工具,可促进测试步骤的重用,以减少软件变更对业务分析人员和测试人员的影响。新的和改进的功能特性包括:
最新产品文档:
IBM Rational Performance Tester 是专门的性能测试和压力测试工具,可帮助测试人员实现自动化的性能和压力测试。
最新产品文档:
Rational 软件需求变更与缺陷跟踪解决方案
Rational 提供集成的版本控制、版本和发布管理、缺陷和变更跟踪,以及工作流管理。利用这些功能可以进行团队合作、提高生产率、改善运营效率、降低成本,使企业应用程序开发、Web 内容和技术计划适应业务需求。
配置管理类别中的产品包括:
- IBM Rational RequisitePro®(英文) —— 主要关注于项目的文档、通信和控制的不断变化的需求。
- IBM Rational ClearCase® family —— 利用全面的版本控制、工作空间管理以及构建和版本管理来实现软件资产管理。
- IBM Rational ClearQuest® family(英文) —— 通过开发生命周期来管理工作流和变更请求,缺陷和增强都包括。
最新产品文档:
Rational 软件测试过程方法论
项目经理和规划管理经理将发现,开发基础设施工具和过程需要访问最新的项目状态信息、精确地估计所需的资源并作出综合而灵活的项目计划,以助于团队更加高效地协作。IBM 软件交付平台的核心是一个灵活的、已证实的、可配置的、同时针对大型和小型开发项目的过程。
Rational 统一过程(Rational Unified Process® )是业界公认的指导软件团队开发的经典软件过程。其中同软件质量保证相关的测试过程和方法论指导,是众多开发团队借鉴的软件测试框架和测试过程原型。
Rational 统一过程软件质量保证参考文档:
- IBM Rational 质量管理解决方案 V8
- IBM Rational 测试解决方案
- IBM Rational 软件测试工具包
- Rational 开发过程
- 软件质量保证的成功之路
- 高品质软件,Rational工艺
- 持续质量保证:一个案例研究