简而言之,JUnit:Hello World

对于Java世界中的开发人员而言, JUnit似乎是最受欢迎的测试工具 。 因此,难怪就此主题已经写了一些好书 。 但是,通过以顾问为生,我仍然经常遇到程序员,他们至多对工具及其正确用法都不了解。

因此,我想到了写几篇介绍基本技术的文章的想法。 目的是提供一个合理的起点,但要避免令人生畏的信息泛滥xUnit测试模式1 。 相反,将在适当时提供指向深入文章,书籍章节或不同意见的指针,以便进一步阅读。

尽管存在有关该主题的其他文章,但本微型系列文章中采用的方法可能适合帮助一两个开发人员熟悉JUnit测试的世界-这将使工作值得。

何必呢?

编写高质量的软件是一项艰巨的任务。 至于其他许多倡导敏捷方法的人,对我而言,进行大规模的前期计划并不可行。 但是,就所有这些方法而言,当我们开始将JUnit与TDD一起使用时,我获得了最大的进步。 确实,实证研究似乎证实了我的看法,正如infoQ文章所述2 ,这种做法可以提高质量

但是,JUnit测试并不像看起来那样琐碎。 我们一开始犯的一个致命错误是将测试班视为第二等公民。 逐渐地,我们意识到测试不仅仅是一个简单的验证机,而且-如果编写得不当心,可能会给维护和进步带来麻烦3

如今,我倾向于将测试用例更多地视为被测单元的随附规范 。 与齿轮之类的工件的规格非常相似,它告诉质量检查人员该单元必须满足哪些关键指标。 但是由于软件的性质,只有开发人员才能编写如此低级的规范。 这样,自动化测试就成为有关单元预期行为的重要信息来源。 还有一个不像文档那样容易过时的…

入门

一千英里的旅程始于一步
老子

让我们假设我们必须编写一个简单的数字范围计数器,该计数器从给定值开始传递一定数量的连续整数。 遵循随附规范的隐喻,我们可以从以下代码开始:

public class NumberRangeCounterTest {
}

测试类表达了开发单位NumberRangeCounter意图 , Meszaros将其表示为被测系统 (SUT)。 按照通用的命名模式,单元名称由后缀Test补充。

一切都很好,但是急躁的人可能会想:下一步是什么? 首先应该测试什么? 而且–无论如何我如何创建可执行测试?

有多种方法可以合并JUnit。 如果您使用Eclipse Java IDE,则该库已包含在内。 只需将其添加到项目的构建路径中,这在本教程中就足够了。 要获得自己的副本,请参阅下载并安装 ,有关maven集成的信息,请参见《 使用JUnit》 ;如果您碰巧需要OSGi捆绑软件,请在月食轨道下载中查找。

通常,从Happy Path开始是个好主意, Happy Path是执行的“正常”路径,理想情况下是一般业务用例。 对于SUT NumberRangeCounter这可能是一个验证测试,以确保计数器在方法的后续调用中返回连续的数字,该方法仍必须定义。

可执行的JUnit测试是一个公开的非静态方法,该方法使用@Test进行注释,并且不带任何参数。 总结所有这些信息,下一步可能是以下方法存根4

public class NumberRangeCounterTest {@Testpublic void subsequentNumber() {    }
}

仍然不多,但实际上JUnit第一次运行测试就足够了。 可以从命令行或特定的UI启动JUnit测试运行,但是在本教程的范围内,我假定您具有可用的IDE集成。 在Eclipse中,结果看起来像这样5

格林巴

