Junit单元测试
简介:本文主要讲解,如何使用Eclipse,进行单元测试。
1.准备工作:搭建实验环境(Eclipse+Junit+Ant)
Eclipse:http://www.eclipse.org/
JUnit:http://www.junit.org/
说明:Eclipse 从 3.2 版开始,支持 JUnit4。
Ant 是基于 Java 的开源构建工具。Eclipse 中已经集成了 Ant。
2.新建项目(MyFirstJUnitSample),并进行相关设置
“文件”→“New”→“ Java Project”,打开“New Java Project”窗口。
(1)新建单元测试代码目录(testsrc) 在“Source” 选项卡中单击“create new source folder”,创建新的 source folder——testsrc (testsrc 用于放测试代码)然后单击 finish。
(2)把 JUnit 引入当前项目库中
在“Libraries”选项卡中单击“Add Library…”,选择“JUnit”,然后单击“Next”,选择 版本“JUnit4”,单击“Finish”,完成 JUnit 的引入。
单击“Finish”。
3.编写 Calulator 类
在项目中的 src 目录中新建 myclass 包,在 myclass 包中添加 Calculator 类,代码如下:
//Calculator.java package myclass; public class Calculator { private static int result; //静态变量,用于存储运行结果 public void add(int n) { result= result + n; } public void substract(int n) { result =result - 1; //Bug: 正确的应该是 result =result-n } public void multiply(int n) { } //此方法尚未写好 public void divide(int n) { result =result / n; } public void square(int n) { result = n * n; } public void squareRoot(int n) { for (;; ) {} //Bug : 死循环 } public void clear() { // 将结果清零 result = 0; } public int getResult() { return result; }
4.编写 Calculator 类的第一个测试类 CalculatorTest,生成 JUnit 测试框架。
该测试类包括四个测试方法,分别对应测试 Calculator 的 add、substract、 multiple、divide 方法。
步骤如下:
(1)首先,在项目中的 testsrc 中新建 myclass 包。右键单击 Calculator 类,选择“New”→“JUnit Test Case”。在窗口(如图 7 所示)中可看到:测 试类的 Name 为 CalculatorTest, 被测试类“ Class under test ” 为 myclass.Calculator。
将“Source Folder”指定为 MyFirstJUnitSample/testsrc(即:指定 JUnit 测试类的源代码放在 testsrc 目录中,与项目的被测试类分开。)
(2)单击“Next”,如图 8 所示。选择需要测试的方法,然后单击“Finish”。
Junit 将自动生成测试类 CalculatorTest 的测试框架,结果如下
//myclass.CalculatorTest.java package myclass; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; public class CalculatorTest { @Before public void setUp() throws Exception { } @Test public void testAdd() { fail("Not yet implemented"); } @Test public void testSubstract() { fail("Not yet implemented"); } @Test public void testMultiply() { fail("Not yet implemented"); } @Test public void testDivide() { fail("Not yet implemented"); } }
(3)对 CalculatorTest 中自动生成的代码进行修改,结果如下:
//myclass.CalculatorTest.java package myclass; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; public class CalculatorTest { private static Calculator calculator = new Calculator(); @Before public void setUp() throws Exception { calculator.clear(); } @Test public final void testAdd() { calculator.add(2); calculator.add(3); assertEquals(5, calculator.getResult()); } @Test public final void testSubstract() { calculator.add(10); calculator.substract(2); assertEquals(8, calculator.getResult()); } @Ignore("Multiply() Not yet implemented") @Test public final void testMultiply() { fail("Not yet implemented"); } @Test public final void testDivide() { calculator.add(8); calculator.divide(2); assertEquals(4, calculator.getResult()); } }
5.运行测试
(1)在测试类“CalculatorTest.java”上单击右键,在弹出 的菜单中选择“Run As”→“JUnit Test”。运行结果如图 10 所示。进度条是红 色表示发现错误,具体的测试结果在进度条上面有表示。
发现 Calculator 类的 Substract 方法代码有问题,去修改,改正错误。
(2)修改 Calculator 后,重新运行测试,查看测试结果。
(3)进一步完善测试用例 在测试类 CalculatorTest 中添加测试方法,增加 SquareRoot 方法的测试、 以及对 divide 方法除 0 时是否抛出异常的测试。
@Test(timeout = 1000) public void testSquareRoot() { calculator.squareRoot(4); assertEquals(2, calculator.getResult()); } @Test(expected = ArithmeticException.class) public void divideByZero() { calculator.divide(0); }
6.编写 Calculator 类的第二个测试类 CalculatorAdvancedTest.该测试类测试 Calculator 类的 square 方法。(此案例中,演示了参数测试)
说明:参数化测试是 JUnit 3 不具备的功能。
JUnit4 中参数化测试要点:
(1) 测试类必须由 Parameterized 测试运行器修饰
(2) 准备数据。数据的准备必须在一个方法中进行,该方法须满足条件:
⚫ 该方法必须由 Parameters 注解修饰
⚫ 该方法必须是 public static
⚫ 该方法必须返回 Collection 类型
⚫ 该方法没有参数
⚫ 该方法名字不做要求
步骤: 右键单击“Calculator”类,在弹出的菜单中选择“New”→“JUnit Test Case”。如下图修改“Source Folder” 为“testsrc”,测试类的 Name 为“CalculatorAdvancedTest”。单击“Next”,在 Test Mothods 列表中选 择“square”方法。单击“Finish”即可。
CalculatorAdvancedTest.java 的代码如下:
//CalculatorAdvancedTest.java package myclass; import static org.junit.Assert.*; import java.util.Arrays; import java.util.Collection; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; /** * 参数化测试的类必须由Parameterized测试运行器修饰 */ @RunWith(Parameterized.class) public class CalculatorAdvancedTest { private static Calculator calculator=new Calculator(); private int param; private int result; /** * *准备数据 */ @Parameters public static Collection<Object[]> data(){ return Arrays.asList(new Object[][] {{2,4},{0,0},{-3,9}}); } //构造函数,对变量进行初始化 public CalculatorAdvancedTest(int param,int result){ this.param=param; this.result=result; } @Before public void setUp() throws Exception { calculator.clear(); } @Test public void testSquare() { calculator.square(param); assertEquals(result,calculator.getResult()); } }
运行 CalculatorAdvancedTest 测试类。
测试结果通过。