一、什么是测试驱动开发?


测试驱动开发(TDD)是一种哲学和方法。 TDD哲学的口号是“早期失败,经常失败”。我们已经知道,以分区(关注点分离)方式开发企业组件具有许多架构优势,并且是一种合理的实践。 TDD与这个想法齐头并进。在开发分区组件时,请立即对其进行测试。在此阶段捕获错误使它们更容易追踪和修复。如果等到所有组件都集成在一起,可能很难找到导致问题的罪魁祸首。这是等式中的“早期失败”部分。


“经常失败”与重复测试有关。创建测试时,在进一步开发组件时,它们将反复运行。这通常称为回归测试。如果你引入了一个bug,那么在下一次构建时你的测试就会运行,理论上会抓住它。你可以发现你在同事之前打破了构建!


TDD的方法涉及使用工具集来轻松创建测试,而无需在每次构建应用程序时构建测试框架。使用此类自动化工具集可为您提供可用作回归测试套件的测试的直接遗留问题。随着您编写越来越多的测试,随着您在组件中引入越来越多的代码,可以增加回归测试能力的深度。


测试驱动开发的严格方法如下:


1支撑被测对象。

2使用用户故事,用例或其他要求,对测试进行编码以测试对象的完整功能。

3运行测试以确保全部失败。如果测试没有失败,那么您还没有真正测试过任何功能。

4将功能代码添加到对象,运行测试,并重复直到所有测试都通过。

5重构代码以满足标准或最佳实践。

6重新运行所有测试以验证重构没有对功能产生负面影响。此外,只要触摸代码,就可以运行测试。


当完成单元测试的循环时,将为您的代码创建一个回归测试套件,以提供对此代码单元的信心。这种严格的流程使开发人员在编写任何实际功能之前,首先关注需求,以便更好地理解它们。许多研究表明,这种方法可以提高生产率,因为在开发过程中回溯较少,例如代码,错误修复,集成测试,错误修复等。


通常使用严格TDD过程的变体。这些步骤按以下顺序完成:1,4,2,5和6一起跳过步骤3。在此变体中,您将并行创建单元测试和功能代码。


二、测试框架


根据xUnit的命名策略最受欢迎的测试框架:JUnit,HtmlUnit,DBUnit等.JUnit和TestNG是两个测试框架,它们提供了一个API,可以轻松创建测试并运行它们。大多数IDE都支持在IDE中运行测试,包括JBoss Developer Studio。我们将在以下部分中详细介绍自动化测试工具。


单元测试

单元测试的重点很小。我们限制测试中的代码量,通常只测试同一架构层中的对象:Web,服务或持久性。通常,单元测试是针对普通的旧Java对象(POJO)编写的。在过去,其他层已被模拟,因此我们可以只关注功能代码的一部分。


集成测试

集成测试可确保所有企业组件在所有体系结构层中协同工作的质量。集成测试是从最终用户的角度编写的。企业组件通常部署到应用程序服务器以执行这些测试。


单元和集成测试经验

在以下场景中考虑您对规划单元和集成测试的想法和经验:

  • EJB单元测试

  • JSF单元测试

  • 持久性单元测试

  • 部署环境中Web应用程序的自动集成测试




三、JBoss测试方式

测试驱动开发在JBoss上的实践_java

在测试JBoss 方式时,您在开发功能代码时使用一组集成的开源工具进行单元和集成测试。 从上图中可以看出,所有测试都基于JUnit框架。 可以使用TestNG代替。  所有测试都编写为使用JUnit标记注释的POJO。 当您准备测试容器绑定组件时,可以向JUnit类添加Arquillian标记和部署定义,以在嵌入式,托管或远程容器中测试组件。


JSFUnit框架可以与JUnit和Arquillian框架结合使用来测试JSF页面。 通过将JUnit,Arquillian,Drone和Selenium框架结合在一起,可以实现基于Web的集成测试。




四、测试覆盖率


您了解了测试覆盖的概念以及如何使用Maven插件(Cobertura)来测量JUnit测试中的测试覆盖率。


什么是测试覆盖范围?

测试覆盖率是一种统计数据,用于衡量单元测试对功能代码的执行情况。测试覆盖率通常以功能代码总行数的百分比给出。例如,如果您有十行代码并且您的测试执行了其中五行,则您有50%的测试覆盖率。关于尝试实现100%代码覆盖率存在很多争议。有很好的论据没有明确地涵盖简单的原子代码,例如bean中的setter中的getter。如果您不使用setter中的getter,则无法实现100%的代码覆盖率。使用代码覆盖率作为试金石,用于测试功能代码运行程度的一般指标。如果你的数字很少,加强测试并找到最重要的路径。


Cobertura

使用Maven时,您可以访问各种各样的插件。 Maven能够生成一个微网站,提供有关代码各方面的信息和报告。一个这样的插件测量测试覆盖率,Cobertura插件。

测试驱动开发在JBoss上的实践_java_02

下图是测试覆盖率报告的一个示例,向我们展示了包含负面测试的机会,这将增加我们的测试覆盖率。 当没有给定股票代码的报价时,我们没有测试抛出UnknownStock异常的方法。

测试驱动开发在JBoss上的实践_java_03


Cobertura检测不在排除列表中的所有类的字节代码(在pom.xml中指定)。 然后它运行所有单元测试,捕获所有已执行的代码行。 然后它生成统计数据和图形“Javadoc样式”报告,显示详细的测试覆盖率。


通过在pom.xml中添加以下内容来激活Cobertura插件:

测试驱动开发在JBoss上的实践_java_04

执行Maven站点目标以生成报告:mvn site第一次执行站点目标时,运行需要一段时间,因为Maven必须下载Cobertura插件及其所有依赖项。 后续构建将更快。