【高效编码】超全面的,超正的单元测试框架Junit的使用姿势

简介: 您好,我是码农飞哥,感谢您阅读本文!如果此文对您有所帮助,请毫不犹豫的一键三连吧。小伙伴们有想看的欢迎积极留言。前面几篇文章介绍Idea的常用插件,这只是本专栏很小的一部分,实现高效编码是一个很广泛的点,需要系统化的知识。其中单元测试就是非常重要的一部分。充分的单元测试可以很好的提高代码质量。本篇文章就将介绍单元测试框架Junit,小伙伴们是不是很期待呀,哈哈哈。

您好,我是码农飞哥,感谢您阅读本文!如果此文对您有所帮助,请毫不犹豫的一键三连吧。小伙伴们有想看的欢迎积极留言。前面几篇文章介绍Idea的常用插件,这只是本专栏很小的一部分,实现高效编码是一个很广泛的点,需要系统化的知识。其中单元测试就是非常重要的一部分。充分的单元测试可以很好的提高代码质量。本篇文章就将介绍单元测试框架Junit,小伙伴们是不是很期待呀,哈哈哈。

单元测试有啥用?

学习一个技术或者一个框架,我们首先会考虑的一个问题这个框架有啥用,能解决什么问题?只有能提升生产力的工具才是好工具。针对这个问题,想想下面这个场景,在不用单元测试的情况下,当你编写了一个很复杂的方法后,该如何测试该方法的是不是有bug。除了代码review和编写一个main方法手动调用该方法,是不是没有其他更好的方法,如果有的话,欢迎读者朋友们积极留言,让我学习一下。。很明显上面说的两种方法各有各的弊端,首先是代码review这种方式,光看不调,对于一些隐藏很深的bug还是比较难发现。然后就是编写一个main方法调用,如果方法很多的话,都用一个main方法来调用的话,main方法会非常的庞大,还可能会出现方法之间相互影响的情况。综上所述,就要请出我们的单元测试框架了。让单元测试来大显身手。

Junit4的简介

Junit框架是一种应用非常广泛的单元测试框架。使用也是非常的方便。其在单元测试领域有着广泛的应用,主要分为Junit4和Junit5两个主要的版本。其中Junit 及其之前的版本是将所有内容放到一个jar中,JUnit 5 由三个不同的模块组成。包括JUnit 平台、 JUnit Jupiter、 JUnit Vintage。Junit有如下几个特点:

1.独立于业务代码之外对业务代码进行测试,这样的好处就是可以不影响业务代码。

2.在打包的时候可以将单元测试的代码踢出。

3.修改业务代码之后可以执行单元测试代码,看看功能有没有bug。

下面以Junit 4为例进行说明。

Junit的使用

说了一堆Junit的介绍和好处,那么Junit该如何使用呢?先举个简单的栗子。下面定义了一个待测试的业务类Calculate类,它有加减乘除四个方法。

public class Calculate {
    public int add(int a, int b) {
        return a + b;
    }
    public int substract(int a, int b) {
        return a - b;
    }
    public int multiply(int a, int b) {
        return a * b;
    }
    public int division(int a, int b) {
        return a / b;
    }
}

现在要对这个类里的每个方法进行单元测试,第一步还是要引入junit依赖(在此默认你的项目是通过maven管理的)。

<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>

在Idea中按下Ctrl+Shift+T快捷键就可以创建一个单元测试类。下面就展示这个测试类。

