JUnit测试框架学习

JUnit基础

JUnit是Java编程语言最流行的单元测试框架。它可以帮助我们编写和运行可重复的测试。

基本注解

// JUnit常用注解
@Test       // 标记测试方法
@Before     // 在每个测试方法之前执行
@After      // 在每个测试方法之后执行
@BeforeClass // 在所有测试方法之前执行一次
@AfterClass  // 在所有测试方法之后执行一次
@Ignore     // 忽略测试方法

断言方法

JUnit提供了多种断言方法来验证测试结果:

// JUnit断言方法
assertEquals(expected, actual);    // 验证两个值是否相等
assertTrue(condition);             // 验证条件是否为true
assertFalse(condition);            // 验证条件是否为false
assertNull(object);                // 验证对象是否为null
assertNotNull(object);             // 验证对象是否不为null
assertSame(expected, actual);      // 验证两个对象引用是否相同
assertNotSame(expected, actual);   // 验证两个对象引用是否不同

测试示例

简单测试类示例

import org.junit.Test;
import static org.junit.Assert.*;

public class CalculatorTest {
    private Calculator calculator = new Calculator();
    
    @Test
    public void testAdd() {
        assertEquals(4, calculator.add(2, 2));
    }
    
    @Test
    public void testSubtract() {
        assertEquals(2, calculator.subtract(4, 2));
    }

测试生命周期示例

import org.junit.*;

public class TestLifecycle {
    @BeforeClass
    public static void setUpClass() {
        System.out.println("在所有测试方法之前执行一次");
    }
    
    @Before
    public void setUp() {
        System.out.println("在每个测试方法之前执行");
    }
    
    @Test
    public void testMethod1() {
        System.out.println("测试方法1");
    }
    
    @Test
    public void testMethod2() {
        System.out.println("测试方法2");
    }
    
    @After
    public void tearDown() {
        System.out.println("在每个测试方法之后执行");
    }
    
    @AfterClass
    public static void tearDownClass() {
        System.out.println("在所有测试方法之后执行一次");
    }
}

测试套件

测试套件允许我们将多个测试类组织在一起运行:

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
    CalculatorTest.class,
    StringUtilsTest.class,
    DateUtilsTest.class
})
public class AllTests {
    // 这个类可以为空,它只是用来组织测试类
}

参数化测试

参数化测试允许我们使用不同的参数运行同一个测试方法:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
import java.util.Collection;

@RunWith(Parameterized.class)
public class CalculatorTest {
    private int input1;
    private int input2;
    private int expected;
    
    public CalculatorTest(int input1, int input2, int expected) {
        this.input1 = input1;
        this.input2 = input2;
        this.expected = expected;
    }
    
    @Parameterized.Parameters
    public static Collection data() {
        return Arrays.asList(new Object[][] {
            {1, 2, 3},
            {2, 3, 5},
            {3, 4, 7}
        });
    }
    
    @Test
    public void testAdd() {
        assertEquals(expected, calculator.add(input1, input2));
    }
}

异常测试

测试方法可以验证是否抛出了预期的异常:

import org.junit.Test;
import static org.junit.Assert.*;

public class ExceptionTest {
    @Test(expected = IllegalArgumentException.class)
    public void testDivideByZero() {
        calculator.divide(1, 0);
    }
}