还在通过注释代码来进行功能测试?那你需要看看这份 Junit 单元测试指南

简介: 还在通过注释代码来进行功能测试?那你需要看看这份 Junit 单元测试指南

本文首发于公众号:「村雨遥」,欢迎搜索关注!


何为测试

在计算机领域中,所谓测试,描述的是一种用来鉴定软件正确性、完整性和质量的过程。而软件测试又一般可以分为黑盒测试和白盒测试,两者的相关定义如下。


黑盒测试

黑盒测试(black-box testing),也称黑箱测试,是软件测试方法,测试应用程序的功能,而不是其内部结构或运作。测试者不需具备应用程序的代码、内部结构和编程语言的专门知识。测试者只需知道什么是系统应该做的事,即当键入一个特定的输入,可得到一定的输出。测试案例是依应用系统应该做的功能,照规范、规格或要求等设计。测试者选择有效输入和无效输入来验证是否正确的输出。


黑盒测试方法可适合大部分的软件测试,例如集成测试(integration testing)以及系统测试(system testing)。


白盒测试

白盒测试(white-box testing),又称透明盒测试 glass box testing、结构测试 structural testing 等)是一个测试软件的方法,测试应用程序的内部结构或运作,而不是测试应用程序的功能(即黑盒测试)。在白盒测试时,以编程语言的角度来设计测试案例。测试者输入资料验证资料流在程序中的流动路径,并确定适当的输出,类似测试电路中的节点。


白盒测试可以应用于单元测试(unit testing)、集成测试(integration testing)和系统的软件测试流程,可测试在集成过程中每一单元之间的路径,或者主系统跟子系统中的测试。尽管这种测试的方法可以发现许多的错误或问题,它可能无法检测未使用部分的规范。


介绍一下黑白盒测试,主要是为了大家有一个概念,明白两者之间的区别,关于更多测试的内容,这里就不展开讲了,毕竟我们的重点是 JUnit。


JUnit 简介

什么是 JUnit

官网:https://junit.org/


JUnit 是一个编写可重复测试的简单框架,是单元测试框架 xUnit 的一个实例,属于白盒测试。


针对 Java 语言而言,程序中最小的功能单元是方法,因此,对 Java 程序进行单元测试就是针对单个 Java 方法的测试。


在我们简单的小程序中,平常测试使用的方法是在主类中创建对象,然后调用对应方法。但是这样一来存在两个缺点:


不能将测试代码和业务代码分离;

未打印出测试结果和期望结果;

因此此时我们就需要一种新的测试框架来帮助我们编写测试,而 JUnit 则是专门针对 Java 而设计的一种标准单元测试框架。作为一个 Java 开发者,学习 JUnit 来进行测试是必备技能。


如何安装 JUnit

本地安装

对于这种方法,我们只需要去下载 JUnit 最新的包,当前有 Junit4 和 Junit5 两个版本,可以根据自己的需要进行选择然后导入我们 IDE 的依赖文件即可,依赖文件下载地址如下:


JUnit4:https://github.com/junit-team/junit4/releases/


JUnit5:https://github.com/junit-team/junit5/releases/


以 IDEA 为例,依次打开 File -> Project Structure -> Project Settings -> Modules -> Dependencies -> 点击 + -> Library... -> Java,最后找到下载的 JUnit 文件即可;



image.png

  • Maven 安装

当使用 Maven 之后,我们就能十分简单地安装 JUnit 了,只需要在项目的 pom.xml 配置文件中导入依赖即可;

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
        <scope>test</scope>
    </dependency>
</dependencies>

使用 Junit 进行单元测试

首先我们需要有一个主类,然后基于改类来进行测试,这里我们以简单的运算器为例;

创建一个简易计算机类 Calc,然后包括加法 add 和减法 sub 两个方法;

package com.cunyu;
/**
 * @author : cunyu
 * @version : 1.0
 * @className : Calc
 * @date : 2021/3/30 10:04
 * @description : 简易计算器
 */
public class Calc {
    /**
     * @param num1 加数
     * @param num2 加数
     * @return 两数之和
     * @description 加法
     * @date 2021/3/30 10:04
     * @author cunyu
     * @version 1.0
     */
    public int add(int num1, int num2) {
        return num1 + num2;
    }
    /**
     * @param num1 减数
     * @param num2 被减数
     * @return 两数之差
     * @description 两数之差
     * @date 2021/3/30 10:11
     * @author cunyu
     * @version 1.0
     */
    public int sub(int num1, int num2) {
        return num1 - num2;
    }
}

