软件测试

实验项目名称:实验四          

一、     实验目的

1、掌握单元测试的基本理论和作用。

2、掌握典型单元测试工具 JUnit 的使用

二、  实验内容

实验题目

 

三、  实验步骤及结果

 

1、实验任务 2:闰年判断程序及测试——实验步骤

分析

闰年定义:能被 4 整除但不能被 100 整除,或能被 400 整除的年份。

需覆盖的测试场景:

正常闰年(如 2020,能被 4 整除且非整百年)。

整百年闰年(如 2000,能被 400 整除)。

整百年非闰年(如 1900,能被 100 整除但不能被 400 整除)。

非闰年(如 2021,不能被 4 整除)。

 

编写闰年判断类:
LeapYear

public class LeapYear {
    public boolean isLeapYear(int year) {
        if (year % 4 != 0) return false;
        if (year % 100 == 0 && year % 400 != 0) return false;
        return true;
    }
}

 

设计测试用例与编写测试类 LeapYearTest

使用参数化测试覆盖不同年份,重点验证边界条件(整百年)。

class LeapYearTest {

    private LeapYear leapYear = new LeapYear();

    @ParameterizedTest(name = "{0} 是否闰年?预期:{1}")
    @CsvSource({
            "2000,true",
            "1900,false",
            "2024,true",
            "2100,false",
            "2023,false",
            "2016,true"
    })
    void parameterizedLeapYearTest(int year, boolean expected) {
        assertEquals(expected, leapYear.isLeapYear(year));
    }
}

 

 

运行测试与结果验证

执行测试后,所有用例通过,闰年逻辑正确处理边界条件。

 

 

 

 

 

2、实验任务 3:三角形判断程序及测试——实验步骤

分析

输入:三角形三边长度(支持浮点数)。

输出:分类结果(非法边长、非三角形、等边、等腰、直角、钝角、锐角)。

判定逻辑:

边长合法性检查(边长≤0 则非法);

三角形成立条件(任意两边之和大于第三边);

类型判断优先级:等边 > 直角 > 等腰 > 钝角 / 锐角(确保 “等腰直角三角形” 优先判定为直角三角形)。

编写三角形判断类:

public class Triangle {
    /**
     *
判断三角形类型
     * @return "
非三角形", "等边三角形", "等腰三角形", "直角三角形", "钝角三角形", "锐角三角形"
     */
   
public String determineTriangleType(double a, double b, double c) {
        // 检查三边是否为正数
        if (a <= 0 || b <= 0 || c <= 0) {
            return "非三角形";
        }

        // 检查三角形不等式
        if (a + b <= c || a + c <= b || b + c <= a) {
            return "非三角形";
        }

        // 判断等边三角形
        if (a == b && b == c) {
            return "等边三角形";
        }

        // 判断等腰三角形
        if (a == b || b == c || a == c) {
            return "等腰三角形";
        }

        // 排序边的长度,使得a <= b <= c
        double[] sides = {a, b, c};
        java.util.Arrays.sort(sides);
        a = sides[0];
        b = sides[1];
        c = sides[2];

        // 判断直角、钝角、锐角三角形
        double epsilon = 1e-9; // 浮点数比较的精度
        if (Math.abs(a*a + b*b - c*c) < epsilon) {
            return "直角三角形";
        } else if (a*a + b*b < c*c) {
            return "钝角三角形";
        } else {
            return "锐角三角形";
        }
    }
}

 

 

设计测试用例与测试类TriangleClassifierTest

参数化测试:覆盖所有分类场景,包括非法边长、非三角形、等边、等腰、直角、钝角、锐角,以及浮点精度场景(如等腰直角三角形)。

 

class TriangleTest {
    private Triangle triangle;

    @BeforeEach
    void setUp() {
        triangle = new Triangle();
    }

    @Test
    void testNonTriangle() {
        // 任意一边小于等于0
        assertEquals("非三角形", triangle.determineTriangleType(0, 4, 5));
        assertEquals("非三角形", triangle.determineTriangleType(3, -1, 5));
        assertEquals("非三角形", triangle.determineTriangleType(3, 4, -2));

        // 不满足三角形不等式
        assertEquals("非三角形", triangle.determineTriangleType(1, 2, 3));
        assertEquals("非三角形", triangle.determineTriangleType(1, 10, 5));
    }

    @Test
    void testEquilateralTriangle() {
        assertEquals("等边三角形", triangle.determineTriangleType(5, 5, 5));
        assertEquals("等边三角形", triangle.determineTriangleType(10, 10, 10));
    }

    @Test
    void testIsoscelesTriangle() {
        assertEquals("等腰三角形", triangle.determineTriangleType(5, 5, 8));
        assertEquals("等腰三角形", triangle.determineTriangleType(5, 8, 5));
        assertEquals("等腰三角形", triangle.determineTriangleType(8, 5, 5));
    }

    @Test
    void testRightTriangle() {
        assertEquals("直角三角形", triangle.determineTriangleType(3, 4, 5));
        assertEquals("直角三角形", triangle.determineTriangleType(5, 12, 13));
        assertEquals("直角三角形", triangle.determineTriangleType(8, 15, 17));
    }

    @Test
    void testObtuseTriangle() {
        assertEquals("钝角三角形", triangle.determineTriangleType(2, 3, 4.5));
        assertEquals("钝角三角形", triangle.determineTriangleType(3, 4, 6.5));
    }

    @Test
    void testAcuteTriangle() {
        assertEquals("锐角三角形", triangle.determineTriangleType(4, 5, 6));
        assertEquals("锐角三角形", triangle.determineTriangleType(7, 8, 9));
    }

    @ParameterizedTest(name = "[{index}] 三边 {0}, {1}, {2} 形成:{3}")
    @CsvSource({
            "0, 4, 5, 非三角形",
            "3, -1, 5, 非三角形",
            "1, 2, 3, 非三角形",
            "5, 5, 5, 等边三角形",
            "5, 5, 8, 等腰三角形",
            "3, 4, 5, 直角三角形",
            "2, 3, 4.5, 钝角三角形",
            "4, 5, 6, 锐角三角形",
            "7, 8, 9, 锐角三角形"
    })
    void parameterizedTriangleTest(double a, double b, double c, String expected) {
        assertEquals(expected, triangle.determineTriangleType(a, b, c));
    }
}

 

运行测试与结果验证

执行测试后,所有用例通过,闰年逻辑正确处理边界条件。

 

 

 

 

四、  个人体会

 

通过本次实验,我掌握了参数化测试和复杂条件分支的覆盖方法。在三角形分类任务中,需特别注意浮点数精度和三边排序问题。单元测试能有效验证边界条件(如三边相等)和异常处理(如负数边长)。

posted @ 2025-05-04 22:50  /张根源/  阅读(44)  评论(0)    收藏  举报