黑盒测试也称为功能测试或行为测试,它将测试对象视为一个不透明的盒子,仅关注输入与输出之间的关系,而不考虑程序内部逻辑和实现细节。测试依据需求规格说明书,验证功能是否符合预期。黑盒测试能有效发现功能缺失、界面错误、性能问题及数据处理的异常情况。常见的黑盒测试方法包括等价类划分法、边界值分析法、因果图法、决策表法等。本文重点详解等价类划分法与边界值分析法,并辅以 Java 代码示例。
等价类划分法通过将输入域划分为若干互斥的子集(即等价类),每个子集中的数据在揭示程序缺陷方面具有等效性。通过从每个子集中选取典型值进行测试,可大幅减少用例数量,同时保证测试覆盖率。
假设需验证一个整数是否在 1 到 100 之间(含边界),其方法实现如下:
public class NumberValidator {
    public static boolean isValidNumber(int number) {
        return number >= 1 && number <= 100;
    }
}
| 等价类类型 | 输入范围 | 测试用例示例 | 预期结果 | 
|---|---|---|---|
| 有效等价类 | 1 ≤ num ≤ 100 | 50 | true | 
| 无效等价类 | num < 1 | 0 | false | 
| 无效等价类 | num > 100 | 101 | false | 
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class NumberValidatorTest {
    @Test
    void testValidNumber() {
        assertTrue(NumberValidator.isValidNumber(50));  // 有效等价类
    }
    @Test
    void testInvalidNumber_LessThanOne() {
        assertFalse(NumberValidator.isValidNumber(0));   // 无效等价类:下界外
    }
    @Test
    void testInvalidNumber_GreaterThan100() {
        assertFalse(NumberValidator.isValidNumber(101)); // 无效等价类:上界外
    }
}
边界值分析法基于“缺陷倾向于聚集在边界附近”的经验规律,重点测试输入域的边界及邻近值。研究表明,超过 70% 的错误发生在边界条件处,因此该方法是对等价类划分的重要补充。
对于取值范围 [a, b],应测试以下值:
aa + 1b - 1ba - 1 和 b + 1仍以 NumberValidator 类为例,测试边界条件。
| 测试场景 | 输入值 | 预期结果 | 
|---|---|---|
| 下界值 | 1 | true | 
| 下界邻近值 | 2 | true | 
| 上界邻近值 | 99 | true | 
| 上界值 | 100 | true | 
| 下界外值 | 0 | false | 
| 上界外值 | 101 | false | 
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class NumberValidatorBoundaryTest {
    @Test
    void testLowerBoundary() {
        assertTrue(NumberValidator.isValidNumber(1));    // 下界
    }
    @Test
    void testUpperBoundary() {
        assertTrue(NumberValidator.isValidNumber(100));  // 上界
    }
    @Test
    void testBelowLowerBoundary() {
        assertFalse(NumberValidator.isValidNumber(0));   // 下界外
    }
    @Test
    void testAboveUpperBoundary() {
        assertFalse(NumberValidator.isValidNumber(101)); // 上界外
    }
    @Test
    void testNearLowerBoundary() {
        assertTrue(NumberValidator.isValidNumber(2));    // 下界邻近
    }
    @Test
    void testNearUpperBoundary() {
        assertTrue(NumberValidator.isValidNumber(99));    // 上界邻近
    }
}
在 pom.xml 中添加 JUnit 5 依赖:
<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.9.2</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.9.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>
在 build.gradle 中添加依赖:
dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.2'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.2'
}
src/
├── main/
│   └── java/
│       └── com/example/validator/
│           └── NumberValidator.java
└── test/
    └── java/
        └── com/example/validator/
            └── NumberValidatorTest.java
mvn test          # Maven
./gradlew test    # Gradle
黑盒测试通过等价类划分与边界值分析等方法,能高效验证系统功能是否符合预期。其核心在于通过科学的用例设计,以最少测试数据覆盖最大可能性。然而,需结合其他测试方法(如白盒测试、探索性测试)构建完整的质量保障体系。文中提供的 Java 示例展示了如何通过 JUnit 5 实现自动化测试,读者可参考此模式扩展至实际项目。