绿色条表示测试运行未发现任何问题。 这并不奇怪,因为我们还没有测试任何东西。 但是请记住,我们已经做了一些有用的考虑,可以帮助我们轻松地进行第一个测试:

  1. 我们打算编写一个NumberRangeCounter单元,该单元负责传递连续的整数值序列。 为了测试它,我们可以创建一个局部变量,该局部变量采用此类计数器的新实例。
  2. @Testpublic void subsequentNumber() {    NumberRangeCounter counter = new NumberRangeCounter();}
  3. 由于第一个测试应该断言NumberRangeCounter提供的数字是连续的整数值,表示5、6、7等,因此SUT可以使用提供这些值的方法。 此外,可以两次调用此方法以提供最小的后续值集。
  4. @Testpublic void subsequentNumber() {    NumberRangeCounter counter = new NumberRangeCounter();int first = counter.next();int second = counter.next();}

到目前为止看起来很合理,但是如果second的值不是first的有效后继,我们如何确保测试运行被表示为失败? 为此,JUnit提供了org.junit.Assert类,该类提供了一组静态方法来帮助开发人员编写所谓的自检测试。

带有assert前缀的方法用于检查特定条件,并在否定结果上抛出AssertionError 。 JUnit运行时会拾取此类错误,并在结果报告中将测试标记为失败。

2014年8月13日更新:使用org.junit.Assert只是一种可能。 JUnit还包括一个匹配器库Hamcrest ,许多人认为它是有关干净代码的更好解决方案。 我个人最喜欢名为AssertJ的第三方库的语法。

我认为Assert对于初学者来说可能更直观,因此我为“ hello world”帖子选择它。 由于对该决定的评论,我意识到至少在这一点上我不得不提到其他可能性。 我将在后续文章中详细介绍Hamcrest和AssertJ的用法。

要断言两个值或对象相等,可以使用Assert#assertEquals 。 由于在声明方法调用中使用静态导入是很常见的,因此subsequentNumber测试可以像这样完成:

@Testpublic void subsequentNumber() {    NumberRangeCounter counter = new NumberRangeCounter();int first = counter.next();int second = counter.next();assertEquals( first + 1, second );}

如您所见,测试指定了SUT的重要行为,甚至还不存在。 顺便说一句,这也意味着测试类不再编译! 因此,下一步可能是创建我们部门的框架来解决此问题。

尽管本教程是关于JUnit而不是TDD的,但是我还是选择了后者的方法,以强调干净的JUnit测试用例所具有的规范字符。 这种方法将工作重点从单位的内部转移到其使用和较低级别的要求上。

如果您想了解有关TDD的更多信息,特别是用于实现单个单元的“红色/绿色/重构”口头禅,可以读一读 Kent Beck的“ 示例驱动开发”或Lasse Koskela的“ 示例 驱动”一书。

下面的代码片段显示了NumberRangeCounter存根的外观:

public class NumberRangeCounter {public int next() {return 0;}
}

再次运行测试,由于NumberRangeCounter#next()实现不足,现在导致出现红条。 这样可以确保通过无用的验证或类似方式不会偶然满足该规范:

红条

除红色条外,执行报告还显示总共运行了多少测试,哪些测试因错误而终止以及有多少由于错误的断言而失败。 每个错误/失败的堆栈跟踪信息有助于在测试类中找到确切的位置。

AssertionError提供了一条解释性消息,该消息显示在故障跟踪的第一行中。 错误测试可能表示任意编程错误,从而导致在测试的断言语句之外引发Exception

请注意,JUnit遵循“ 全有或全无”原则。 这意味着,如果一个测试运行涉及一个以上的测试(通常是这种情况),则单个测试的失败将整个执行标记为红色,表示失败。

由于某个特定单元的实际实现与本文主题无关,因此请您自己提出一种创新的解决方案,以使我们的第一个测试再次通过!

结论

前面的部分介绍了JUnit测试的基本知识–如何编写,执行和评估它。 在这样做的同时,我重视这样的事实,即应该使用人们可能想到的最高编码标准来开发此类测试。 给出的示例希望平衡得足够好,以提供易于理解的介绍而又不琐碎。 改进建议当然受到高度赞赏。

