欢迎来到测试驱动开发 (TDD)系列的介绍。 我们将在TDD上下文中讨论Java和JUnit ,但这只是工具。 本文的主要目的是使您全面了解TDD,而无论使用哪种编程语言和测试框架。

如果您在项目中不使用TDD,那么您要么很懒,要么就是根本不知道TDD的工作方式。 关于缺乏时间的借口不适用于这里。

关于这篇文章

在这篇文章中,我将解释什么是TDD以及如何在Java中使用它。 在TDD中,单元测试应放在哪个位置。 单元测试必须涵盖的内容。 最后,为了编写良好而有效的单元测试,需要遵循哪些原则。

如果您已经了解Java中有关TDD的所有知识,但是对示例和教程感兴趣,那么我建议您跳过这一部分,继续下一部分(它将在这一部分发布后的一周内发布)。

什么是TDD?

如果有人要我用几句话来解释TDD,那么我说TDD是功能实现之前的测试开发。 您可以争辩:很难测试尚不存在的事物。 肯特·贝克(Kent Beck)可能会为此一巴掌。

那怎么可能呢? 可以通过以下步骤进行描述:

1.阅读并了解特定功能的要求。
2.您开发了一组测试功能的测试。 由于没有功能实施,所有测试均为红色。
3.开发功能,直到所有测试变为绿色。 4.重构代码。

TDD需要不同的思维方式,因此,为了根据它开始工作,您需要忘记以前开发代码的方式。 这个过程很难。 如果您不知道如何编写单元测试,那就更难了。 但这是值得的。

使用TDD进行开发具有宝贵的优势:

1.您对实现的功能有更好的了解。
2.您具有功能完整性的可靠指标。
3.代码包含测试,并且被修复或新功能破坏的可能性较小。

这些优势的代价是很高的–与切换到新的开发方式有关的不便以及您花费在开发每个新功能上的时间。 这是质量的代价。

这就是TDD的工作方式–编写红色的单元测试,开始实现功能,使测试变为绿色,执行代码重构。

TDD中单元测试的位置

由于单元测试是测试自动化金字塔中最小的元素,因此TDD基于它们。 借助单元测试,我们可以检查任何类的业务逻辑。 如果您知道如何做,则编写单元测试很容易。 那么,您需要使用单元测试进行测试的内容以及该怎么做呢? 您知道这些问题的答案吗? 我将尝试以简洁的形式说明答案。

单元测试应尽可能小。 不,不不要考虑这一点,因为一项测试仅适用于一种方法。 当然,这种情况也是可能的。 但通常,一个单元测试意味着调用多种方法。 这称为行为测试。

让我们考虑Account类:

public class Account {private String id = RandomStringUtils.randomAlphanumeric(6);private boolean status;private String zone;private BigDecimal amount;public Account() {status = true;zone = Zone.ZONE_1.name();amount = createBigDecimal(0.00);}public Account(boolean status, Zone zone, double amount) {this.status = status;this.zone = zone.name();this.amount = createBigDecimal(amount);}public enum Zone {ZONE_1, ZONE_2, ZONE_3}public static BigDecimal createBigDecimal(double total) {return new BigDecimal(total).setScale(2, BigDecimal.ROUND_HALF_UP);}@Overridepublic String toString() {StringBuilder sb = new StringBuilder();sb.append("id: ").append(getId()).append("\nstatus: ").append(getStatus()).append("\nzone: ").append(getZone()).append("\namount: ").append(getAmount());return sb.toString();}public String getId() {return id;}public boolean getStatus() {return status;}public void setStatus(boolean status) {this.status = status;}public String getZone() {return zone;}public void setZone(String zone) {this.zone = zone;}public BigDecimal getAmount() {return amount;}public void setAmount(BigDecimal amount) {if (amount.signum() < 0)throw new IllegalArgumentException("The amount does not accept negative values");this.amount = amount;}
}

