个人理财 使用JUnit

使用JUnit

目录:

视频: 10.IntelliJ IDEA 使用JUnit 5來 測試程式的操作步驟(IDEA教學 #10) 2024

视频: 10.IntelliJ IDEA 使用JUnit 5來 測試程式的操作步驟(IDEA教學 #10) 2024
Anonim

JUnit 是测试Java单元(即Java类)的标准化框架。 JUnit可以自动完成一些测试工作。

想象一下,您已经创建了一个具有三个值的枚举类型:GREEN,YELLOW和RED。清单1包含以下代码:

清单1

public enum SignalColor {GREEN,YELLOW,RED}

交通信号灯具有一个状态(这是交通灯颜色的一个奇特名称)。

<! --1 - >
public class TrafficLight {SignalColor state = SignalColor。红;

如果您知道交通灯的当前状态,您可以决定交通灯的下一个状态。 public void nextState(){switch(state){case RED:state = SignalColor。绿色;打破;情况黄色:状态= SignalColor。红;打破;情况GREEN:状态= SignalColor。黄色;打破;默认:状态= SignalColor。红; break;}}

你也可以改变交通灯的状态一定次数:

<! - 2 - >

public void change(int numberOfTimes){for(int i = 0; i 综合起来,你有TrafficLight类在清单2中。

清单2

public class TrafficLight {SignalColor state = SignalColor。红; public void nextState(){switch(state){case RED:state = SignalColor。绿色;打破;情况黄色:状态= SignalColor。红;打破;情况GREEN:状态= SignalColor。黄色;打破;默认:状态= SignalColor。红;在以前的日子里,你可能会继续编写代码,创建更多的类(例如,一个或多个) ,调用nextState并更改清单2中的方法。然后,经过几个月的编码,您可以暂停测试您的工作。


真是一个惊喜!你的测试会失败!你不应该延迟一两天以上的测试。提前测试并经常测试!

关于测试的一个哲学说,你应该尽快测试每一块代码。当然,“代码块”这个词听起来不太科学。让开发人员四处谈论他们今天下午所做的“代码测试”是不行的。最好把每一块代码称为

单元

,并让开发者谈论 单元测试 。最常见的测试单位是一个班级。所以一个典型的Java开发人员在编写该类的代码后立即测试每个类。那么你怎么去测试一个班呢?新手可以通过编写一个额外的类来测试TrafficLight类 - 一个包含主要方法的类。主要方法创建一个TrafficLight实例,调用nextState并更改方法,并显示结果。新手检查结果并将其与一些预期值进行比较。在为几十个,几百个甚至几千个类编写主要方法之后,新手(现在是一个成熟的开发人员)厌倦了测试程序,并寻找使测试过程自动化的方法。厌倦与否,一个开发者可能试图破译另一个开发者的手工编码测试。没有任何构建测试的标准或准则,阅读和理解另一个开发人员的测试可能是困难和乏味的。所以JUnit来救援! 。 要了解Eclipse如何自动使用JUnit,请执行以下操作: 创建包含清单1和清单2的Eclipse项目。

在Windows中,右键单击Package Explorer的TrafficLight。 Java分支。在Mac上,按住Control键并点击Package Explorer的TrafficLight。 Java分支。出现上下文菜单。

在上下文菜单中,选择New→JUnit Test Case。因此,出现“新建JUnit测试用例”对话框。

单击“新建JUnit测试用例”对话框底部的“下一步”。因此,您将看到“新建JUnit测试用例”对话框的第二页。第二页列出属于(直接或间接)到TrafficLight类的方法。

在勾选红绿灯的复选框中勾选复选框。

因此,Eclipse将复选框放入

  1. nextState()

  2. 更改(int)

  3. 复选框中。

    单击“新建JUnit测试用例”对话框底部的“完成”。 JUnit并不是Java的正式组成部分。而是有自己的一套类和方法来帮助你为你的代码创建测试。在你点击完成之后,Eclipse会询问你是否要将JUnit类和方法作为你的项目的一部分。

  4. 选择执行以下操作并将JUnit 4库添加到构建路径。然后单击确定。 Eclipse关闭对话框,你的项目有一个全新的TrafficLightTest。 java文件。该文件的代码显示在清单3中。

    清单3中的代码包含两个测试,并且这两个测试都包含对令人不愉快的探测失败方法的调用。 Eclipse希望您添加代码以使这些测试通过。

  5. 删除对失败方法的调用。代替失败方法调用,键入清单4中以粗体显示的代码。

    在包资源管理器中,右键单击(在Windows中)或按住Control键单击(在Mac上)TrafficLightTest。 Java分支。在结果的上下文菜单中,选择Run As→JUnit Test。 Eclipse可能有不止一种类型的JUnit测试框架。如果是这样,你可能会看到一个如下所示的对话框。如果这样做,请选择Eclipse JUnit启动器,然后单击确定。结果,Eclipse运行你的TrafficLightTest。 java程序。 Eclipse在其自己的Package Explorer之前显示运行的结果。结果显示没有错误,没有失败。呼! 清单3 import static org。 JUnit的。断言。 *;进口组织JUnit的。测试; public class TrafficLightTest {@Test public void testNextState(){fail(“Not yet implemented”);} @Test public void testChange(){fail(“Not yet implemented”);}} 清单4 import静态组织JUnit的。断言。 *;进口组织JUnit的。测试; public class TrafficLightTest {@Test public void testNextState(){

  6. TrafficLight light = new TrafficLight(); (999)assertEquals(SignalColor.Red,light.state);

    的光。 nextState();

  7. assertEquals(SignalColor。GREEN,light。state);

    的光。 nextState(); (999)assertEquals(SignalColor。YELLOW,light。状态);

    的光。 nextState(); (999)assertEquals(SignalColor.Red,light.state);

  8. } @Test public void testChange(){

  9. TrafficLight light = new TrafficLight();

    的光。变化(5); (999)assertEquals(SignalColor。YELLOW,light。状态);当您选择运行方式→JUnit测试时,Eclipse不会查找主要方法。相反,Eclipse会查找以@Test和其他类似的东西开始的方法。 Eclipse执行每个@Test方法。

    像@Test这样的东西是Java

注释

清单4包含两个@Test方法:testNextState和testChange。 testNextState方法将TrafficLight的nextState方法放到测试中。同样,testChange方法也会显示TrafficLight更改方法的功能。考虑testNextState方法中的代码。 testNextState方法重复调用TrafficLight类的nextState方法和JUnit的assertEquals方法。 assertEquals方法有两个参数:期望值和实际值。

在最上面的assertEquals调用中,期望的值是SignalColor。红。您期望交通信号灯为红色,因为在清单2中,您使用SignalColor值初始化灯的状态。红。 在最上面的assertEquals调用中,实际值是轻的。状态(实际存储在交通灯状态变量中的颜色)。 如果实际值等于期望值,则调用assertEquals传递,JUnit将继续执行testNextState方法中的语句。 但是,如果实际值与期望值不同,则assertEquals失败,运行结果显示失败。例如,请考虑在清单4中的第一个assertEquals调用中更改期望值时会发生什么情况: @Test public void testNextState(){TrafficLight light = new TrafficLight(); assertEquals(SignalColor。YELLOW,light。状态); 施工结束后,交通信号灯的颜色为红色,不是黄色。所以testNextState方法包含一个错误的断言,并且Run As→JUnit的结果看起来像一个孩子的错误报告卡。 在清单4中的testChange 之前放置testNextState并不能保证 JUnit将在执行testChange之前执行testNextState。如果你有三个@Test方法,JUnit可能会从最顶层到最底层,从最底层到最顶层,从中间层到最顶层到最底层,或者以任何顺序执行它们。 JUnit甚至可能在一个测试的中间暂停执行另一个测试的部分。这就是为什么当你编写另一个测试时,你不应该对一个测试的结果做出假设。 您可能希望某些语句在任何测试开始之前执行。如果你这样做,把这些语句放在一个名为setUp的方法中,然后在@Before注释前加上这个方法。 (请参阅上面清单2中的步骤3中的 setUp() 复选框。) 这里的消息:不是所有的assertEquals方法都是相等的!想象一下,将Driver类添加到您的项目代码中。 “驱动程序类”并不意味着打印机驱动程序或打桩机。这意味着驾驶一辆车的人 - 一辆接近红绿灯的汽车。有关详细信息,请参见清单5. 清单5

public class Driver {public double velocity(TrafficLight light){switch(light。state){case RED:return 0.0; case黄:返回10. 0;情况绿色:返回30. 0;当灯为红色时,驾驶员的速度为0. 0.当灯为黄色时,车辆正在减速至安全的10. 0当灯为绿色时,在这个例子中,速度的单位并不重要,它们可以是每小时英里,或者是每小时公里,或者其他什么,唯一的办法是如果汽车在波士顿或纽约市,在这种情况下,YELLOW的速度应该远高于GREEN的速度,而RED的速度不应该是0. 0)。

创建JUnit测试驱动程序类,按照本文前面列出的步骤1至9,但一定要做出以下更改: 在步骤2中,右键单击或按住Control键并单击驱动程序。 java分支而不是TrafficLight。 Java分支。 在步骤5中,将一个复选标记放在驱动程序分支中。

在步骤8中,删除失败方法调用,以创建清单6中所示的DriverTest类。(您输入的代码以粗体显示)

清单6

  • import static org。 JUnit的。断言。 *;进口组织JUnit的。测试; public class DriverTest {@Test public void testVelocity(){

  • TrafficLight light = new TrafficLight();

的光。变化(7);

驱动程序驱动程序=新的驱动程序(); assertEquals(30.0,driver。velocity(light),0.1);

}}

如果一切顺利,JUnit测试会以飞行颜色传递。 (更确切地说,JUnit的颜色是绿色!)所以DriverTest的运行并不新鲜或令人兴奋。令人兴奋的是对清单6中的assertEquals的调用。

当您比较Java程序中的两个double值时,您无权期待在头等同。也就是说,其中一个double值可能是30000000000,而另一个double值更接近于30000000001.一台计算机只有64位来存储每个double值,并且在这里和那里不准确地蠕变。所以在JUnit中,比较double值的assertEquals方法有第三个参数。第三个参数代表摆动的房间。 在清单6中,语句 assertEquals(30.0,driver。velocity(light),0.1);

表示如下:“断言司机的实际价值。速度(光)在期望值30的0.1之内。如果是这样,则断言通过。否则,断言失败。 “ 当您调用double值的assertEquals时,选择一个好的错误边界可能会非常棘手。这些数字说明了可能出错的事情。 在这里,您的误差幅度太小。在那里,你的误差太大了。幸运的是,在这个DriverTest示例中,保证金0. 1是一个非常安全的赌注。原因如下:

当assertEquals测试失败时,失败的概率大于0. 1.

失败意味着拥有一个驱动程序。速度(光)值,如0或10. 0在这个例子中,当assertEquals测试通过时,它可能代表完整的,在鼻子上的相等性。

驱动程序的值。速度(光)直接来自清单5中的返回30. 0代码。不涉及算术。所以司机的价值。速度(光)和预期的30. 0值应该完全相同(或几乎完全相同)。
使用JUnit

编辑的选择

特权的基础知识在Oracle 12c - 虚拟机

特权的基础知识在Oracle 12c - 虚拟机

用户可以在Oracle 12c数据库中完成。您可能希望允许用户能够登录,但是您可能需要限制用户是否可以执行以下任一任务:访问某些数据开始...

Oracle 12c恢复管理器(RMAN)目录 - 傻瓜

Oracle 12c恢复管理器(RMAN)目录 - 傻瓜

的基础知识Oracle 12c恢复管理器(RMAN)环境,请考虑恢复目录。恢复目录是所有RMAN配置参数,备份操作和元数据的存储库。该目录可以无限期地存储备份信息。如何在Oracle 12c中选择目录模式RMAN提供了两种用于存储备份数据的选项:NOCATALOG ...

如何验证,查看和关闭Oracle 12c审计 - 傻瓜

如何验证,查看和关闭Oracle 12c审计 - 傻瓜

打开数据库中的审计记录,跟踪您制定的审计,以便您了解所做的事情。幸运的是,Oracle 12c在数据库中提供了一些视图来帮助您跟踪自己的操作:要验证您为审计配置的系统特权,请使用视图AUDIT_UNIFIED_POLICIES。要查看...

编辑的选择

Drupal友好的网页寄存公司 - 傻瓜

Drupal友好的网页寄存公司 - 傻瓜

网页寄存公司为您提供访问Web服务器,您可以在其中安装Drupal并使您的网站在Web上可见。一些公司为您安装Drupal或为您提供一键安装,为您节省了一些工作量。如果您决定自己跳过Drupal的安装,请考虑通过以下方式之一获取帐户...

Drupal花园功能 - 傻瓜

Drupal花园功能 - 傻瓜

让您有机会查看和使用所有Drupal花园功能,可以创建一个新的站点,然后选择自定义选项而不是其中一个已安装的模板:确保已经登录,然后单击我的站点链接。这样做打开了Drupal花园站点经理。点击创建...

Drupal园林主题生成器 - 傻瓜

Drupal园林主题生成器 - 傻瓜

Drupal花园设置完成后,有一些乐趣和玩你的网站上的主题。使用Drupal Gardens Theme Builder控制网站的外观是与安装Drupal自身副本不同的主要方式。但是你不会错过太多...

编辑的选择

更改MYOB中的文本和日期 - 虚拟人物

更改MYOB中的文本和日期 - 虚拟人物

MYOB为您提供了许多快捷方式以帮助简化任务。例如,您可以像在任何文字处理器中那样在MYOB中复制和粘贴文本。以下是快捷方式:按键组合快捷键结果Ctrl-A选择所有高亮显示的文本Ctrl-C复制文本Ctrl-V粘贴文本Ctrl-X删除或剪切文本Ctrl-Z取消最后一位...

在Salesforce中创建视图。当您单击Salesforce中的某个选项卡以访问特定对象(例如“帐户”,“联系人”或“个案”)时,您可以在对象主页上找到自己的服务云 - 虚拟

在Salesforce中创建视图。当您单击Salesforce中的某个选项卡以访问特定对象(例如“帐户”,“联系人”或“个案”)时,您可以在对象主页上找到自己的服务云 - 虚拟

主页,如果你选择案例,如图所示)。案例主页。当您点击Salesforce中的一个选项卡以访问特定的对象(例如,帐户,联系人或个案)时,您可以看到一些较大的,勾勒出的最近案例,报告和矩形的矩形。