定义好上述主类之后,我们来进行测试,测试步骤如下;

  1. 定义测试类

定义测试类时,我们推荐定义类名时就是 主类Test 的形式,比如我们上面的类为 Calc,我们要对其进行测试,则测试类的类名为 CalcTest

package com.cunyu;
/**
 * @author : cunyu
 * @version : 1.0
 * @className : CalcTest
 * @date : 2021/3/30 10:15
 * @description : 简易计算器测试
 */
public class CalcTest {
}

定义测试方法

测试类定义好之后,我们就可以定义测试方法了,而定义测试方法时,我们也有几点建议;


测试方法名是在主类方法名前加上 test,比如我们上边的方法为 add,则我们对应的测试方法名为 testAdd;

针对测试方法的返回值,因为我们只需要在方法内给出结果即可,不用再供其他人调用,所以建议返回值设置为 void;

针对测试方法的参数列表,由于我们主要还是针对传统建类调用方法测试的方法,所以此时最好是保持参数列表为空;


package com.cunyu;
import org.junit.Assert;
import org.junit.Test;
/**
 * @author : cunyu
 * @version : 1.0
 * @className : CalcTest
 * @date : 2021/3/30 10:15
 * @description : 简易计算器测试
 */
public class CalcTest {
    @Test
    public void testAdd(){
        Calc calc = new Calc();
        int result = calc.add(1,5);
        Assert.assertEquals(6,result);
    }
}

其中,@Test 为注解,用来注释一个普通的方法为一条测试用例。assertEquals 方法用于断言两个值是否相等。

如果测试成功,则在 IDE 中会出现如下提示。image.png一般来讲,测试成功一般是绿色,而测试失败则是红色。

  • 测试成功的界面image.png总结起来,我们针对一个方法的具体测试的步骤如下:


首先是创建被测试类的对象;

然后调用被测试的方法;

最后加入断言,判断调用方法得到结果和实际的结果之间是否相同;

JUnit 常用注解

由于现在主要用到的有 Junit4 和 Junit5 两个版本,而两者之间也是存在一些区别的,所以在这里给出两者中常用注解的一些差异。


下表中,给出了 Junit4 和 Junit5 中所共有功能的对应注解:


Junit4 注解 Junit5 注解 说明

@Test @Test 标识一条测试用例

@Ignore @Disable 忽略的测试用例

@Before @BeforeEach 每一个测试方法之前运行

@After @AfterEach 每一个测试方法之后运行

@BefreClass @BeforeAll 所有测试开始之前运行

@AfterClass @AfterAll 所有测试结果之后运行

@Category @Tag 标记和过滤

而相对于 Junit4,Junit5 也有做出升级,其特有的一些注解如下:


注解 说明

@TestFactory 测试工厂进行动态测试

@Nested 嵌套测试

@ExtendWith 注册自定义扩展

常用断言方法

而在测试中,我们经常用到断言方法。这些断言方法都来自于由继承了 java.lang.Object 的 Assert 类,用于提供编写测试。


方法 说明

void assertArrayEquals([String message],expected array, result array) 断言预期数组和结果数组相等

void assertEquals([String message],expected value, actual value) 断言两个值是否相等。类似于字符串比较使用的 equals() 方法

void assertNotEquals(String message], first, second) 查看两个对象是否不相等

void assertNull(String message], object) 查看对象是否为空

void assertNotNull(String message], object) 查看对象是否不为空

void assertSame(String message], expected, actual) 查看两个对象的引用是否相等。类似于使用 == 比较两个对象

void assertNotSame(String message], unexpected, actual) 查看两个对象的引用是否不相等。类似于使用 != 比较两个对象

void assertTrue(String message], boolean condition) 查看运行结果是否为 true

void assertFalse([String message], boolean condition) 查看运行结果是否为 false

void assertThat([String message], actual, matcher) 查看实际值是否满足指定的条件

fail() 让测试失败


package com.cunyu;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class CalcTest {
    @Test
    public void test() {
        String str1 = "村雨遥";
        String str2 = "村雨遥";
        String str3 = "1943";
        String str4 = "1943";
        String str5 = null;
        int num1 = 1;
        int num2 = 2;
        int[] arr1 = {1, 2, 3};
        int[] arr2 = {1, 2, 3};
        assertEquals(str1, str2);
        assertSame(str3, str4);
        assertNotSame(str2, str4);
        assertNotNull(str1);
        assertNull(str5);
        assertTrue(num1 == num2);
        assertArrayEquals(arr1, arr2);
    }
}