该类中有4种getter方法。 要特别注意它们。 如果我们为每个getter方法创建一个单独的单元测试,则会得到太多的冗余代码行。 可以通过行为测试来处理这种情况。 想象一下,我们需要使用其构造函数之一来测试对象创建的正确性。 如何检查对象是否按预期创建? 我们需要检查每个字段的值。 因此,可以在这种情况下使用吸气剂。

创建小型快速的单元测试 ,因为它们应在每次提交到git存储库并将新的构建提交到服务器之前执行。 您可以考虑一个带有实数的示例,以了解单元测试速度的重要性。 假设一个项目有1000个单元测试。 他们每个人都需要100毫秒。 结果,所有测试的运行需要1分40秒。

实际上100ms对于单元测试来说太长了,因此您必须通过应用不同的规则和技术来减少运行时间,例如,不要在单元测试中执行数据库连接(根据定义,单元测试是隔离的)或在其中执行昂贵的对象的初始化。 @Before块。

为单元测试选择好名字 。 测试的名称可以是您想要的任何名称,但是它应该代表测试进行的验证。 例如,如果我需要测试Account类的默认构造函数,则将其命名为defaultConstructorTest 。 选择测试名称的另一个有用建议是在命名测试之前编写测试逻辑。 在开发测试时,您会了解其中发生的情况,因此名称的组成变得更加容易。

单元测试应该是可预测的 。 这是最明显的要求。 我将在示例中进行解释。 为了检查转帐操作(需支付5%的费用),您必须知道发送的金额以及输出的金额。 此测试方案可以实现为发送100美元和接收95美元。

最后应该对单元测试进行细化 。 在每个测试中放置一个逻辑场景时,您可以从测试中获得有用的反馈。 并且在发生单个故障的情况下,您不会丢失有关其余功能的信息。

所有这些建议旨在改进单元测试设计。 但是,您还需要了解一件事-测试设计技术的基础知识。

测试设计技术基础

没有测试数据就不可能编写测试。 例如,当您测试汇款系统时,可以在汇款字段中设置一些金额。 在这种情况下,数量是测试数据。 那么您应该选择哪些值进行测试? 为了回答这个问题,我们需要经历最流行的测试设计技术。 测试设计技术的通用目的是简化测试数据的构成。

首先,让我们假设我们可以发送正整数的钱。 同样,我们发送的邮件不能超过1000。这可以表示为:

0 < amount <= 1000; amount in integer

我们所有的测试场景可以分为两组:正面和负面场景。 第一个用于系统允许的测试数据,并导致成功的结果。 第二种是所谓的“故障场景”,当我们使用不适当的数据与系统进行交互时。

根据等价技术类别,我们可以从(0; 1000]范围内选择一个随机整数。设为500。由于系统适用于500,因此对于该范围内的所有整数均适用。有效值,也可以从范围中选择无效的输入,可以是任何带浮点的数字,例如125.50

然后我们必须参考边界测试技术 。 根据它,我们必须从范围的左侧和右侧选择2个有效值。 在我们的例子中,我们以1为允许的最小正整数,从右边取1000。
下一步是在边界上选择2个无效值。 所以它是0和1001

因此,最后我们有6个值需要在单元测试中使用:

  • (1,500,1000)–对于积极的情况
  • (0,125.50,1001)–否定情况

摘要

在这篇文章中,我试图解释TDD的各个方面,并说明在TDD中单元测试的重要性。 因此,我希望经过如此详尽和长期的bla-bla理论,我们可以继续实践。 在下一篇文章中,我将演示如何在功能之前开发测试。 我们将从文档分析开始,到代码重构结束,逐步进行操作。

确保所有测试都是绿色的:)

翻译自: https://www.javacodegeeks.com/2015/11/introduction-in-java-tdd-part-1.html

