Java 17 + JUnit 5 实战:三角形问题决策表从16条到8条的化简逻辑与代码实现
Java 17 JUnit 5 实战三角形问题决策表从16条到8条的化简逻辑与代码实现在软件测试领域黑盒测试方法中的决策表技术因其结构化、系统化的特点成为测试工程师必备的核心技能之一。本文将深入探讨如何运用决策表化简技术优化三角形类型判断问题的测试用例设计并通过Java 17和JUnit 5实现完整的参数化测试方案。1. 三角形问题与决策表基础三角形类型判断是一个经典的软件测试案例其核心逻辑是根据三条边的长度关系确定三角形类型。输入条件包括C1: a b cC2: b a cC3: c a bC4: a bC5: a cC6: b c输出结果包括等边三角形R1等腰三角形R2不等边三角形R3非三角形R4初始决策表包含16条规则2^4因为C4-C6每个条件有是/否两种状态但通过逻辑分析可以发现存在优化空间。2. 决策表化简的核心逻辑化简决策表的关键在于识别输入条件之间的依赖关系2.1 前置条件分析// 三角形存在性检查前置条件 if (!(a b c b a c c a b)) { return Not a triangle; }当C1、C2、C3任一不满足时后续条件判断无意义。这为化简提供了第一个突破口条件组合化简逻辑C1230直接判定为非三角形忽略C4-C6C1231需要继续判断C4-C62.2 对称性合并观察等边三角形的判定条件if (a b b c) { return equilateral; }实际上只需要两个等式成立即可推导出第三个等式ab ∧ bc ⇒ ac。因此可以合并规则原始规则规则1: C41, C51, C61 → R1规则2: C41, C51, C60 → R1矛盾情况实际不可能存在化简后合并规则C41, C51 → R1忽略C62.3 等腰三角形判定优化等腰三角形有多种可能情况if (a b || b c || a c) { return isosceles; }通过分析可以发现当任意两边相等即为等腰三边相等已被等边规则覆盖因此决策表中可以合并具有相同动作的规则原始规则合并后C41, C50, C61C41, C61C40, C51, C61C51, C613. 化简前后的决策表对比原始决策表16条规则规则C123C4C5C6R1R2R3R41-16........................化简后决策表8条规则规则组C123C4C5C6输出类型1-2111-等边31101等腰41100等腰51011等腰61010等腰71001等腰81000不等边9-160---非三角形关键化简点将C1230的8条规则合并为1条等边判定忽略C6条件等腰情况合并相似规则4. Java实现与JUnit 5参数化测试4.1 三角形判断核心类public class Triangle { public String classify(int a, int b, int c) { if (!isValidTriangle(a, b, c)) { return Not a triangle; } if (a b b c) { return Equilateral; } if (a b || b c || a c) { return Isosceles; } return Scalene; } private boolean isValidTriangle(int a, int b, int c) { return a b c b a c c a b; } }4.2 参数化测试类import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import static org.junit.jupiter.api.Assertions.assertEquals; class TriangleTest { static StreamArguments testCases() { return Stream.of( // 等边三角形化简后规则1-2 Arguments.of(8, 8, 8, Equilateral), Arguments.of(5, 5, 5, Equilateral), // 等腰三角形化简后规则3-7 Arguments.of(5, 5, 3, Isosceles), Arguments.of(5, 3, 5, Isosceles), Arguments.of(3, 5, 5, Isosceles), // 不等边三角形化简后规则8 Arguments.of(3, 4, 5, Scalene), // 非三角形化简后规则9-16 Arguments.of(1, 2, 3, Not a triangle), Arguments.of(0, 0, 0, Not a triangle) ); } ParameterizedTest MethodSource(testCases) void testTriangleClassification(int a, int b, int c, String expected) { Triangle triangle new Triangle(); assertEquals(expected, triangle.classify(a, b, c)); } }4.3 测试覆盖率验证通过Jacoco工具可以验证测试用例对决策表的覆盖情况规则组测试用例覆盖状态1-2(8,8,8)✔3(5,5,3)✔.........提示实际项目中应确保每个化简后的规则组至少有一个测试用例覆盖5. 决策表技术的工程实践价值测试效率提升从16条用例减少到8条降低50%的测试维护成本缺陷预防通过系统化的条件组合分析避免遗漏边界情况可维护性当业务规则变更时只需调整决策表而非散落的测试用例常见优化场景输入条件存在互斥关系时多个条件组合产生相同输出时存在前置条件阻断后续判断时决策表化简不仅适用于三角形问题在以下场景同样有效金融领域的风控规则引擎电商平台的优惠券组合策略物联网设备的告警条件判断