Nutshell文章中的下一个JUnit将继续该示例,并涵盖测试用例的一般概念及其四个阶段的测试结构,请继续关注。

  1. 不要误会我的意思-我非常喜欢这本书,但是通用方法可能不是入门的最佳方法:xUnit测试模式, Gerard Meszaros ,2007年
  2. 其他研究在http://biblio.gdinwiddie.com/biblio/StudiesOfTestDrivenDevelopment上列出,对实证研究的比较分析可在https://tuhat.halvi.helsinki.fi/portal/files/29553974/2014_01_swqd_author_version.pdf上找到。
  3. 另请参阅:保持测试整洁,干净的代码,第9章, Robert C. Martin, 2009年
  4. 关于如何命名测试方法的观点存在分歧。 我已经在正确获取JUnit测试名称中写下了有关此主题的一些注意事项
  5. 有关如何在Eclipse中使用JUnit的更多信息,您可能想阅读我的文章《 在Eclipse中有效使用JUnit》

翻译自: https://www.javacodegeeks.com/2014/08/junit-in-a-nutshell-hello-world.html

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

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

相关文章

命令设计模式的应用

嗨,您好! 今天,我将与您分享一种非常出色的编程设计模式。 它有很多用法,是我的最爱之一。 编程设计模式命令具有多种用例。 在这篇文章中,我们将看到如何实现现实世界中的某些东西。 我们将使用电子汽车钥匙来打开&…

adodb.stream对象的方法/属性

cancel 方法 使用方法如下 object.cancel 说明:取消执行挂起的异步 execute 或 open 方法的调用。 close 方法 使用方法如下 object.close :关闭对像 copyto 方法 使用方法如下 object.copyto(deststream,[charnumber]) 说明:将对像的数据复制…

MongoDB非关系型数据库开发手册

一:NoSql数据库 什么是NoSQL? NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。 NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收…

解决DataGridView绑定List后不能排序的问题

阅读全文并下载例子 :http://www.sufeinet.com/forum.php?modviewthread&tid190 以前不都是用table直接绑定DataGridView的,没有出现过不能排序的问题,初试List结果发现不管怎么样都不能实现排序的功能,有朋友说 DataGridVie…

maven编译的时候排除junit测试类

maven编译的时候排除junit测试类 maven项目中使用junit进行单元测试&#xff0c;在进行编译的时候&#xff0c;可以通过2种方式排除test测试类的编译。 有2种方式 &#xff1a; 使用命令的时候带上参数 mvn install -Dmaven.test.skiptrue 在pom.xml里面配置<plugins><…

生成器设计模式的应用

嗨&#xff0c;您好&#xff01; 今天&#xff0c;我将分享我制作的全新设计模式系列的第一个。 构建器设计模式是开发严肃的应用程序时非常有用且通用的模式。 在这篇文章中&#xff0c;我将提供一个很小的构建器模式框架&#xff0c;因此您随时可以回到这里并使用它。 助记…

知识整理2019清北学堂提高储备D5

今天主讲图论。 前言&#xff1a;图的定义&#xff1a;图G是一个有序二元组(V,E)&#xff0c;其中V称为顶集(Vertices Set)&#xff0c;E称为边集(Edges set)&#xff0c;E与V不相交。它们亦可写成V(G)和E(G)。 一、图的存储&#xff1a; 1、邻接矩阵&#xff1a; 2、邻接表&am…

CSS之文字溢出处理

1.单行文本之三剑客<p>刘诗诗&#xff0c;原名刘诗施&#xff0c;1987年3月10日出生于北京市&#xff0c;中国内地影视女演员、影视出品人。</p>p{border: 1px solid red;width: 400px;height: 40px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis…

GA,RC,Alpha,Beta,Final等软件版本名词释义

对应上图的表格如下&#xff1a; 名词&#xff01;说明Alphaα是希腊字母的第一个&#xff0c;表示最早的版本&#xff0c;内部测试版&#xff0c;一般不向外部发布&#xff0c;bug会比较多&#xff0c;功能也不全&#xff0c;一般只有测试人员使用。Betaβ是希腊字母的第二个&…

