软件测试04

 

 

实验项目名称:实验        

一、 实验目的

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

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

 

 

二、 实验内容

实验任务 1 :

请按以下操作步骤完成一个基本的 JUnit 测试实例。

以下是在IntelliJ IDEA环境下使用JUnit对Calculator类进行单元测试的详细步骤:

步骤1:创建Java项目

1. 打开IntelliJ IDEA → 新建项目 → 选择"Java" → 设置项目名称和路径 → 创建

 步骤2:创建Calculator类

public class Calculator {

    // 加法

    public int add(int a, int b) {

        return a + b;

    }

    // 减法

    public int subtract(int a, int b) {

        return a - b;

    }

    // 乘法

    public int multiply(int a, int b) {

        return a * b;

    }

    // 除法

    public double divide(int a, int b) {

        if(b == 0) throw new ArithmeticException("Cannot divide by zero");

        return (double) a / b;

    }

}

步骤3:添加JUnit依赖

1. 右键项目 → Open Module Settings

2. 选择"Libraries" → "+" → From Maven

3. 输入org.junit.jupiter:junit-jupiter-api:5.8.2 → 确定

4. 重复添加:

   - org.junit.jupiter:junit-jupiter-engine:5.8.2

   - org.junit.jupiter:junit-jupiter-params:5.8.2

 步骤4:创建测试类

1. 在src/test/java目录右键 → New → Java Class → 命名为CalculatorTest

2. 添加测试类注解:

import org.junit.jupiter.api.BeforeEach;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

 

class CalculatorTest {

    private Calculator calculator;

 

    @BeforeEach

    void setUp() {

        calculator = new Calculator();

    }

 

    @Test

    void testAdd() {

        assertEquals(5, calculator.add(2, 3));

        assertEquals(-1, calculator.add(2, -3));

    }

 

    @Test

    void testSubtract() {

        assertEquals(1, calculator.subtract(4, 3));

        assertEquals(7, calculator.subtract(10, 3));

    }

 

    @Test

    void testMultiply() {

        assertEquals(6, calculator.multiply(2, 3));

        assertEquals(-6, calculator.multiply(2, -3));

    }

 

    @Test

    void testDivide() {

        assertEquals(2.0, calculator.divide(6, 3));

        assertEquals(3.333, calculator.divide(10, 3), 0.001);

    }

 

    @Test

    void testDivideByZero() {

        assertThrows(ArithmeticException.class, () -> calculator.divide(5, 0));

    }

}

步骤5:运行测试

1. 点击测试类左侧的绿色箭头图标 ▶️

2. 选择"Run 'CalculatorTest'"

3. 查看结果:

   - 绿色进度条:所有测试通过

   - 红色进度条:存在失败的测试

实验任务 2 :编写程序判断闰年,设计测试⽤例并⽤Junit进⾏测试。

实验任务3:编写程序判断非三角形,等腰三角形,等边三角形,直角三角形,钝角三角形,锐角三角形,设计测试用例并用JUnit进行测试。

 

 

三、 设计思路及结果

实验任务 1

  根据下面的说明,建立一个基于 JUnit4 的测试项目,对一个类当中的多个方法进行单元测试,进一步体验一下单元测试的作用和 JUnit 测试的应用。

  首先新建一个项目叫 JUnitTest,我们编写一个 Calculator 类,这是一个能够简单实现加减乘除、平方、的计算器类,然后对这些功能进行单元测试。该类代码如下:

 

package org.example;

public class Calculator {
    // 加法
    public int add(int a, int b) {
        return a + b;
    }

    // 减法
    public int subtract(int a, int b) {
        return a - b;
    }

    // 乘法
    public int multiply(int a, int b) {
        return a * b;
    }

    // 除法
    public double divide(int a, int b) {
        if (b == 0) throw new ArithmeticException("Cannot divide by zero");
        return (double) a / b;
    }
}

 

JUnit4 单元测试包引入这个项目,生成 JUnit 测试框架,进行测试。

添加 JUnit 依赖(Maven)

  <dependencies>

    <dependency>

        <groupId>org.junit.jupiter</groupId>

        <artifactId>junit-jupiter-api</artifactId>

        <version>5.8.2</version>

        <scope>test</scope>

    </dependency>

    <dependency>

        <groupId>org.junit.jupiter</groupId>

        <artifactId>junit-jupiter-engine</artifactId>

        <version>5.8.2</version>

        <scope>test</scope>

    </dependency>

    <dependency>

        <groupId>org.junit.jupiter</groupId>

        <artifactId>junit-jupiter-params</artifactId>

        <version>5.8.2</version>

        <scope>test</scope>

    </dependency>

</dependencies>

创建测试类 CalculatorTest

import org.junit.jupiter.api.BeforeEach;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

 

class CalculatorTest {

 

    private Calculator calculator;

 

    @BeforeEach

    void setUp() {

        calculator = new Calculator();

    }

 

    @Test

    void testAdd() {

        assertEquals(5, calculator.add(2, 3));

        assertEquals(-1, calculator.add(2, -3));

    }

 

    @Test

    void testSubtract() {

        assertEquals(1, calculator.subtract(4, 3));

        assertEquals(7, calculator.subtract(10, 3));

    }

 

