IDEA中使用JUnit5(单元测试框架)

JUnit单元测试框架由Erich Gamma和Kent Beck编写的一个回归测试框架(Regresion Testing Framework),主要用于Java语言程序的单元测试,目前使用的主流版本是JUnit以上版本。

安装JUnit5累(IDEA)

以一个简单的程序为例:

public class Main {
    public static long fact(long n) {//实现阶乘
        long r = 1;
        for (long i = 1; i <= n; i++) {
            r = r * i;
        }
        return r;
    }
}

1.点击类名,并且点击Generate,再选择Test

2.可能会出现以下情况,点击Fix,IDEA帮助你下载好JUnit5(点击OK就行)

3.以后出现就是这样的 选择自己需要进行测试的方法打勾(可以将setup 和tearDown打上勾)

一个测试类中只能声明此注解一次,此注解对应的方法只能被执行一次

@BeforeClass 使用此注解的方法在测试类被调用之前执行

@AfterClass 使用此注解的方法在测试类被调用结束退出之前执行

一个类中有多少个@Test注解方法,以下对应注解方法就被调用多少次

@Before 在每个@Test调用之前执行

@After 在每个@Test调用之后执行(一般用于初始化或者清除)

@Test 使用此注解的方法为一个单元测试用例,一个测试类中可多次声明,每个注解为@Test只执行一次

@Ignore 暂不执行的测试用例,会被JUnit4忽略执行

4.会自动生成

内容如下:(testFact()里面的内容是自己写的测试程序)

然后我们可以直接点击testFact(),右键直接运行,看输出效果就行。

核心测试方法testFact()加上了@Test注解,这是JUnit要求的,它会把带有@Test的方法识别为测试方法。在测试方法内部,我们用assertEquals(1, Factorial.fact(1))表示,期望Factorial.fact(1)返回1assertEquals(expected, actual)是最常用的测试方法,它在Assertion类中定义。Assertion还定义了其他断言方法,例如:

  • assertTrue(): 期待结果为true

  • assertFalse(): 期待结果为false

  • assertNotNull(): 期待结果为非null

  • assertArrayEquals(): 期待结果为数组并与期望数组每个元素的值均相等

单元测试的好处

单元测试可以确保单个方法按照正确预期运行,如果修改了某个方法的代码,只需确保其对应的单元测试通过,即可认为改动正确。此外,测试代码本身就可以作为示例代码,用来演示如何调用该方法。

使用JUnit进行单元测试,我们可以使用断言(Assertion)来测试期望结果,可以方便地组织和运行测试,并方便地查看测试结果。此外,JUnit既可以直接在IDE中运行,也可以方便地集成到Maven这些自动化工具中运行。

在编写单元测试的时候,我们要遵循一定的规范:

一是单元测试代码本身必须非常简单,能一下看明白,决不能再为测试代码编写测试;

二是每个单元测试应当互相独立,不依赖运行的顺序;

三是测试时不但要覆盖常用测试用例,还要特别注意测试边界条件,例如输入为0null,空字符串""等情况。

下面解释一下@Before 在每个@Test调用之前执行 和 @After 在每个@Test调用之后执行的用途

JUnit提供了编写测试前准备、测试后清理的固定代码,称之为Fixture。(新建立一个.java)

public class Calculator {
    private long n = 0;

    public long add(long x) {
        n = n + x;
        return n;
    }

    public long sub(long x) {
        n = n - x;
        return n;
    }
}

将Before和After前面的勾都选择上,然后写上自己的测试程序。

public class CalculatorTest {

    Calculator calculator;

    @BeforeEach
    public void setUp() {
        this.calculator = new Calculator();
    }

    @AfterEach
    public void tearDown() {
        this.calculator = null;
    }

    @Test
    void testAdd() {
        assertEquals(100, this.calculator.add(100));
        assertEquals(150, this.calculator.add(50));
        assertEquals(130, this.calculator.add(-20));
    }

    @Test
    void testSub() {
        assertEquals(-100, this.calculator.sub(100));
        assertEquals(-150, this.calculator.sub(50));
        assertEquals(-130, this.calculator.sub(-20));
    }
}

有两个标记为@BeforeEach@AfterEach的方法,它们会在运行每个@Test方法前后自动运行,通过@BeforeEach来初始化,通过@AfterEach来清理资源,称之为Fixture。

上面的测试代码在JUnit中运行顺序如下:

for (Method testMethod : findTestMethods(CalculatorTest.class)) {
    var test = new CalculatorTest(); // 创建Test实例
    invokeBeforeEach(test);
        invokeTestMethod(test, testMethod);
    invokeAfterEach(test);
}

//可见,@BeforeEach和@AfterEach会“环绕”在每个@Test方法前后。

JUnit还提供了@BeforeAll@AfterAll,它们在运行所有@Test前后运行,顺序如下:(一般用于初始化和清理一些比较繁琐的资源)(了解)

invokeBeforeAll(CalculatorTest.class);
for (Method testMethod : findTestMethods(CalculatorTest.class)) {
    var test = new CalculatorTest(); // 创建Test实例
    invokeBeforeEach(test);
        invokeTestMethod(test, testMethod);
    invokeAfterEach(test);
}
invokeAfterAll(CalculatorTest.class);

因为@BeforeAll@AfterAll在所有@Test方法运行前后仅运行一次,因此,它们只能初始化静态变量,例如:

public class DatabaseTest {
    static Database db;

    @BeforeAll
    public static void initDatabase() {
        db = createDb(...);
    }
    
    @AfterAll
    public static void dropDatabase() {
        ...
    }
}

总结:

  1. 对于实例变量,在@BeforeEach中初始化,在@AfterEach中清理,它们在各个@Test方法中互不影响,因为是不同的实例;

  2. 对于静态变量,在@BeforeAll中初始化,在@AfterAll中清理,它们在各个@Test方法中均是唯一实例,会影响各个@Test方法。

  3. 注意到每次运行一个@Test方法前,JUnit首先创建一个XxxTest实例,因此,每个@Test方法内部的成员变量都是独立的,不能也无法把成员变量的状态从一个@Test方法带到另一个@Test方法。

使用IntelliJ IDEA进行JUnit 5单元测试配置时,你需要进行以下步骤: 1. 首先,确保你的项目已经引入了JUnit Jupiter依赖。你可以通过在pom.xml文件(如果是Maven项目)或build.gradle文件(如果是Gradle项目)添加以下代码来引入依赖: ```xml <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.9.1</version> <scope>test</scope> </dependency> ``` 2. 在你的测试类使用`@Test`注解来标记要执行的测试方法。这个注解来自JUnit Jupiter模块。 3. 确保你的项目使用Java 8或更高版本,因为JUnit 5需要Java 8及以上的版本。 4. 打开IntelliJ IDEA,找到你的测试类,右击并选择"Run 'TestClassName'"来运行你的单元测试。 请注意,JUnit 5还包括JUnit Platform和JUnit Vintage。JUnit Platform提供了测试引擎API,用于开发在JUnit平台上运行的新测试框架。JUnit Jupiter是JUnit 5的一部分,它提供了新的注解和测试引擎的实现,可以用于测试使用新注解编写的测试代码。JUnit Vintage用于支持在JUnit 5平台上运行使用JUnit 3和JUnit 4编写的测试用例。在大多数情况下,你只需要使用JUnit Jupiter模块进行单元测试。 希望这些信息对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [JUnit 5 单元测试教程](https://blog.csdn.net/u013735734/article/details/127915358)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [JUnit 5单元测试(一)—— 基本配置](https://blog.csdn.net/qq_33697094/article/details/129594054)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值