java -- Junit单元测试概念及使用方法详细介绍

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 断言

  • 概述 :

​ 预先判断某个条件一定成立,如果条件不成立,则直接报错。

  • 使用 :
    //第一个参数表示期望值
    //第二个参数表示实际值
    // 如果实际值和期望值相同,说明结果正确就测试通过,如果不相同,说明结果是错误的,就会报错
    Assert.assertEquals( 期望值, 实际值);
    Assert.assertEquals("异常原因", 期望值, 实际值);
    
    //例如:
    int result = add(100,200);
    Assert.assertEquals(300, result);  
    
  • 小结 : 如何进行断言
    Assert.assertEquals(期望值,实际值)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攒了一袋星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值