软测实验3:单元测试实验

114 阅读3分钟

实验要求:通过实验,理解单元测试原理,熟悉单元测试工具的使用。

编写四则运算程序(如例1)或其它(如例2),确定测试单元,设计测试用例,借助某单元测试工具做单元测试。具体用什么单元测试工具,根据自己情况自选,如xUnit, TestNG、gtest、pytest、unittest等。在实验报告中,给出测试需求、测试设计、测试用例集、测试执行结果与分析。

一、测试需求

  1. 测试add方法能够正确计算两个数的加法
  2. 测试subtract方法能够正确计算两个数的减法
  3. 测试multiply方法能够正确计算两个数的乘法
  4. 测试divide方法能够正确计算两个数的除法
  5. 测试除数为0时,divide方法能够得出Infinity

二、测试设计

  1. 对add方法进行测试,包括正整数、负整数、小数、0等不同类型的输入
  2. 对subtract方法进行测试,包括正整数、负整数、小数、0等不同类型的输入
  3. 对multiply方法进行测试,包括正整数、负整数、小数、0等不同类型的输入
  4. 对divide方法进行测试,包括正整数、负整数、小数、0等不同类型的输入,以及除数为0的情况

三、测试用例集

  1. add方法测试用例:
    • 输入:2, 3 期望输出:5
    • 输入:-2, 3 期望输出:1
    • 输入:2.5, 3.5 期望输出:6.0
    • 输入:0, 3 期望输出:3
  1. subtract方法测试用例:
    • 输入:5, 3 期望输出:2
    • 输入:-2, 3 期望输出:-5
    • 输入:2.5, 1.5 期望输出:1.0
    • 输入:0, 3 期望输出:-3
  1. multiply方法测试用例:
    • 输入:2, 3 期望输出:6
    • 输入:-2, 3 期望输出:-6
    • 输入:2.5, 1.5 期望输出:3.75
    • 输入:0, 3 期望输出:0
  1. divide方法测试用例:
    • 输入:6, 3 期望输出:2.0
    • 输入:-6, 3 期望输出:-2.0
    • 输入:3, 2 期望输出:1.5
    • 输入:0, 3 期望输出:0
    • 输入:6, 0 期望输出:Infinity

四、测试执行结果与分析

单元测试工具

JUnit是一个开源的Java语言的单元测试框架,专门针对Java设计,使用最广泛。JUnit是事实上的单元测试的标准框架,任何Java开发者都应当学习并使用JUnit编写单元测试。

使用JUnit编写单元测试的好处在于,我们可以非常简单地组织测试代码,并随时运行它们,JUnit就会给出成功的测试和失败的测试,还可以生成测试报告,不仅包含测试的成功率,还可以统计测试的代码覆盖率,即被测试的代码本身有多少经过了测试。对于高质量的代码来说,测试覆盖率应该在80%以上。

项目结构

待测试程序Operation.java

public class Operation {
    public  static  Double add(Double a,Double b){
        return  a+b;
    }
    public static  Double subtract(Double a, Double b){
        return a-b;
    }
    public  static  Double multiply(Double a,Double b){
        return a*b;
    }
    public  static  Double divide(Double a,Double b){
        return  a/b;
    }
}

测试程序OperationTest.java

使用JUnit进行单元测试,我们可以使用断言(Assertion)来测试期望结果,可以方便地组织和运行测试,并方便地查看测试结果。

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

public class OperationTest {
    @Test
    void testAdd() {
        assertEquals(5, Operation.add(2.0, 3.0));
        assertEquals(1, Operation.add(-2.0, 3.0));
        assertEquals(6.0, Operation.add(2.5, 3.5));
        assertEquals(3, Operation.add(0.0, 3.0));
    }

    @Test
    void testSubtract() {
        assertEquals(2.0, Operation.subtract(5.0, 3.0));
        assertEquals(-5.0, Operation.subtract(-2.0, 3.0));
        assertEquals(1.0, Operation.subtract(2.5, 1.5));
        assertEquals(-3, Operation.subtract(0.0, 3.0));
    }

    @Test
    void testMultiply() {
        assertEquals(10, Operation.multiply(2.0, 5.0));
        assertEquals(-6, Operation.multiply(-2.0, 3.0));
        assertEquals(3.75, Operation.multiply(2.5, 1.5));
        assertEquals(0, Operation.multiply(0.0, 3.0));
    }

    @Test
    void testDivide() {
        assertEquals(3, Operation.divide(9.0, 3.0));
        assertEquals(-3, Operation.divide(-9.0, 3.0));
        assertEquals(1.5, Operation.divide(3.0, 2.0));
        assertEquals(0, Operation.divide(0.0, 3.0));
        assertEquals(Double.POSITIVE_INFINITY, Operation.divide(7.0, 0.0));
    }
}

测试结果及覆盖率

结果分析

经过单元测试,所有测试用例都成功通过,四则运算方法能够正确计算不同类型的输入。同时,divide方法在除数为0时也能够得出Infinity,符合预期。因此,四则运算方法的功能正常,通过了单元测试。