@RunWith(JUnit4.class)
public class CalculateTest {
    private static Calculate calculate;
    private static int A = 4;
    private static int B = 0;
    @BeforeClass
    public static void initClass() {
        System.out.println("针对所有测试,只运行一次");
        calculate = new Calculate();
    }
    @Before
    public void setUp() {
        System.out.println("测试方法运行前执行");
    }
    @Test
    public void add() {
        int add = calculate.add(1, 2);
        Assert.assertEquals(3, add);
        System.out.println("对add单元测试完成");
    }
    @Test
    public void substract() {
        int substract = calculate.substract(A, B);
        Assert.assertEquals(4, substract);
        System.out.println("对substract单元测试完成");
    }
    @Test
    public void multiply() {
        int multiply = calculate.multiply(A, B);
        Assert.assertEquals(0, multiply);
        System.out.println("对multiply单元测试完成");
    }
    @Test
    public void division() {
        //正常情况
        int division = calculate.division(A, 1);
        Assert.assertEquals(4, division);
        System.out.println("对division单元测试完成");
    }
    @Test(expected = ArithmeticException.class)
    public void division2() {
        int division = calculate.division(A, B);
        System.out.println("对异常情况单元测试完成");
    }
}

单元测试运行结果:

c854279535a05f5f3f4289f632f96d05_20210503191022778.png

相关注解的说明

单元测试的执行主要是通过相关注解来驱动的。所以,了解各个注解的作用显的尤为重要。

1.@RunWith这个注解修饰的是测试类,作用在类上表示该测试类所使用的测试驱动。

2.@Test :这个注解表明被修饰的方法是测试方法,在Junit中将会被自动执行,需要注意的是,测试方法只能是无返回值无参数的公共方法,即public void 。方法名可以任意取(建议是跟被测试方法同名),方法不能有入参。当然@Test 注解内还能传入一些参数,例如:本例中@Test(expected = ArithmeticException.class) 就是预期被测试的方法会抛出ArithmeticException异常,可以理解异常捕获。还可以传入超时时间,比如 @Test(timeout = 100):我们给测试函数设定一个执行时间,超过了这个时间(100毫秒),它们就会被系统强行终止,并且系统还会向你汇报该函数结束的原因是因为超时,这样你就可以发现这些Bug了。

3.@BeforeClass 这个注解针对所有测试,在所有测试方法执行之前执行,且只执行一次,且必须是作用在public static void,即修饰静态方法,知道原因的小伙伴欢迎留言回答。

4.@AfterClass 这个注解针对所有的测试,将会在所有测试方法执行结束后执行一次,且必须作用到public static void。

5.@Before 初始化方法,每个测试方法运行之前必须执行被@Before注解修饰的方法。

6.@After 释放资源,在任何测试方法执行之后需要进行的收尾工作,在每个测试方案执行之后执行一次,该注解作用到public static void。

7.@Ignore 忽略的测试方法,标注的含义就是"某些方法尚未完成,暂不参与此次测试",被@Ignore注解修饰的方法不会被执行。

断言

一个完整的单元测试有三个步骤:

1.准备(测试环境,准备测试数据)

2.执行(构造请求传入参数执行)

3.断言(验证结果)

前面介绍完了准备和执行两个步骤,下面就是介绍断言这个步骤了,Junit测试框架中Assert类就是实现断言的工具,它主要作用如下:1. 单元测试用于判断某个特定条件下某个方法的行为;执行单元测试为了证明某段代码的执行结果和期望的一致。总而言之,断言的作用就白了就是验证被测试方法的返回结果。

Assert类中用于断言的方法有很多,下面介绍几个常用的断言方法。

4.assertEquals(expected, actual):查看两个对象或者两个值是否相等,如果是对象的话就是使用equal()方法来比较。参数expected为用户期望的值,actual为被测试方法实际返回的值。如果这两个值相等的话, 则说明方法运行是正确的。

5.assertNull()查看对象是否为空。

6.assertSame(expected,actual):查看两个对象的引用是否相等,直接用==来进行比较的。比较两个对象的值是否相等。

7.assertTrue(String message, boolean condition) 要求condition==true,查看运行的结果是否为true。

扩展延伸

上面介绍的都是一些基本的概念,实在是不过瘾,只能算一个demo级别的知识点。那我一个用Spring容器管理的类如何测试测试呢?我图片上传的方法如何测试呢?这些都没讲嘛,没意思!!!!哈哈哈,读者朋友们,不要着急,项目级别的实战在后面呢!

