当前位置:首页 > 技术 > 正文内容

基于JUnit 5的三角形分类算法测试用例设计与实现

访客 技术 2026年10月3日 1

核心判定逻辑重构

在处理几何图形分类任务时,传统的多重条件分支往往伴随较高的代码冗余度。通过对输入的三条边长进行升序排列,可以大幅简化合法性校验与角度类型判定的流程。排序完成后,最短边固定于索引0,最长边固定于索引2,此时仅需验证两短边之和是否大于最长边即可完成三角形不等式检查。角度分类则依赖余弦定理的代数推论:对比两短边平方和与最长边平方的数值关系,即可精准划分直角、钝角与锐角类型。为防止边长较大时发生整型乘法溢出,平方运算阶段统一采用长整型进行中间值存储。

package com.example.geometry;

import java.util.Arrays;

public class ShapeEvaluator {
    public static String classify(int edgeA, int edgeB, int edgeC) {
        int[] sides = {edgeA, edgeB, edgeC};
        Arrays.sort(sides);

        if (sides[0] <= 0) {
            return "非法图形";
        }
        if (sides[0] + sides[1] <= sides[2]) {
            return "非法图形";
        }

        if (sides[0] == sides[2]) {
            return "等边三角形";
        }
        if (sides[0] == sides[1] || sides[1] == sides[2]) {
            return "等腰三角形";
        }

        long shortSqSum = (long) sides[0] * sides[0] + (long) sides[1] * sides[1];
        long longSq = (long) sides[2] * sides[2];

        if (shortSqSum == longSq) {
            return "直角三角形";
        }
        if (shortSqSum < longSq) {
            return "钝角三角形";
        }
        return "锐角三角形";
    }
}

测试用例设计策略

针对该分类器,测试方案主要围绕等价类划分与边界值分析展开。输入域被明确切割为有效几何集合与非法参数集合。非法集合涵盖零值、负数以及违反三角不等式的临界组合。有效集合则进一步细分为等边、等腰、直角、钝角与锐角五个独立子集。在JUnit 5框架下,采用参数化测试机制替代冗余的断言语句,通过数据驱动模式提升测试脚本的可读性与维护效率。每组用例均覆盖典型数值与边界场景,确保核心分支获得充分覆盖。

package com.example.geometry;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import static org.junit.jupiter.api.Assertions.assertEquals;

class ShapeEvaluatorTest {

    @Test
    @DisplayName("校验非法参数与不构成三角形的边界条件")
    void validateInvalidInputs() {
        assertEquals("非法图形", ShapeEvaluator.classify(0, 4, 5));
        assertEquals("非法图形", ShapeEvaluator.classify(-2, 3, 4));
        assertEquals("非法图形", ShapeEvaluator.classify(2, 3, 5));
        assertEquals("非法图形", ShapeEvaluator.classify(1, 1, 3));
    }

    @ParameterizedTest
    @CsvSource({
        "7, 7, 7, 等边三角形",
        "12, 12, 12, 等边三角形"
    })
    @DisplayName("等边三角形数据驱动验证")
    void checkEquilateral(int a, int b, int c, String expected) {
        assertEquals(expected, ShapeEvaluator.classify(a, b, c));
    }

    @ParameterizedTest
    @CsvSource({
        "4, 4, 6, 等腰三角形",
        "8, 5, 5, 等腰三角形",
        "9, 9, 12, 等腰三角形"
    })
    @DisplayName("等腰三角形数据驱动验证")
    void checkIsosceles(int a, int b, int c, String expected) {
        assertEquals(expected, ShapeEvaluator.classify(a, b, c));
    }

    @ParameterizedTest
    @CsvSource({
        "6, 8, 10, 直角三角形",
        "9, 12, 15, 直角三角形",
        "5, 12, 13, 直角三角形"
    })
    @DisplayName("直角三角形数据驱动验证")
    void checkRightAngled(int a, int b, int c, String expected) {
        assertEquals(expected, ShapeEvaluator.classify(a, b, c));
    }

    @ParameterizedTest
    @CsvSource({
        "3, 4, 6, 钝角三角形",
        "4, 5, 8, 钝角三角形",
        "7, 8, 12, 钝角三角形"
    })
    @DisplayName("钝角三角形数据驱动验证")
    void checkObtuse(int a, int b, int c, String expected) {
        assertEquals(expected, ShapeEvaluator.classify(a, b, c));
    }

    @ParameterizedTest
    @CsvSource({
        "4, 5, 6, 锐角三角形",
        "6, 7, 8, 锐角三角形",
        "8, 9, 10, 锐角三角形"
    })
    @DisplayName("锐角三角形数据驱动验证")
    void checkAcute(int a, int b, int c, String expected) {
        assertEquals(expected, ShapeEvaluator.classify(a, b, c));
    }
}

测试执行与验证要点

参数化测试通过CSV格式注入多维数据集,JUnit引擎会自动迭代执行并生成独立的子测试报告。对于非法输入场景,使用标准单元测试方法集中校验异常边界。在实际运行过程中,测试框架会针对每组边长组合调用分类接口,并将实际返回值与预设期望进行严格比对。若平方和比较逻辑或排序预处理存在缺陷,参数化用例将迅速定位失败的数据节点,从而有效保障几何判定算法的鲁棒性。

标签: JUnit5

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。