实验要求:通过实验,理解单元测试原理,熟悉单元测试工具的使用。
编写四则运算程序(如例1)或其它(如例2),确定测试单元,设计测试用例,借助某单元测试工具做单元测试。具体用什么单元测试工具,根据自己情况自选,如xUnit, TestNG、gtest、pytest、unittest等。在实验报告中,给出测试需求、测试设计、测试用例集、测试执行结果与分析。
一、测试需求
- 测试add方法能够正确计算两个数的加法
- 测试subtract方法能够正确计算两个数的减法
- 测试multiply方法能够正确计算两个数的乘法
- 测试divide方法能够正确计算两个数的除法
- 测试除数为0时,divide方法能够得出Infinity
二、测试设计
- 对add方法进行测试,包括正整数、负整数、小数、0等不同类型的输入
- 对subtract方法进行测试,包括正整数、负整数、小数、0等不同类型的输入
- 对multiply方法进行测试,包括正整数、负整数、小数、0等不同类型的输入
- 对divide方法进行测试,包括正整数、负整数、小数、0等不同类型的输入,以及除数为0的情况
三、测试用例集
- add方法测试用例:
-
- 输入:2, 3 期望输出:5
- 输入:-2, 3 期望输出:1
- 输入:2.5, 3.5 期望输出:6.0
- 输入:0, 3 期望输出:3
- subtract方法测试用例:
-
- 输入:5, 3 期望输出:2
- 输入:-2, 3 期望输出:-5
- 输入:2.5, 1.5 期望输出:1.0
- 输入:0, 3 期望输出:-3
- multiply方法测试用例:
-
- 输入:2, 3 期望输出:6
- 输入:-2, 3 期望输出:-6
- 输入:2.5, 1.5 期望输出:3.75
- 输入:0, 3 期望输出:0
- 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,符合预期。因此,四则运算方法的功能正常,通过了单元测试。