SpringBoot项目的单元测试请看这篇文章一分钟上手SpringBootTest

SpringMVC项目的单元测试请看这篇文章 SpringMVC框架如何与Junit整合,看这个就够了

总结

本文是一个Junit4框架使用的基础篇,详细介绍了Junit4框架的使用,以及Junit框架中各种注解的作用。希望对读者朋友们有所帮助。

参考

史上最全JUnit4核心学习和使用、思维导图

Junit4单元测试学习

相关文章
|
10小时前
|
IDE Java 机器人
如何在Java中进行单元测试:JUnit 5的使用指南
如何在Java中进行单元测试:JUnit 5的使用指南
|
1天前
|
Java 测试技术
java的Junit测试@Test@Before@After Assert.assertEquals
java的Junit测试@Test@Before@After Assert.assertEquals
6 0
|
1天前
|
运维 Java 测试技术
Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
9 3
|
1天前
|
监控 druid Java
Springboot用JUnit测试接口时报错Failed to determine a suitable driver class configure a DataSource: ‘url‘
Springboot用JUnit测试接口时报错Failed to determine a suitable driver class configure a DataSource: ‘url‘
6 0
|
1天前
|
XML Java 数据库连接
浅谈后端boot框架整合第三方技术JUnit MyBatis Druid整体思想
浅谈后端boot框架整合第三方技术JUnit MyBatis Druid整体思想
2 0
|
1天前
|
XML Java 测试技术
《手把手教你》系列基础篇(八十二)-java+ selenium自动化测试-框架设计基础-TestNG测试报告-上篇(详解教程)
【6月更文挑战第23天】TestNG 是一个用于自动化测试的 Java 框架,它自动生成测试报告,包括 HTML 和 XML 格式。报告可在 `test-output` 文件夹中找到。要创建测试用例,可创建一个实现了 `@Test` 注解的方法。通过 `testng.xml` 配置文件来组织和执行测试。默认报告包括测试结果、失败点和原因。用户还能实现 `ITestListener` 和 `IReporter` 接口来自定义报告和记录器。
18 2
|
1天前
|
机器学习/深度学习 人工智能 测试技术
自动化测试框架的演进与实践
【6月更文挑战第23天】在软件工程领域,自动化测试框架的发展不断推动着质量保证的效率和效果。本文将探讨自动化测试框架从简单脚本到复杂集成系统的演变过程,并分析当前流行的框架如Selenium、Appium以及新兴的AI驱动测试工具。我们将通过具体案例,展示如何在现代软件开发实践中有效应用这些框架以提升测试覆盖率和准确性。
|
2天前
|
Java 测试技术 Python
《手把手教你》系列基础篇(八十一)-java+ selenium自动化测试-框架设计基础-TestNG如何暂停执行一些case(详解教程)
【6月更文挑战第22天】本文介绍了如何在TestNG中不执行特定测试用例。当部分模块未准备好时,可以通过以下方式暂停测试:③使用`@Test(enabled=false)`注解来禁用测试用例。作者提供了一个Java Selenium自动化测试的示例,展示如何通过修改`enabled`参数控制测试方法的执行。代码中,`testSearch2()`方法被禁用,因此在测试运行时不执行。文章还包含了测试报告和执行过程的截图。
33 7
|
4天前
|
存储 分布式计算 监控
分布式系统详解--框架(Hadoop-HDFS的HA搭建及测试)
分布式系统详解--框架(Hadoop-HDFS的HA搭建及测试)
10 0
|
4天前
|
XML 存储 自然语言处理
基于Java+HttpClient+TestNG的接口自动化测试框架(四)-------参数存取处理
基于Java+HttpClient+TestNG的接口自动化测试框架(四)-------参数存取处理

热门文章

最新文章