tdd java_Java TDD简介–第1部分

tdd java

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

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

关于这篇文章

在这篇文章中,我将解释什么是TDD以及如何在Java中使用它。 在TDD中,单元测试在哪个地方进行? 单元测试必须涵盖的内容。 最后,您需要遵循哪些原则才能编写良好而有效的单元测试。

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

什么是TDD?

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

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

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

BDD流

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

tdd java

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++最佳实践 | 代码风格

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删C最佳实践:1. 工具2. 代码风格&#xff08;本文&#xff09;3. 安全性4. 可维护性5. 可移植性及多线程6. 性能7. 正确性和脚本代码风格代码风格最…

使用map的find头文件_C++ map用法

C 中 map 提供的是一种键值对容器&#xff0c;里面的数据都是成对出现的,如下图&#xff1a;每一对中的第一个值称之为关键字(key)&#xff0c;每个关键字只能在 map 中出现一次&#xff1b;第二个称之为该关键字的对应值。在一些程序中建立一个 map 可以起到事半功倍的效果&am…

lucene 查询示例_高级Lucene查询示例

lucene 查询示例本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中&#xff0c;您将了解Lucene。 您将了解为什么这样的库很重要&#xff0c;然后了解Lucene中搜索的工作方式。 此外&#xff0c;您将学习如何将Lucene Search集成到您自己的应用程序中…

okhttp 连接池_okhttp 源码分析

https://square.github.io/okhttp/​square.github.iosquare/okhttp​github.com0 概述okhttp是一个现代的网络请求框架Http/2 支持 所有访问同一个主机的Request都共用一个socketconnection pool 连接池 减少请求延迟GZIP 压缩数据&#xff0c;减少传输所用的带宽Response Cac…

程序员日均写7行代码被开除,公司:正常员工每天200行

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删根据前不久CSDN发布的《2021-2022中国开发者调查报告》显示&#xff0c;大部分程序员平均每天会写200行左右的代码。那么代码的数量能衡量一个程…

抽象工厂和工厂方法示例_工厂方法设计模式示例

抽象工厂和工厂方法示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查…

rust废铁最快_Rust初体验,它确实有点快

写了多年的Java&#xff0c;某天机缘巧合之下听说了一门语言叫Rust&#xff0c;Rust的亲爹是Mozilla&#xff0c;如果要和其它语言拼爹的话&#xff0c;实力应该还是可以的。官方介绍如下&#xff1a;Rust is blazingly fast and memory-efficient: with no runtime or garbage…

jax-ws和jax-rs_JAX-RS和JSON-P集成

jax-ws和jax-rs这篇简短的文章讨论了JAX-RS 2.0中对JSON-P的支持 JSON-P…&#xff1f; JSON处理API &#xff08;JSON-P&#xff09;是Java EE 7中引入的。 它提供了用于处理JSON数据的标准API&#xff0c;并且与XML对应的JAXP非常相似。 JSON-B &#xff08;JSON绑定&#x…

这10个C语言技巧让初学者少走180天弯路!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删技巧 1&#xff1a;不要使用“GOTO”语句二十几年前&#xff0c;当计算机编程尚处于起步阶段时&#xff0c;程序流程是由“GOTO”语句来控制。该…

flyway版本号_Flyway版本化管理数据库脚本

假如我们有一个叫shiny的项目&#xff0c;它是由一个程序Shiny-Server 和一个数据库 Shiny-DB组成的;简单结构图如下&#xff1a;image.png但是很多时候&#xff0c;现实开发团队是这样的&#xff1a;image.png我们的项目shiny项目的运行环境是有多套的&#xff0c;我们擅长解决…

hystrix熔断 简介_Hystrix简介

hystrix熔断 简介在过去的几天里&#xff0c;我一直在探索Netflix Hystrix库&#xff0c;并欣赏了这个出色的库所提供的功能。 引用Hystrix网站上的内容&#xff1a; Hystrix是一个延迟和容错库&#xff0c;旨在隔离对远程系统&#xff0c;服务和第三方库的访问点&#xff0c…

89 个嵌入式相关概念,你懂几个?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删01操作系统&#xff08;Operating System&#xff0c;OS&#xff09;是管理计算机硬件与软件资源的系统软件&#xff0c;同时也是计算机系统的内…

python源码笔记_python源码学习笔记(二)

(二) python 继承和多态这非常类似C的功能&#xff0c;只不过是是在C基础上开发的。由上一节知&#xff0c;python的所有对象的基础都是PyObject&#xff0c;所以例如创建一个PyIntObject对象&#xff0c;是通过PyObejct*变量来维护&#xff0c;所以在python内部各个函数之间传…

linux 延时一微秒_让我们暂停一微秒

linux 延时一微秒低延迟Java应用程序中的许多基准测试涉及必须在一定负载下测量系统。 这就要求保持事件进入系统的稳定吞吐量&#xff0c;而不是在没有任何控制的情况下以全油门将事件泵入系统。 我经常要做的任务之一是在事件之间将生产者线程暂停一小段时间。 通常&#xf…

C语言不是最好的,却是我最爱的~

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删以下为译文&#xff1a;虽然 C 语言并不是我所学的第一门语言&#xff0c;也不是我的最后一门语言&#xff0c;但是我仍然非常喜欢 C&#xff0c…

vue 传递多行数据_vue父组件向子组件传递多个数据的实例

在平时我们使用VUE组件的时候&#xff0c;经常需要将父组件的某些数据传递给子组件&#xff0c;这个时候&#xff0c;我们通常会有很多的办法&#xff0c;这里主要分为两种情况&#xff1a;第一种&#xff1a;静态数据传递&#xff1a;传递一个 字符串第二种&#xff1a;动态数…

lucene 源码分析_Lucene分析过程指南

lucene 源码分析本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中&#xff0c;您将了解Lucene。 您将了解为什么这样的库很重要&#xff0c;然后了解Lucene中搜索的工作方式。 此外&#xff0c;您将学习如何将Lucene Search集成到您自己的应用程序中…

ggplot2箱式图两两比较_R语言进阶笔记2 | 长数据与ggplot2

1. 长数据是什么鬼&#xff1f;之前介绍了如何将多个性状的箱线图放在一个图上&#xff0c;比如learnasreml包中的fm数据&#xff0c;它有h1~h5五年的株高数据&#xff0c;想对它进行作图。「数据预览&#xff1a;」> library(learnasreml)> data(fm)> head(fm) Tree…

面向对象,C语言实现简单工厂模式,思路+代码

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删1、简介简单工厂方法定义一个用于创建对象的类&#xff0c;该类接受一个参数&#xff0c;通过参数决定创建不同的对象。GOF并没有把简单工厂方法…

javaone_JavaOne和OOW 2015总结

javaone大家好&#xff01; 终于&#xff0c;我回来了一个很棒的JavaOne和OOW2015。在这篇文章中&#xff0c;我想分享我的经验&#xff0c;一些照片和我参加的演讲的摘要。 会议前 我于2015年6月24日星期六乘Copa航空公司CLO-PTY-SFO飞往旧金山。 从哥伦比亚出发&#xff08;…