Java TDD简介–第1部分相关推荐

  1. Java TDD介绍-1

    原文:Introduction in Java TDD – part 1 翻译:get-set 欢迎来到关于测试驱动开发(TDD)的简介.我们会谈到关于Java和JUnit在TDD中的应用,不过这些都 ...

  2. Java EE 简介

    Java EE 简介 Java EE 基本架构 JavaEE 的诞生是为了解决传统 C/S 架构的弊端:客户端臃肿庞大,扩展性差等弊端. JavaEE 将传统的两层结构细分为了四层. 这四层分别是:C ...

  3. java程序包不存在_第一章 Java语言简介

    Java语言简介 Java之父 James Gosling(詹姆斯·高斯林) 正式诞生时间 1995年,已有二十多年历史 三大方向 JavaSE(桌面版,基础需重点掌握) JavaME(移动版,现在基 ...

  4. (一:NIO系列)JAVA NIO 简介

    出处:JAVA NIO 简介 Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO.由于之前老的I/O类库是阻塞I/O,New I/O类库的目标就是要让Java支持非阻塞I/O, ...

  5. ibm java_IBM i 上Java 虚拟机简介

    Abstract IBM i 上Java 虚拟机简介 Body Java在IT业界有多流行?google上搜索一下java, 结果一目了然(今天早上我搜索到的记录数是840000000条).Java之 ...

  6. Java异常(一) Java异常简介及其架构

    概要 本章对Java中的异常进行介绍.内容包括: Java异常简介 Java异常框架 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3544168.htm ...

  7. Java:计算机编程语言Java的简介、编程环境/工具、如何学习Java之详细攻略

    Java:计算机编程语言Java的简介.编程环境/工具.如何学习Java之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编程Java语言→定义Java类→Java虚拟机 ...

  8. OpenCV Java开发简介

    OpenCV Java开发简介 OpenCV Java开发简介 我们将在本指南中做什么 获得适当的OpenCV 下载 构建 Java示例与Ant Java和Scala的SBT项目 运行SBT样本 Op ...

  9. JDK14中的java tools简介

    文章目录 故事发生了 java tools简介 jaotc jar jarsigner java javac javadoc javap jcmd jconsole jdb jdeprscan jde ...

最新文章

  1. 【论文速读】城市自动驾驶应用的概率语义地图
  2. java org.jb2011报错_Java中getResourceAsStream()用法总结(转)
  3. 【解决方案】Expected object of type torch.FloatTensor but found type torch.DoubleTensor
  4. 函数用计算机代码,用main函数传参做简单的计算器的代码
  5. mapreduce 算法_MapReduce算法–了解数据联接第1部分
  6. 前端学习(1615):前端系列实战课程之javascript简介
  7. 算法当道!为什么人类和人工智能越来越像?
  8. Python版——博客网站九 编写Android版本的移动App
  9. Win 10 更新,Linux 内核的 WSL 2 开始上线
  10. SpringCloud的EurekaClient : 客户端应用访问注册的微服务(无断路器场景)
  11. Atitit.软件开发的几大规则,法则,与原则p821.doc
  12. 全链路压测应该怎么做?答案都在这里了!
  13. Word论文参考文献排版
  14. 更多:Racket系统编程
  15. linux安装系统如何查看硬盘,如何检查Linux系统服务器的硬盘是SSD还是HDD?
  16. 【爱吃肉的阿C】使用URL类将文件下载到本地
  17. 部落卫队 (回溯搜索)
  18. saber框架 blade-core-tool:2.5.1 maven无法正常下载
  19. 蓝牙BLE5.1手柄方案
  20. USACO Section 1.1 Broken Necklace

热门文章

  1. 命令模式的两种不同实现
  2. publiccms实现遍历多级分类下的不同样式内容
  3. 《狂人日记》金句摘抄(一)
  4. Python解决中文乱码问题
  5. thinking-in-java(16) 数组
  6. 对于高并发的理解及实践方案
  7. netsuite 数据集成_Java中带有NetSuite数据实体的对象关系映射(ORM)
  8. aws ec2 选择可用区_AWS Messaging Services:选择合适的服务
  9. cli命令行界面 demo_Java命令行界面(第24部分):MarkUtils-CLI
  10. 斐波那契实现阶乘js_功能与命令式编程。 Java 8中的斐波那契,素数和阶乘