Junit单元测试
一、JUnit基本概念
JUnit是一个Java编程语言的开源测试框架,它是xUnit架构的一部分,xUnit是为多种编程语言创建的单元测试库的通用名称。JUnit由Erich Gamma和Kent Beck创建,目前已经发展到JUnit 5。JUnit主要用于单元测试,但也可用于其他测试,如功能和集成测试。单元测试是指使用JUnit框架编写的针对代码中小的、独立的模块(通常是方法或者类)的测试。
二、JUnit的特点
易于使用:JUnit提供了简单的命令行界面,可以方便地创建、运行和调试单元测试。
支持多类测试:JUnit可以在同一测试套件中测试多个类,这使得测试更加容易和高效。
支持断言:JUnit提供了各种断言,如assertTrue()、assertFalse()、assertNotNull()和assertSame()等,可以帮助开发人员更方便地测试代码。
可扩展性:JUnit支持自定义测试套件和测试场景,开发人员可以根据需要进行扩展。
支持多种测试格式:JUnit支持JUnit3、JUnit4和JUnit5等多种测试框架,并且可以与其他测试框架集成。
三、JUnit的主要用途
编写和运行测试:JUnit提供了注解和断言库,帮助开发人员快速地编写测试代码,并且提供了测试运行器来运行和报告测试结果。
断言结果:JUnit提供了一套丰富的断言库来帮助开发人员验证测试的结果。
测试套件:如果有一组测试,并希望将它们一起运行,那么可以使用JUnit的@TestSuite注解(注意,在JUnit 5中,测试套件的概念有所变化,通常使用@SelectClasses或@SelectPackages等注解来组织测试)。
测试异常:JUnit可以帮助开发人员测试方法是否会抛出预期的异常。
参数化测试:JUnit支持参数化测试,允许使用不同的参数多次运行同一个测试。
模拟对象:JUnit可以与模拟框架(如Mockito)一起使用,帮助开发人员创建模拟对象,从而隔离被测代码与外部依赖项。
Junit的基本使用
- 已知存在需要测试的类Calculator ,这是一个能够简单实现加减乘除、平方、开方的计算器类,然后对这些功能进行单元测试。
public class Calculator {
// 静态变量,用于存储运行结果
private static int result = 0; // 初始化result为0
// 加法运算
public void add(int n) {
result += n;
}
// 减法运算
public void subtract(int n) {
result -= n; // 修正为正确的减法操作
}
// 乘法运算
public void multiply(int n) {
result *= n; // 实现乘法操作
}
// 除法运算
public void divide(int n) {
if (n != 0) { // 添加对除数为0的检查
result /= n;
} else {
throw new IllegalArgumentException("除数不能为0");
}
}
// 平方运算
public void square(int n) {
result = n * n; // 此方法已正确实现
}
// 平方根运算
public void squareRoot(int n) {
if (n >= 0) { // 平方根只适用于非负数
result = (int) Math.sqrt(n); // 使用Math.sqrt计算平方根,并转换为int
} else {
throw new IllegalArgumentException("平方根运算的输入必须是非负数");
}
}
// 将结果清零
public void clear() {
result = 0;
}
// 返回运算结果
public int getResult() {
return result;
}
// 额外的:提供一个方法来设置初始结果(可选)
public void setResult(int newResult) {
result = newResult;
}
// 额外的:提供一个方法执行一系列操作并返回最终结果(可选)
public int performOperations(int[] operations, int[] values) {
if (operations.length != values.length) {
throw new IllegalArgumentException("操作数组和值数组的长度必须相同");
}
for (int i = 0; i < operations.length; i++) {
switch (operations[i]) {
case 1: // 假设1代表加法
add(values[i]);
break;
case 2: // 假设2代表减法
subtract(values[i]);
break;
case 3: // 假设3代表乘法
multiply(values[i]);
break;
case 4: // 假设4代表除法
divide(values[i]);
break;
case 5: // 假设5代表平方
square(values[i]);
break;
case 6: // 假设6代表平方根
squareRoot(values[i]);
break;
default:
throw new IllegalArgumentException("未知的操作类型");
}
}
return getResult();
}
}
-
引入Junit4的jar包到模块中
-
第一步 : 在模块中新建文件夹lib,拷贝junit4的jar包到模块中
-
第二步 : 选中jar文件 , 右键选择 Add as Library
-
-
生成Junit测试框架
-
使用IDEA能够直接给需要测试的类生成测试框架,如下:
-
选中本类任何位置右键选择 Generate(Alt+Insert)/ go to 选项 , 选择Test…
-
选择需要进行测试的方法
) -
在上一步OK后系统会自动生成一个新类CalculatorTest,里面包含一些空的测试用例。
你只需要将这些测试用例稍作修改即可使用,完整的CalculatorTest代码如下:
-
-
限时测试
对于那些逻辑很复杂,循环嵌套比较深的程序,很有可能出现死循环,因此一定要采取一些预防措施。限时测试是一个很好的解决方案。我们给这些测试函数设定一个执行时间,超过了这个时间,他们就会被系统强行终止,并且系统还会向你汇报该函数结束的原因是因为超时,这样你就可以发现这些Bug了。要实现这一功能,只需要给@Test标注加一个参数即可,代码如下:
被测方法:
public void squareRoot(int n) { //Bug : 死循环 for (; ; ) ; }
测试方法:
@Test(timeout = 1000) // Timeout参数表明了你要设定的时间,单位为毫秒,因此1000就代表1秒。 public void squareRoot() { calculator.squareRoot(4); assertEquals(2 , calculator.getResult()); }
3.3 断言
预先判断某个条件一定成立,如果条件不成立,则直接报错。