HawtIO在JBoss EAP上(第二部分)

我刚刚发布了一篇关于在JBoss Wildfly 8.1上运行HawtIO的条目 。 从那篇文章中&#xff0c;您将了解HawtIO多么出色 &#xff0c;以及它必须具备的所有 出色 插件&#xff0c;才能从单个仪表板管理基于JVM的技术……好吧…… hawt ……。 但是&#xff0c;出于上一篇文章中概述…

Mule ESB,ActiveMQ和DLQ

在本文中&#xff0c;我将展示一个简单的Mule ESB流程&#xff0c;以了解实际中使用的Active MQ 的DLQ功能 。 我假设您有一个正在运行的Apache ActiveMQ实例&#xff08;如果没有&#xff0c;则可以在此处下载一个版本&#xff09;。 在此示例中&#xff0c;我使用了Mule ESB…

Choose and Divide UVa 10375

题目大意&#xff1a;给出p,q,r,s&#xff0c;求组合数C(p,q)/C(r,s) 题目思路&#xff1a; 化简得到&#xff1a;原式等价于(p!(r-s)!s!) / (r!(p-q)!q!) 由算数基本定理可知任意一个正整数可被唯一分解为素数幂乘积的形式&#xff0c;将分子分母分解后&#xff0c;进行约分即…

Linux sudo 详解

简单的说&#xff0c;sudo 是一种权限管理机制&#xff0c;管理员可以授权于一些普通用户去执行一些 root 执行的操作&#xff0c;而不需要知道 root 的密码。严谨些说&#xff0c;sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然&#xff0c;能做什么…

echarts自定义图例legend文字和样式

话不多说&#xff0c;先上效果图。 要完成这个图并不难&#xff0c;主要是下面那个图例比较难&#xff0c;需要定制。 让我们从官方文档找找思路&#xff0c;官方文档关于legend.formatter是这样的&#xff1a;链接在这 难点在于&#xff1a; 1.这里的图例文本包含两个变量&am…

【题解】整理书本

题目描述 小A想把他满屋子的书整理一下。书本分成若干堆。每一堆的书本都有质量w和价值v。小A的任务是将所有书合成一堆。因为小A认为合并i&#xff0c;j两堆的书所需要的力为w[i]-v[i]w[j]-v[j]。合并后的书堆的质量和价值均为合并前两堆书的质量和价值的总和。也就是说&#…

JBoss Wildfly 8.1上的HawtIO

HawtIO为基于JVM的中间件提供了令人赞叹的视觉效果。 它是应用程序的统一控制台&#xff0c;否则将不得不构建自己的糟糕的Web控制台。 老实说&#xff0c;它们的构建方式各不相同&#xff0c;技术不同&#xff0c;用户体验不同&#xff0c;并且都围绕一种可怕的方式来尝试在QA…

jsp实现上一页下一页翻页功能

前段时间一直忙于期末考试和找实习&#xff0c;好久没写博客了。 这段时间做了个小项目&#xff0c;包含了翻页和富文本编辑器Ueditor的两个知识点,Ueditor玩的还不是很深&#xff0c;打算玩深后再写篇博客。 要实现翻页功能&#xff0c;只需要设置一个pageIndex即可&#xf…

自定义Cassandra数据类型

在博客文章《 从Java连接到Cassandra》中 &#xff0c;我提到了用Java 实现的Cassandra Java开发人员的一个优势是能够创建自定义 Cassandra数据类型 。 在这篇文章中&#xff0c;我将详细介绍如何执行此操作。 Cassandra具有许多内置的数据类型 &#xff0c;但是在某些情况下…

Docker的安装及注意事项

Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#…

基于CSS的个人网页

前端时间做的CSS作业&#xff1a;基于CSS的个人网页 基于CSS的个人网页 效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>吴广林的个人博客</title><link rel"styles…