使用 JUnit 进行单元测试

Java 测试入门

Maria Milusheva

Senior Software Engineer

单元测试——定义

两个关键概念:

单元(Unit)——应用中最小的可测试部分,如方法

单元测试(Unit testing)——在与应用其他部分隔离的情况下,验证单个"单元"代码正确性的测试

Java 测试入门

单元测试关注细节

要点:

  • 单元测试关注小块逻辑,而非全局

  • 其他测试类型关注全局(如集成测试)

  • JUnit 因主要用于单元测试而得名

直观展示单元测试与生产代码关系的图示

Java 测试入门

测试类型——简述

  • 本课程主要讨论单元集成测试
  • 但测试类型远不止这些!

软件测试示意图:包含功能性测试(如单元测试)与非功能性测试(如可用性测试)

Java 测试入门

测试类型——简述

  • 本课程主要讨论单元集成测试
  • 但测试类型远不止这些!

软件测试示意图:包含功能性测试(如单元测试)与非功能性测试(如可用性测试)。本版本圈出了单元与集成测试

Java 测试入门

JUnit 语法:assertTrue() 与 assertFalse()

  • assertTrue() 检查语句为 true:
List<String> list = new ArrayList<>();

assertTrue(list.isEmpty()); // 无错误
  • assertFalse() 检查相反情况:
List<String> list = new ArrayList<>();
list.add("A");

assertFalse(list.isEmpty()); // 无错误
Java 测试入门

assertNull() 与 assertNotNull()

null 变量会导致 NullPointerException

  • 检查变量为/不为 null 的断言——assertNull()assertNotNull()

  • 常见用法:验证从外部获取的值不为 null

Map<String, Integer> catalogue = new HashMap<>();

catalogue.put("item1", 10);

// 无错误
assertNotNull(catalogue.get("item1"));
assertNull(catalogue.get("item2"));
Java 测试入门

断言异常

设想要验证抛出 ArrayIndexOutOfBoundsException

public String getIndex(String[] array, int index) {
    return array[index];
}

JUnit 提供多种方式实现!

Java 测试入门

assertInstanceOf()

  • JUnit 提供 assertThrows(),但需要使用高级 Java 语法(lambda 表达式)

  • 可像这样使用 assertInstanceOf()

try {
    getIndex(new String[]{}, 4);
} catch (Exception e) {
    // 传入期望的异常类和捕获到的异常  
    assertInstanceOf(ArrayIndexOutOfBoundsException.class, e); 
}
1 https://www.baeldung.com/junit-assert-exception
Java 测试入门

为单元测试命名

  • 典型项目包含数百个单元测试

  • 它们应轻量且易懂

  • 使用信息量大的名称,便于一眼看出失败原因

例如:methodUnderTest_expectedBehavior_conditions()

1 https://dzone.com/articles/7-popular-unit-test-naming?fromrel=true
Java 测试入门

¡Vamos a practicar!

Java 测试入门

Preparing Video For Download...