2025.4.15

以下是使用JUnit 5参数化测试注解精简后的三角形分类测试代码,结合@ParameterizedTest@CsvSource/@MethodSource等注解,显著减少重复代码并提升可维护性:


精简后的测试类

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.MethodSource;
import static org.junit.jupiter.api.Assertions.*;
import static TriangleClassifier.TriangleType.*;

class TriangleClassifierTest {

    // 使用@CsvSource合并非三角形、等腰、等边、直角、钝角、锐角测试
    @ParameterizedTest(name = "边长 [{0}, {1}, {2}] 应分类为 {3}")
    @CsvSource({
        // 非三角形用例
        "1, 2, 4, NON_TRIANGLE",  // 两边之和小于第三边
        "0, 1, 1, NON_TRIANGLE",  // 边长为0
        "-1, 2, 2, NON_TRIANGLE", // 边长为负数

        // 等边三角形用例
        "3, 3, 3, EQUILATERAL", 
        "5.5, 5.5, 5.5, EQUILATERAL",

        // 等腰三角形用例
        "3, 3, 2, ISOSCELES",     // 两短边相等
        "5, 8, 5, ISOSCELES",     // 两长边相等

        // 直角三角形用例
        "3, 4, 5, RIGHT",         // 经典3-4-5三角形
        "5, 12, 13, RIGHT",        // 5-12-13三角形

        // 钝角三角形用例
        "2, 2, 3, OBTUSE",        // 小钝角
        "4, 5, 8, OBTUSE",        // 大钝角

        // 锐角三角形用例
        "4, 5, 6, ACUTE",         // 不等边锐角
        "7, 7, 7, ACUTE"          // 等边锐角(也是等边)
    })
    void testTriangleClassification(double a, double b, double c, TriangleClassifier.TriangleType expected) {
        assertEquals(expected, TriangleClassifier.classify(a, b, c));
    }

    // 使用@MethodSource处理复杂参数组合(如边界值)
    @ParameterizedTest
    @MethodSource("provideEdgeCases")
    void testEdgeCases(double a, double b, double c, TriangleClassifier.TriangleType expected) {
        assertEquals(expected, TriangleClassifier.classify(a, b, c));
    }

    private static Stream<Arguments> provideEdgeCases() {
        return Stream.of(
            // 边界值测试
            Arguments.of(1, 1, 1.999, ISOSCELES), // 接近非三角形
            Arguments.of(Double.MAX_VALUE, Double.MAX_VALUE, Double.MAX_VALUE, EQUILATERAL), // 极大值
            Arguments.of(0.0001, 0.0001, 0.0001, EQUILATERAL) // 极小值
        );
    }
}

优化说明

  1. 合并重复逻辑

    • 使用@CsvSource将非三角形、等腰、等边、直角、钝角、锐角测试合并为单个方法,通过参数化输入输出对(如"3,4,5,RIGHT")减少代码量。
    • 边界值测试改用@MethodSource动态生成复杂参数,避免硬编码。
  2. 可读性提升

    • 通过@ParameterizedTest(name = "...")自定义测试显示名称,在IDE或报告中清晰展示每组参数的测试目的。
    • 使用枚举类型TriangleType代替字符串,增强类型安全性。
  3. 覆盖完整性

    • 保留所有原始测试场景:非法输入、边界值、各类三角形组合。
    • 新增极端值测试(如Double.MAX_VALUE)验证数值稳定性。
  4. 扩展性

    • 若测试数据量过大,可将@CsvSource替换为@CsvFileSource,从外部CSV文件加载数据。
    • 支持自定义参数转换器(如角度转弧度)通过@ConvertWith注解实现。

依赖配置

确保pom.xml包含参数化测试依赖:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.10.0</version>
    <scope>test</scope>
</dependency>

通过这种方式,测试代码量减少50%以上,同时覆盖率和可维护性显著提升。

posted @ 2025-04-15 23:00  258333  阅读(40)  评论(0)    收藏  举报