“单元”的大小或范围,并没有一个明确的标准,“单元”可以是一个函数、方法、类、功能模块或者子系统。单元测试一般是有开发人员或测试人员来做。单元测试通常和白盒测试联系到一起,如果单从概念上来讲两者是有区别的,不过我们通常所说的“单元测试”和“白盒测试”都认为是和代码有关系的,单元测试和白盒测试就是对开发人员所编写的代码进行测试。
我们就可以通过运行main()方法来运行测试代码。 不过,使用main()方法测试有很多缺点:
因此,我们需要一种测试框架,帮助我们编写测试。
JUnit是一个开源的Java语言的单元测试框架,专门针对Java设计,使用最广泛。JUnit是事实上的单元测试的标准框架,任何Java开发者都应当学习并使用JUnit编写单元测试。
使用JUnit编写单元测试的好处在于,我们可以非常简单地组织测试代码,并随时运行它们,JUnit就会给出成功的测试和失败的测试,还可以生成测试报告,不仅包含测试的成功率,还可以统计测试的代码覆盖率,即被测试的代码本身有多少经过了测试。对于高质量的代码来说,测试覆盖率应该在80%以上。
此外,几乎所有的IDE工具都集成了JUnit,这样我们就可以直接在IDE中编写并运行JUnit测试。JUnit目前最新版本是5。
如何使用Junit
要使用JUnit,首先需要将JUnit库添加到您的项目中。可以通过以下两种方式之一进行安装
junit
junit
4.13.2
test
org.junit.jupiter
junit-jupiter
RELEASE
test
一旦您的项目配置好了JUnit,就可以开始编写测试用例了。JUnit使用注解来标识测试方法,以下是一个简单的示例:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class MyMathTest {
@Test
public void testAdd() {
MyMath math = new MyMath();
int result = math.add(2, 3);
assertEquals(5, result);
}
}
除了上面介绍的常用JUnit注解之外,JUnit 5还提供了一些其他有用的注解,可以用于测试和测试方法的各种配置和控制。
断言(Assertion)是测试代码中用于验证某个条件是否为真或某个结果是否符合预期的机制。在单元测试中,断言用于确保代码按预期运行,如果断言失败,测试将报告错误并指出问题所在。
assertEquals(expected, actual)
:检查 expected
和 actual
是否相等。如果不相等,测试失败。
assertEquals(5, calculator.add(2, 3));
assertNotEquals(expected, actual)
:检查 expected
和 actual
是否不相等。如果相等,测试失败。
assertNotEquals(4, calculator.add(2, 3));
assertTrue(condition)
:检查 condition
是否为 true
。如果为 false
,测试失败。
assertTrue(calculator.isPositive(5));
assertFalse(condition)
:检查 condition
是否为 false
。如果为 true
,测试失败。
assertFalse(calculator.isNegative(5));
assertNull(object)
:检查 object
是否为 null
。如果不是 null
,测试失败。
assertNull(calculator.getResult());
assertNotNull(object)
:检查 object
是否不为 null
。如果为 null
,测试失败。
assertNotNull(calculator.getResult());
assertArrayEquals(expectedArray, actualArray)
:检查 expectedArray
和 actualArray
是否相等。如果不相等,测试失败。
assertArrayEquals(new int[]{1, 2, 3}, calculator.getArray());
assertThrows(expectedType, executable)
:检查 executable
执行时是否抛出 expectedType
类型的异常。如果没有抛出或抛出不同类型的异常,测试失败。
assertThrows(IllegalArgumentException.class, () -> calculator.divide(1, 0));
参数化测试(Parameterized Testing)是一种测试方法,它允许你用不同的输入值来执行相同的测试逻辑,以验证代码在不同输入条件下的行为。这样可以减少代码重复,增加测试覆盖面。
@RunWith(Parameterized.class)
public class CalculatorTest {
private int a; // 第一个数字
private int b; // 第二个数字
private int expectedSum; // 预期的结果
// 构造函数,用于传入测试参数
public CalculatorTest(int a, int b, int expectedSum) {
this.a = a;
this.b = b;
this.expectedSum = expectedSum;
}
// 提供测试数据
@Parameterized.Parameters
public static Collection
两个重点
测试套件(Test Suite)是一个组织和管理测试用例的集合。它将多个测试用例组合在一起,以便一次性执行和管理。这是一种方便的方式来组织和运行测试,特别是在面对大量测试用例时。
//Juint4
@RunWith(Suite.class)
@Suite.SuiteClasses({
TestClass1.class,
TestClass2.class
})
public class TestSuite {
// 这个类没有代码,作为测试套件的标识
}
//Juint4
@Suite
@SelectClasses({
TestClass1.class,
TestClass2.class
})
public class TestSuite {
// 这个类没有代码,作为测试套件的标识
}