Junit

Junit单元测试

简介:本文主要讲解,如何使用Eclipse,进行单元测试。

1.准备工作:搭建实验环境(Eclipse+Junit+Ant)

Eclipse:http://www.eclipse.org/

JUnit:http://www.junit.org/

Ant:http://ant.apache.org/

说明:Eclipse 从 3.2 版开始,支持 JUnit4。

​ Ant 是基于 Java 的开源构建工具。Eclipse 中已经集成了 Ant。

2.新建项目(MyFirstJUnitSample),并进行相关设置

“文件”→“New”→“ Java Project”,打开“New Java Project”窗口。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XgOUlra5-1666674838527)(C:/Users/11848/AppData/Roaming/Typora/typora-user-images/image-20221023191959455.png)]

(1)新建单元测试代码目录(testsrc) 在“Source” 选项卡中单击“create new source folder”,创建新的 source folder——testsrc (testsrc 用于放测试代码)然后单击 finish。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1j46QwDW-1666674838528)(C:/Users/11848/AppData/Roaming/Typora/typora-user-images/image-20221023192042496.png)]

(2)把 JUnit 引入当前项目库中

在“Libraries”选项卡中单击“Add Library…”,选择“JUnit”,然后单击“Next”,选择 版本“JUnit4”,单击“Finish”,完成 JUnit 的引入。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QITvpUFJ-1666674838528)(C:/Users/11848/AppData/Roaming/Typora/typora-user-images/image-20221023192141638.png)]

​ 单击“Finish”。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c6cRkucp-1666674838529)(C:/Users/11848/AppData/Roaming/Typora/typora-user-images/image-20221023192220040.png)]

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; }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yRejJGII-1666674838529)(C:/Users/11848/AppData/Roaming/Typora/typora-user-images/image-20221023192406135.png)]

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 目录中,与项目的被测试类分开。)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ulNNxuAV-1666674838529)(C:/Users/11848/AppData/Roaming/Typora/typora-user-images/image-20221023192517050.png)]

(2)单击“Next”,如图 8 所示。选择需要测试的方法,然后单击“Finish”。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-37UAzFIM-1666674838530)(C:/Users/11848/AppData/Roaming/Typora/typora-user-images/image-20221023193155396.png)]

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.运行测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VJKzpLQ5-1666674838530)(C:/Users/11848/AppData/Roaming/Typora/typora-user-images/image-20221023193920491.png)]

(1)在测试类“CalculatorTest.java”上单击右键,在弹出 的菜单中选择“Run As”→“JUnit Test”。运行结果如图 10 所示。进度条是红 色表示发现错误,具体的测试结果在进度条上面有表示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gnl7AuC8-1666674838531)(C:/Users/11848/AppData/Roaming/Typora/typora-user-images/image-20221023193938937.png)]

发现 Calculator 类的 Substract 方法代码有问题,去修改,改正错误。

(2)修改 Calculator 后,重新运行测试,查看测试结果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z4LKVEFk-1666674838531)(C:/Users/11848/AppData/Roaming/Typora/typora-user-images/image-20221023194008953.png)]

(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”即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hujVeQpb-1666674838531)(C:/Users/11848/AppData/Roaming/Typora/typora-user-images/image-20221023194219733.png)]

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 测试类。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TEQZCaRK-1666674838532)(C:/Users/11848/AppData/Roaming/Typora/typora-user-images/image-20221023194325005.png)]

测试结果通过。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客李华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值