JUnit测试框架

功能测试:(系统测试)

方法:白盒测试用于(单元测试和集成测试)

JUnit进行单元测试

JUnit是一个开源的Java测试框架,专门用于编写和运行可重复的单元测试。它主要针对Java程序的底层源代码进行测试,包括类和方法级别的测试。

测试类型: 属于程序员测试(白盒测试),测试人员需要了解被测试代码的内部实现细节。

开发效率: 在极限编程(敏捷开发)和代码重构中被极力推荐使用,通过自动化单元测试可以显著提高开发效率。

注解分类

  • 主要注解类型:
    • Fixture注解:表示"在某些阶段必然被调用的代码"
    • @Test注解:标记测试方法
    • @Ignore注解:忽略某些测试
    • @Parameters注解:参数化测试
    • @RunWith注解:指定测试运行器
  • Fixture子注解:
    • @Before:每个测试方法执行前调用
    • @After:每个测试方法执行后调用
    • @BeforeClass:所有测试方法执行前调用(静态方法)
    • @AfterClass:所有测试方法执行后调用(静态方法)

@Test注解
  • @Test注解: 用于修饰测试方法,表示要对被测类的某个或某些方法进行测试。它只是一种注解,不表示对它进行测试,而是指明要测试的方法。
  • 作用: 加了@Test的方法就是要测试的方法。加了@AfterClass注解的方法表示在测试完成后要执行的操作。

Ignore注解,用于修饰测试方法,表示暂时忽略该测试用例的执行。常见于两种情况:①被测方法尚未完成开发;②当前不需要执行该测试(如正在调试其他功能)。

Parameters注解,用于修饰产生数据集合的方法,实现参数化测试(每条测试用例对应一个参数)

RunWith注解,指定测试运行器(Runner),被修饰类中的所有测试方法都将由该Runner调用执行。

方法

断言(看我们测试是否通过)

  • 核心作用:用于断定程序是否存在缺陷,是测试验证的主要手段。
  • assertEquals:
    • 功能:比较预期结果与实际结果是否相等
    • 参数:(预期值, 实际值[, 错误消息])
    • 特点:错误消息可选,若提供则在断言失败时显示
  • fail:
    • 作用:强制使测试立即失败
    • 适用场景:用于测试无法到达的分支(如异常分支)
    • 与assertEquals区别:fail直接判定失败,而assertEquals通过比较结果判定

setUp和tearDown

  • setUp:
    • 执行时机:每个测试方法执行前自动运行
    • 功能:初始化测试环境(如建立数据库连接、打开文件等)
    • 替代方案:可用@Before注解实现相同功能
  • tearDown:
    • 执行时机:每个测试方法执行后自动运行
    • 功能:释放资源(如关闭连接、文件等)
    • 替代方案:可用@After注解实现相同功能
  • 类级别方法:
    • setUpBeforeClass:所有测试方法执行前运行一次(对应@BeforeClass)
    • tearDownAfterClass:所有测试方法执行后运行一次(对应@AfterClass)
  • 选择建议:根据实际需求选择使用方法或注解形式,两者功能等效

安装Juint

引入Juint包

在IDEA中pom文件直接配置环境就好了

编写被测类

package org.example.test;

public class Calculator {
    private static int result; // 静态变量,用于存储运行结果

    public void add(int n){
        result += n;
    }


    public void substract(int n){
        result -= 1; // Bug:正确的应该是 result -= n
    }


    public void multiply(int n){
        // 此方法尚未写好
    }


    public void divide(int n){
        result  /= n;
    }


    public void square(int n){
        result = n * n;
    }


    public void squareRoot(int n){
        for(;;);   // Bug:死循环
    }


    public void clear(){    // 将结果清零
        result = 0;
    }


    public int getResult(){
        return result;
    }
}


使用@Before进行测试前准备

使用@Ignore注解忽略测试

超时测试@RunWith和@Parameters注解

@Test
    @Timeout(2000)
    public void testSquareRoot() {
//        fail("尚未实现");
        calc.squareRoot(4);
        assertEquals(2, calc.getResult());
    }

编写测试数据参数方法和构造方法

package org.example.test;

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Arrays;
import java.util.Collection;

import static org.junit.Assert.fail;

@RunWith(Parameterized.class)
public class SquareTest {
    public static Calculator  calc = new Calculator();
    public int param;
    public int result;
    public SquareTest(int param, int result){
        this.param = param;
        this.result = result;
    }

    @Test
    // 参数化测试
    public static Collection getParamResult(){
        return Arrays.asList(new Object[][]{
                {0,0},
                {2,4},
                {-3,9},
        });
    }

}

编写@Paramters注解的测试方法

package org.example.test;

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Arrays;
import java.util.Collection;

import static org.junit.Assert.assertEquals;

@RunWith(Parameterized.class) // 运行参数化测试
public class SquareTest {
    public static Calculator  calc = new Calculator();
    public int param;
    public int result;
    public SquareTest(int param, int result){
        this.param = param;
        this.result = result;
    }

    @Test
    public void testSquare(){
        calc.square(param);
        assertEquals(result, calc.getResult());
    }

    // 参数化测试
    @Parameterized.Parameters
    public static Collection getParamResult(){
        return Arrays.asList(new Object[][]{
                {0,0},
                {2,4},
                {-3,9},
        });
    }

}

读取文件进行参数化的步骤

package org.example.test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;

public class ReadFile {
    public static void main(String[] args) {
        try {
            // 打开文件
            File file = new File("D:\\桌面\\cases.txt");
            // 读取文件
            FileReader bytes = new FileReader(file);
            // 读取文件内容
            BufferedReader chars = new BufferedReader(bytes);
            String row = null;
            while ((row = chars.readLine()) != null) {
                System.out.println(row);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

对读取的文件进行拆分

package org.example.test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;

public class ReadFile {
    public static void main(String[] args) {
        try {
            // 打开文件
            File file = new File("D:\\桌面\\cases.txt");
            // 读取文件
            FileReader bytes = new FileReader(file);
            // 读取文件内容
            BufferedReader chars = new BufferedReader(bytes);
            String row = null;
            while ((row = chars.readLine()) != null) {
                // 以制表符\t进行拆分   列
                String columns[] = row.split("\t");
                for(String x: columns){
                    System.out.println(x + " ");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

统计文件中的行数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值