【愚公系列】2023年10月 Java教学课程 085-Junit单元测试框架

在这里插入图片描述

🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏


🚀前言

单元测试是软件开发中的一种测试方法,它是对软件系统中最小的可测试单元进行测试的过程。通常,单元测试是用程序代码编写的测试代码来测试某个程序单元的行为,如一个函数、一个模块或一个类。单元测试的目的是发现代码中潜在的缺陷和错误,以确保每个代码单元的功能都得以正确实现,并且当代码修改时能够保证代码的正确性。单元测试也是敏捷开发和测试驱动开发中的一项重要技术,可以提高代码质量和可维护性,减少开发和测试的时间和成本。

🚀一、Junit单元测试框架

🔎1.概述

JUnit是一个用于编写和运行单元测试的开源框架。它由Kent Beck和Erich Gamma创建,是最流行的Java单元测试框架之一。JUnit提供了一组断言方法和注释来测试Java应用程序的各个部分,包括类、方法和表达式。JUnit测试的重点是快速,自动化和可重复性的测试,以便在代码更改时可以更容易地验证正确性。它还提供了测试运行、批处理测试和测试套件的功能,可以方便地集成到构建工具(如Maven和Gradle)和开发环境(如Eclipse和IntelliJ IDEA)中。在软件开发中,JUnit已成为标准的单元测试框架。

🔎2.优点

Junit单元测试的优点如下:

  1. 提高代码质量和可维护性:Junit单元测试可以自动检测代码中的问题,帮助发现代码中的错误和缺陷。这有利于提高代码质量和可维护性。

  2. 提高开发效率:Junit单元测试可以在代码开发过程中进行,不需要等到完成整个系统开发后再进行测试。这可以提高开发效率,减少后期修复问题的成本。

  3. 提高代码可移植性:Junit单元测试可以在不同的环境中运行,这可以确保代码的可移植性,减少因为环境变化导致的代码问题。

  4. 提高代码重用性:Junit单元测试可以帮助编写更高质量的代码,这可以提高代码的重用性,减少不必要的代码编写。

  5. 帮助团队协作:Junit单元测试可以帮助团队同事在开发过程中更好地理解代码,提高团队协作效率。

🔎3.快速入门

JUnit是用于Java语言的功能测试框架。功能测试是指单独测试代码中的函数/方法/功能等的测试方法。JUnit采用的是断言测试模式,即为被测代码定义一组期望的输出,并验证这个输出是否与实际输出相符。

以下是JUnit的基本入门过程:

  1. 创建Java项目

在Eclipse或IntelliJ IDEA等开发工具中,创建一个新的Java项目。

  1. 下载JUnit框架

从JUnit的官方网站下载JUnit框架,并将其添加到项目中。

  1. 创建测试类

在项目中创建一个测试类,并使用JUnit的注释来标记测试方法。

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class TestCalculator {
    @Test
    public void testAdd() {
        Calculator calculator = new Calculator();
        int result = calculator.add(3, 4);
        assertEquals(7, result);
    }
}
  1. 运行测试类

在开发工具中右键单击测试类,选择运行JUnit测试。

  1. 查看测试结果

JUnit将会运行所有使用@Test注解标记的测试方法,并输出测试结果。如果测试通过,则输出“OK”,反之则输出“Failures”。

JUnit还提供了其他一些高级功能,如@Before、@After、@BeforeClass和@AfterClass等注释,用于在测试之前或之后执行某些操作。使用JUnit,可以快速编写并运行Java代码的单元测试,提高代码质量和稳定性。

🔎4.常用注解

🦋4.1 Junit4常用注解

下面是Junit单元测试框架常用注解的说明和示例表格:

注解描述示例
@Test表示该方法是一个测试方法@Test public void testMethod() {...}
@Before表示该方法会在每个测试方法执行前执行@Before public void setUp() {...}
@After表示该方法会在每个测试方法执行后执行@After public void tearDown() {...}
@BeforeClass表示该方法会在所有测试方法执行前执行,且仅执行一次@BeforeClass public static void setUpClass() {...}
@AfterClass表示该方法会在所有测试方法执行后执行,且仅执行一次@AfterClass public static void tearDownClass() {...}
@Ignore表示该测试方法暂时不运行@Ignore("Not ready to run") @Test public void methodName() {...}
@RunWith表示使用什么类进行测试@RunWith(JUnit4.class) public class TestClass {...}

示例代码:

import org.junit.*;
import static org.junit.Assert.*;

public class TestCalculator {
    private Calculator calculator;
    
    @BeforeClass
    public static void setUpClass() {
        // 初始化一些共享的资源或数据
        System.out.println("BeforeClass: setUpClass()");
    }
    
    @Before
    public void setUp() {
        calculator = new Calculator();
        // 在每个测试方法之前初始化一些数据
        System.out.println("Before: setUp()");
    }
    
    @Test
    public void testAdd() {
        int result = calculator.add(3, 4);
        assertEquals(7, result); // 判断结果是否为7
        System.out.println("Test: testAdd()");
    }
    
    @Test
    public void testMultiply() {
        int result = calculator.multiply(3, 4);
        assertEquals(12, result); // 判断结果是否为12
        System.out.println("Test: testMultiply()");
    }
    
    @After
    public void tearDown() {
        calculator = null;
        // 在每个测试方法之后清理一些数据
        System.out.println("After: tearDown()");
    }
    
    @AfterClass
    public static void tearDownClass() {
        // 清理一些共享的资源或数据
        System.out.println("AfterClass: tearDownClass()");
    }
}

在执行上述示例代码时,会先执行setUpClass()方法,然后按顺序执行每个测试方法前的setUp()方法,执行测试方法,再执行每个测试方法后的tearDown()方法,最后执行tearDownClass()方法。

🦋4.2 Junit5常用注解

注解用途示例
@Test标记测试方法@Test
void testAddition() {
assertEquals(2, Calculator.add(1, 1));
}
@DisplayName为测试方法指定展示名称@DisplayName("测试加法")
@Test
void testAddition() {
assertEquals(2, Calculator.add(1, 1));
}
@BeforeAll在所有测试开始前执行一次@BeforeAll
static void init() {
System.out.println("初始化");
}
@AfterAll在所有测试结束后执行一次@AfterAll
static void close() {
System.out.println("关闭");
}
@BeforeEach在每个测试开始前执行一次@BeforeEach
void init() {
calculator = new Calculator();
}
@AfterEach在每个测试结束后执行一次@AfterEach
void clear() {
calculator = null;
}
@Timeout指定测试方法的超时时间,单位为毫秒@Timeout(1000)
@Test
void testTimeout() throws InterruptedException {
Thread.sleep(2000);
}
@Disabled禁用测试方法@Disabled("不需要测试")
@Test
void testSubtraction() {
assertEquals(0, Calculator.subtract(1, 1));
}
@RepeatedTest重复执行测试方法@RepeatedTest(3)
void testAddition() {
assertEquals(2, Calculator.add(1, 1));
}
@ParameterizedTest参数化测试,可使用不同的参数执行同一个测试方法@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
void testAddition(int num) {
assertEquals(2 + num, Calculator.add(1, num));
}

🚀总结

单元测试是软件开发流程必不可少的阶段,开发人员初期需要进行单元测试,在进行集成测试,和压力测试来保证系统上线时稳定性。


🚀感谢:给读者的一封信

亲爱的读者,

我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。

如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。

我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。

如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。

在这里插入图片描述

再次感谢您的阅读和支持!

最诚挚的问候, “愚公搬代码”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

愚公搬代码

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

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

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

打赏作者

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

抵扣说明:

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

余额充值