目录:
- 清单1
- public class TrafficLight {SignalColor state = SignalColor。红; public void nextState(){switch(state){case RED:state = SignalColor。绿色;打破;情况黄色:状态= SignalColor。红;打破;情况GREEN:状态= SignalColor。黄色;打破;默认:状态= SignalColor。红;在以前的日子里,你可能会继续编写代码,创建更多的类(例如,一个或多个) ,调用nextState并更改清单2中的方法。然后,经过几个月的编码,您可以暂停测试您的工作。
- 注释
- 清单4包含两个@Test方法:testNextState和testChange。 testNextState方法将TrafficLight的nextState方法放到测试中。同样,testChange方法也会显示TrafficLight更改方法的功能。考虑testNextState方法中的代码。 testNextState方法重复调用TrafficLight类的nextState方法和JUnit的assertEquals方法。 assertEquals方法有两个参数:期望值和实际值。
- 失败意味着拥有一个驱动程序。速度(光)值,如0或10. 0在这个例子中,当assertEquals测试通过时,它可能代表完整的,在鼻子上的相等性。
视频: 10.IntelliJ IDEA 使用JUnit 5來 測試程式的操作步驟(IDEA教學 #10) 2024
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清单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将复选框放入
-
nextState()
-
和
更改(int)
-
复选框中。
单击“新建JUnit测试用例”对话框底部的“完成”。 JUnit并不是Java的正式组成部分。而是有自己的一套类和方法来帮助你为你的代码创建测试。在你点击完成之后,Eclipse会询问你是否要将JUnit类和方法作为你的项目的一部分。
-
选择执行以下操作并将JUnit 4库添加到构建路径。然后单击确定。 Eclipse关闭对话框,你的项目有一个全新的TrafficLightTest。 java文件。该文件的代码显示在清单3中。
清单3中的代码包含两个测试,并且这两个测试都包含对令人不愉快的探测失败方法的调用。 Eclipse希望您添加代码以使这些测试通过。
-
删除对失败方法的调用。代替失败方法调用,键入清单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(){
-
TrafficLight light = new TrafficLight(); (999)assertEquals(SignalColor.Red,light.state);
的光。 nextState();
-
assertEquals(SignalColor。GREEN,light。state);
的光。 nextState(); (999)assertEquals(SignalColor。YELLOW,light。状态);
的光。 nextState(); (999)assertEquals(SignalColor.Red,light.state);
-
} @Test public void testChange(){
-
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值应该完全相同(或几乎完全相同)。