    @Test

    void testMultiply() {

        assertEquals(6, calculator.multiply(2, 3));

        assertEquals(-6, calculator.multiply(2, -3));

    }

 

    @Test

    void testDivide() {

        assertEquals(2.0, calculator.divide(6, 3));

        assertEquals(3.333, calculator.divide(10, 3), 0.001);

    }

 

    @Test

    void testDivideByZero() {

        assertThrows(ArithmeticException.class, () -> calculator.divide(5, 0));

    }

}

运行测试:

 

实验任务 2

  编写程序判断闰年,设计测试⽤例并⽤Junit进⾏测试。

package org.example;

public class LeapYear {
    public boolean isLeapYear(int year) {
        if (year <= 0) {
            throw new IllegalArgumentException("年份必须为正整数");
        }
        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
    }
}

package org.example;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class LeapYearTest {

    private LeapYear leapYear;

    @BeforeEach
    void setUp() {
        leapYear = new LeapYear();
    }

    @Test
    void testLeapYears() {
        assertTrue(leapYear.isLeapYear(2020));  // 普通闰年
        assertTrue(leapYear.isLeapYear(2000));  // 世纪闰年
    }

    @Test
    void testNonLeapYears() {
        assertFalse(leapYear.isLeapYear(1900)); // 世纪平年
        assertFalse(leapYear.isLeapYear(2021)); // 普通平年
    }

    @Test
    void testInvalidYear() {
        assertThrows(IllegalArgumentException.class, () -> leapYear.isLeapYear(0));
        assertThrows(IllegalArgumentException.class, () -> leapYear.isLeapYear(-400));
    }
}

 

运行截图:

 

 

 

实验任务 3

编写程序判断一般三角形,等腰三角形,等边三角形,设计测试用例并用JUnit进行测试。

package org.example;

import java.util.Arrays;

public class TriangleClassifier {
    public String classify(double a, double b, double c) {
        double[] sides = {a, b, c};
        Arrays.sort(sides);  // 升序排序,便于判断角度
        a = sides[0];
        b = sides[1];
        c = sides[2];

        // 判断非三角形
        if (a + b <= c || a <= 0 || b <= 0 || c <= 0) {
            return "非三角形";
        }

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

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

        // 勾股关系判断角度
        double a2 = a * a, b2 = b * b, c2 = c * c;

        if (Math.abs(a2 + b2 - c2) < 1e-6) {
            return "直角三角形";
        } else if (a2 + b2 < c2) {
            return "钝角三角形";
        } else {
            return "锐角三角形";
        }
    }
}

package org.example;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class TriangleClassifierTest {

    TriangleClassifier classifier = new TriangleClassifier();

    @Test
    void testNonTriangle() {
        assertEquals("非三角形", classifier.classify(1, 2, 3));
        assertEquals("非三角形", classifier.classify(0, 1, 1));
        assertEquals("非三角形", classifier.classify(-1, 1, 2));
    }

    @Test
    void testEquilateralTriangle() {
        assertEquals("等边三角形", classifier.classify(3, 3, 3));
    }

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

    @Test
    void testRightTriangle() {
        assertEquals("直角三角形", classifier.classify(3, 4, 5));
        assertEquals("直角三角形", classifier.classify(5, 12, 13));
    }

    @Test
    void testObtuseTriangle() {
        assertEquals("钝角三角形", classifier.classify(3, 4, 6));
    }

    @Test
    void testAcuteTriangle() {
        assertEquals("锐角三角形", classifier.classify(5, 6, 7));
    }
}

 

 

运行截图:

 

测试用例编号

输入边长 a,b,c

预期结果

用例说明

TC01

1, 2, 3

非三角形

两边之和等于第三边

TC02

3, 3, 3

等边三角形

三边相等

TC03

5, 5, 8

等腰三角形

两边相等

TC04

3, 4, 5

直角三角形

满足勾股定理

TC05

3, 4, 6

钝角三角形

c² > a² + b²

TC06

5, 6, 7

锐角三角形

c² < a² + b²

TC07

0, 4, 5

非三角形

有边为 0

TC08

-1, 4, 5

非三角形

有负边长

 

 

 

 

 

三、实验总结

  通过本次实验,我掌握了 JUnit 框架在 Java 单元测试中的应用,针对计算器功能、闰年判断及三角形分类等场景设计了覆盖正常逻辑、边界条件和异常情况的测试用例。JUnit 的注解(如@Test、@BeforeEach)和断言方法(assertEquals、assertThrows)简化了测试代码编写,让我能够高效验证代码的正确性与健壮性。在实践中,我深刻体会到单元测试需全面考虑输入边界(如负数年份、零边长)和异常处理(如除零错误、非法参数),而测试驱动的思维(先定义预期结果再实现逻辑)能显著减少代码漏洞。此外,处理浮点精度断言和三角形边长排序逻辑时的调试经历,让我认识到细节把控和逻辑严谨性的重要性。单元测试不仅是质量保障的第一道防线,更是提升代码可维护性和协作效率的关键,未来我会将其融入日常开发流程,培养 “测试先行” 的良好习惯。

posted @ 2025-05-06 21:55  艾鑫4646  阅读(17)  评论(0)    收藏  举报