image.png

总结

好了,以上就是有关单元测试 Junit 的简单使用指南了。虽说大家现在还是有很多人在使用 Junit4,但如果你之前并未接触过 Junit,个人建议那就直接学习 Junit5 吧。当然了,Junit4 了解也是很有必要的,毕竟技多不压身,多一份技能少求人嘛。

目录
相关文章
|
8天前
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
|
22天前
|
SQL JavaScript 前端开发
基于Python访问Hive的pytest测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Python、来开发Hive应用的方法,产生的代码如下
49 6
基于Python访问Hive的pytest测试代码实现
|
6天前
|
Java C++
代码文件间重复性测试
本文介绍了如何使用代码相似性检测工具simian来找出代码文件中的重复行,并通过示例指令展示了如何将检测结果输出到指定的文本文件中。
|
24天前
|
测试技术 UED
软件测试的艺术:从代码到品质的探索之旅
在数字时代的浪潮中,软件已成为我们生活和工作不可或缺的一部分。然而,高质量的软件背后隐藏着一门鲜为人知的艺术——软件测试。本文将带你走进这门艺术的世界,从基础理论到实践应用,一起探索如何通过软件测试保障产品质量,提升用户体验,并最终实现从代码到品质的华丽转变。
|
17天前
|
敏捷开发 安全 测试技术
软件测试的艺术:从代码到用户体验的全方位解析
本文将深入探讨软件测试的重要性和实施策略,通过分析不同类型的测试方法和工具,展示如何有效地提升软件质量和用户满意度。我们将从单元测试、集成测试到性能测试等多个角度出发,详细解释每种测试方法的实施步骤和最佳实践。此外,文章还将讨论如何通过持续集成和自动化测试来优化测试流程,以及如何建立有效的测试团队来应对快速变化的市场需求。通过实际案例的分析,本文旨在为读者提供一套系统而实用的软件测试策略,帮助读者在软件开发过程中做出更明智的决策。
|
22天前
|
SQL JavaScript 前端开发
基于Java访问Hive的JUnit5测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Java、来开发Hive应用的方法,产生的代码如下
49 6
|
23天前
|
测试技术 持续交付
软件测试的艺术:从代码到信心的旅程
探索软件测试不仅仅是发现错误的技术过程,它是一场从编码到用户信心的转化之旅。本文将带你了解如何通过创造性思维和系统方法,将软件测试变成一门艺术,确保产品质量的同时,提升用户对技术的信赖。
34 4
|
27天前
|
人工智能 计算机视觉
AI计算机视觉笔记十五:编写检测的yolov5测试代码
该文为原创文章,如需转载,请注明出处。本文作者在成功运行 `detect.py` 后,因代码难以理解而编写了一个简易测试程序,用于加载YOLOv5模型并检测图像中的对象,特别是“人”类目标。代码实现了从摄像头或图片读取帧、进行颜色转换,并利用YOLOv5进行推理,最后将检测框和置信度绘制在输出图像上,并保存为 `result.jpg`。如果缺少某些模块,可使用 `pip install` 安装。如涉及版权问题或需获取完整代码,请联系作者。
|
1月前
|
IDE 测试技术 持续交付
Python自动化测试与单元测试框架:提升代码质量与效率
【9月更文挑战第3天】随着软件行业的迅速发展,代码质量和开发效率变得至关重要。本文探讨了Python在自动化及单元测试中的应用,介绍了Selenium、Appium、pytest等自动化测试框架,以及Python标准库中的unittest单元测试框架。通过详细阐述各框架的特点与使用方法,本文旨在帮助开发者掌握编写高效测试用例的技巧,提升代码质量与开发效率。同时,文章还提出了制定测试计划、持续集成与测试等实践建议,助力项目成功。
54 5
|
9天前
|
机器学习/深度学习 敏捷开发 测试技术
软件测试的艺术:从代码到用户心灵的旅程
在阅读本文之前,让我们先共同思考一个问题:“为什么即使是最小的错误,也可能对用户体验和企业声誉造成巨大的影响?” 正如我们将要探讨的,软件测试不仅是技术活动的一种,更是确保产品质量、优化用户体验和维持品牌声誉的关键步骤。本文将引导您了解软件测试的基本概念,探索其背后的艺术性,以及如何高效地实施测试策略来达到最佳的质量保证结果。
20 0
下一篇
无影云桌面