我使用的IDE是IntelliJ IDEA.
- 首先我们创建一个普通的maven项目 (当然我们也可以创建一个gradle项目, 也可以直接下载junit的jar包进行导入, 后面这两种方式我就不在此介绍), 然后在pom.xml文件中加入Junit3.8的包:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.2</version>
</dependency>
- 创建一个package, 比如 com.test.junit, 然后下package下创建一个类 Calculator.java 用于计算加减乘除:
package com.test.junit;
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int minus(int a, int b) {
return a - b;
}
public int multiply(int a, int b) {
return a * b;
}
public int divide(int a, int b) throws Exception {
if (0 == b) {
throw new Exception("除数不能为0!");
}
return a / b;
}
}
- 下面我们开始编写测试用例, test/java 下创建包com.test.junit, 我们的测试用例的package最好与你所要测试的类的package是相同的结构, 这样做他们编译后的class文件就会在同一级目录中, 这不需要额外进行import待测试的类, 测试用例代码如下:
package com.test.junit;
import junit.framework.Assert;
import junit.framework.TestCase;
public class CalculatorTest extends TestCase {
private Calculator cal;
@Override
public void setUp() throws Exception {
cal = new Calculator();
System.out.println("setUp");
}
@Override
public void tearDown() throws Exception {
System.out.println("tearDown");
}
public void testAdd() {
int result = cal.add(1, 2);
Assert.assertEquals(3, result);
}
public void testMinus() {
int result = cal.minus(1, 2);
Assert.assertEquals(-1, result);
}
public void testMultiply() {
int result = cal.multiply(2, 3);
Assert.assertEquals(6, result);
}
public void testDivide() {
int result = 0;
try {
result = cal.divide(6, 4);
} catch (Exception e) {
e.printStackTrace();
Assert.fail();
}
Assert.assertEquals(1, result);
}
public void testDivide2() {
Throwable tx = null;
try {
cal.divide(4, 0);
Assert.fail();
} catch (Exception e) {
tx = e;
}
Assert.assertNotNull(tx);
Assert.assertEquals(Exception.class, tx.getClass());
Assert.assertEquals("除数不能为0!", tx.getMessage());
}
}
-
执行测试用例, 结果如下, 全绿的说明测试都通过了, 当然测试通过不代表你的代码没有bug, 可能会有其他的一些情况使我们没有想到的
这里对测试用例简单的进行一些说明:
- Junit3.8中我们的测试用例类必须继承TestCase 类
- 测试方法必须是公有的(public), 无返回参数的(void), 无方法参数的方法, 并且必须以test开头, test后面名字可以随便取, 当然最好使用你要测试的方法名, 便于阅读
- setUp方法会再每个测试方法前都执行一次, tearDown方法会再每个测试方法执行完后执行一次, 注意是每个测试测试方法执行前后都会执行(在Junit4中提供了可以在所有测试方法之前和之后只执行一次的注解, 我们可以用它来做一些数据库初始化的操作, 这部分内容后面文章再进行介绍), 我们可以在setUp中进行一些初始化操作, 如上我们会再执行每个测试方法前都会生成一个Calculator的对象.
- 在测试方法中我们调用要测试的方法, 将结果与你期望的结果进行比较, 使用Assert.assertEquals(期望值, 实际值)
- 在测试异常情况时, 例如上面的例子的testDivide()方法, 我们期望输入的值得到结果不会抛出异常, 如果进入catch就说明有意外的错误, 需要加上Assert.fail()让junit抛出错误; 再看testDivide2(), 我们输入的除数为0, 我们期望它抛出异常, 所以当执行到cal.divide(4, 0)下一行的时候不是我们期望的, 我们期望的是进入catch中去, 所以我们需要在cal.divide(4, 0)后加上Assert.fail(); testDivede()如果抛出异常了, 可能我们同样也把它捕获到了, 所以即使抛出异常了, 测试也会通过, 所以我们需要在testDivide()的catch代码块中加入Assert.fail()让测试不能通过, 因为进入catch不是我们期望的; 这里可能比较绕, 需要结合代码多理解理解.
Junit3相对来说比较简单, 下篇文章将直接进入Junit4, Junit4中增加了一些新特性, 例如:
- 使用注解进行配置
- 进行参数化测试, 解决同一个方法输入参数相同, 但是在junit3.8中需要每一种情况都需要写一个测试方法, Junit4中可以提前预备好数据
- 可以在所有测试方法执行前进行初始化操作
- 等等