junit:junit_简而言之,JUnit:Hello World

junit:junit

对于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”帖子选择了Assert 。 由于对该决定的评论,我意识到至少在这一点上我不得不提到其他可能性。 我将在后续文章中详细介绍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

junit:junit

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

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

相关文章

姓名和学号 c语言,急啊!!!求救了 C语言编一个链表,输出姓名和学号就好

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#include#includetypedef struct Node{int data;struct Node *next;}AN;int data;AN *CreList(AN *head);AN *InsList(AN *head,int data);AN *DelList(AN *head,int data);void find(int value,AN *head);void De…

centos8调整分辨率_Hyper-V 设置 CentOS 8 文本模式下分辨率

CentOS 8 文本模式下分辨率的修改,可以参考我的另一篇文章《CentOS 7 文本模式下修改分辨率》。不过,在 Hyper-V 下发现似乎没有效果,还需要添加如下一行:videohyperv_fb:分辨率具体操作如下(例如,将分辨率设为 800x60…

android 多个复选框,Android UI控件之CheckBox(复选框、多选框)

上一篇文章中学习了RadioButton。知道了RadionButton的基本用法,实现起来也是听简单的和RadioButton一样CheckBox也是一个使用的非常多的控件,Android中它的的用法也挺简单的。以一个例子程序为例:同样先看一个常规的实现:布局文件…

查看Java记录

JEP 359 (可在JDK 14中用作预览功能)将记录引入Java。 记录是对普通数据聚合建模的简单方法。 一个简单的范围记录如下所示: record Range( int from, int to) {} 记录定义实际上与具有以下内容的最终类相同: 不变的领域 公共…

android调用虚拟摄像头方法,Android:如何在模拟器中使用网络摄像头?

我通过在AVD Manager中将前置摄像头设置为“ webcam0”将摄像头连接到仿真器。 启动模拟器的相机应用程序时,出现错误CameraService::connect X (pid 702) rejected (invalid cameraId 0).这是Android源代码的相关部分:sp CameraService::connect(const …

java:退出功能_Java 8:功能VS传统

java:退出功能业务逻辑是相同的: 给定一个由访问次数/时间组成的String表达式,例如:“ 1 / 24h,1..3 / 3h,5 / *” 然后,结果应为以下字符串列表: “ 1 / 24h”, “ 1 / 3h”&am…

安装新版的winetricks_winetricks中文修改版(wine模拟器)

winetricks中文修改版(wine模拟器)这是一个 winetricks 的修改版,添加了一些国内常用的 windows 应用支持,以弥补官方版 winetricks 对国内应用支持不足的情况。但最终目的仍然是希望上游能将这些应用添加进去。目的为所有发行版提供无差异化的 windows …

android 字符串 转公式,java – 在android中将字符串转换为bigdecimal

嗨我怎么能在android中将字符串转换为bigdecimal.这是我的第一项活动:public class ViewCartActivity extends Activity {String mGrandTotal;Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(save…

前端页面预览word_jquery.media.js实现前端页面预览

预览doc预览docx预览pdf预览pdffunction toView(filePath){var url [[{/converter/preview}]]?filePathfilePath;$(".modal-body").empty();$(".modal-body").load(url);$("#previewModal").modal();}function toPdfView(filePath){var url […

神话般的代码

考虑以下代码段: int max 10; int a 0; while (true) {// do a thing that may result in an early return if (a > max) {break;} }throw new RuntimeException("It ran out of attempts");上面有一些WTF。 循环有点不可思议,控制流似乎…

android listview asynctask,Android精通之AsyncTask与ListView讲解

版权声明:未经博主允许不得转载标题图AsyncTask了解AsyncTask异步,需要了解一下异步任务(多线程),什么是线程,可以这么说线程好比边吃饭边看电视,AsyncTask是为了方便后台线程中操作更新UI,本质为Handler异…

python gil锁存在的意义_关于python的GIL全局解释器锁的简单理解

GIL是解释器内部的一把锁,确切一点说是CPython解释器内部的一把锁,所以要注意区分 这和我们在Python代码中使用线程锁Lock并不是一个层面的概念。1. GIL产生的背景:在CPython解释内部运行多个线程的时候,每个线程都需要解释器内部申请相应的全…

打破了vs你错了

为微服务构建REST API时,需要做出一些关于响应的设计决策。 某些响应显然是微服务周围协议的产物–例如3xx代码之类的东西都与重定向和路由有关。 通常,您将尝试获取正确的2xx代码以取得成功。 如有疑问,将为200(确定&#xff09…

php魔术变量的概念_PHP 魔术变量和魔术函数详解

魔术变量PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。有八个魔术常量它们的值随着它们在代码中的位置改变而改变。…

android studio on/off 切换开关,如何使用android studio中的开关小部件来启用/禁用函数()?...

试试这个:import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JFrame;import javax.swing.JRadioButton;public class test {public static volatile boolean activated false;public test() {JFrame q new JFrame();q.…

javabeans_(单元测试)JavaBeans的技巧

javabeans如果您正在编写Java代码,那么您至少要编写一些遵循JavaBean约定的类,即,具有带有公共getter和setter方法的私有属性的类,包含无参数的构造函数,可序列化,并且遵守Equals和HashCode合同。 最重要的…

8分钟答辩稿_5分钟学会8个答辩小套路,教资面试没在怕的啦!

注意!1.笔试成绩查询时间官方给出的时间是12月10日,但是根据往年情况,一般时间都会提前,12月9日下午极有可能开通查询,所以大家要准备好哦~现在进入教资【成绩查询微信群】,老师都会第一时间发布通知&#…

android lable标签,android:label说明

文章目录1. 说明android:label 用于app 在切换activity的时候,自动更换左上角的显示2. 代码架构3. String.xml 字符串资源文件My Application主界面 labsecond 界面 lab4. AndroidMainfest.xmlpackage"com.example.myapplication">android:allowBackup"true&…

Neo4J OGM与Quarkus

在下面的视频中,我演示了一个使用Neo4J数据库和Neo4J OGM的Quarkus应用程序示例。 看一下GitHub上的示例项目 。 我为咖啡豆创建了一个示例域,其中包含我们可以查询和匹配的某些风味配置文件。 红色节点是来自某个国家/地区的咖啡豆,味道像…

鸿蒙os内测版应用名称,谁知道报名鸿蒙系统公测,应用名称怎么填的?

[分享交流]谁知道报名鸿蒙系统公测,应用名称怎么填的?92209电梯直达huafen327001442初窥门径发表于 2020-12-18 21:17:21来自:HUAWEI Mate 30 Pro 5G最新回复 2020-12-26 21:47:39Screenshot_20201218_210913_com.tencent.mm_edit_1719993392…