本篇博文目录:

  • 1.单元测试
    • (1) 测试Java方法(原生)
  • 2. JUnit 5
    • (1) JUnit 5简单使用的例子
    • (2) JUnit5常用注解
    • (3) JUnit5常用注解的使用
    • (4).JUnit5内置断言

1.单元测试

单元测试就是针对最小的功能单元编写测试代码。Java程序最小的功能单元是方法,因此,对Java程序进行单元测试就是针对单个Java方法的测试。

(1) 测试Java方法(原生)

例子:

下面的代码就是在静态方法Factorial 中根据传入的n值计算n阶乘的值:

public class Factorial {public static long fact(long n) {long r = 1;for (long i = 1; i <= n; i++) {r = r * i;}return r;}
}

要测试这个方法,一个很自然的想法是编写一个main()方法,然后运行一些测试代码:

public class Test {public static void main(String[] args) {if (fact(10) == 3628800) {System.out.println("pass");} else {System.out.println("fail");}}
}

运行效果:

不过,使用main()方法测试有很多缺点:

  1. 是只能有一个main()方法,不能把测试代码分离,
  2. 是没有打印出测试结果和期望结果,例如,expected: 3628800, but actual: 123456,
  3. 是很难编写一组通用的测试代码。

因此,我们需要一种测试框架,帮助我们编写测试。

2. JUnit 5

JUnit是一个开源的Java语言的单元测试框架,专门针对Java设计,使用最广泛,Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。

(1) JUnit 5简单使用的例子

Junit5的操作非常简单,具体操作如下:

导入Junit5的依赖

如果是Sring Boot项目的话就无需导入了,因为SpringBoot中的test依赖中有Junit5的依赖

Maven中导入以下依赖:

     <dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.5.2</version></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-runner</artifactId><version>1.5.2</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-params</artifactId><version>5.6.2</version></dependency>

上面的依赖说明:

  • junit-jupiter-engine:Junit的核心测试引擎
  • junit-platform-runner: 用于在JUnit 4环境中的JUnit平台上执行测试和测试套件的运行器。
  • junit-jupiter-params:编写参数化测试所需要的依赖包

备注:更多依赖的解释可以通过这篇博文了解到:Junit5系列-什么是Junit5?

一键生成测试类以及对应方法的测试代码:



点击OK后就会在相应的test目录下生成对应的测试类和测试方法:


在face中编写测试代码即可:

运行测试方法,可以直接点击测试方法旁的绿色按钮,点击Run fact()

或者点击类旁的绿色箭头,点击Run JunitTest…

备注:运行方式1是运行对应方法的测试代码,运行方式2是运行类里的所有测试方法!

在运行的几种方式中有一种方式可以查看当前代码的覆盖率( 这种方式有助于我们更优的进行测试 ):

运行后就可以查看相应的覆盖率情况:

(2) JUnit5常用注解

详细的注解你可以通过官方了解,https://junit.org/junit5/docs/current/user-guide/#writing-tests-annotations

注解 解释
@Test 表示方法是测试方法
@ParameterizedTest 表示方法是参数化测试
@RepeatedTest 表示方法可重复执行
@DisplayName 为测试类或者测试方法设置展示名称
@BeforeEach 表示在每个单元测试之前执行
@AfterEach 表示在每个单元测试之后执行
@BeforeAll 表示在所有单元测试之前执行
@AfterAll 表示在所有单元测试之后执行
@Tag 表示单元测试类别,类似于JUnit4中的@Categories
@Disabled 表示测试类或测试方法不执行,类似于JUnit4中的@Ignore
@Timeout 表示测试方法运行如果超过了指定时间将会返回错误
@ExtendWith 为测试类或测试方法提供扩展类引用

(3) JUnit5常用注解的使用

例子:

import org.junit.jupiter.api.*;@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class JunitTestTest {@BeforeAllpublic void initDB() {System.out.println("正在创建数据库");}@BeforeEachpublic void initData() {System.out.println("正在初始化Test表数据");}@Test@DisplayName("第一次测试")public void firstTest() {System.out.println("第一个测试案例!");}@Test@DisplayName("第二次测试")public void secondTest() {System.out.println("第二个测试案例!");}@AfterEachpublic void destoryData() {System.out.println("正在销毁Test表数据");}@AfterAllpublic void destroyDB() {System.out.println("正在销毁数据库");}
}

运行类测试:

注解说明:

  • @BeforeAll 表示在所有单元测试之前执行,只执行一次,不会受测试用例数量的影响
  • @AfterAll 表示在所有单元测试之后执行,只执行一次,不会受测试用例数量的影响
  • @BeforeEach 表示在每个单元测试之前执行,会受测试用例数量的影响
  • @AfterEach 表示在每个单元测试之后执行,会受测试用例数量的影响
  • @DisplayName 为测试类或者测试方法设置展示名称

备注:使用以上注解需要使用 @TestInstance(TestInstance.Lifecycle.PER_CLASS) 注解。

通过 @ParameterizedTest参数化测试可以实现一次性执行多次不同参数的测试用例:

    @ParameterizedTest@ValueSource(strings = {"ONE","TWO","THREE"})public void ParameterizedTest(String str) {if (str.equals("ONE")){System.out.println("ONE");}else if (str.equals("TWO") ){System.out.println("TWO");}else if (str.equals("THREE")){System.out.println("THREE");}}

运行效果:

如果测试方法加上@Disabled注解表示该注解不不执行,如下:


再次运行( 确实没有运行 ):

上面采用的是定好的参数,也可以使用动态参数,如下:

参数化使用@ParameterizedTest注解,动态传参使用@MethodSource(“getStr”)注解指向一个静态的getStr()方法,就可以实现动态传参了。


运行效果:

通过@RepeatedTest注解可重复执行多次当前测试用例,如下:


对于该注解的其他参数,你可以通过这篇博文了解到:JUnit5 @RepeatedTest注解示例

(4).JUnit5内置断言

断言(assertions)是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是 org.junit.jupiter.api.Assertions 的静态方法。JUnit 5 内置的断言可以分成如下几个类别:检查业务逻辑返回的数据是否合理。所有的测试运行结束以后,会有一个详细的测试报告;

简单断言

用来对单个值进行简单的验证。如:

断言方法 解释
assertEquals 判断两个对象或两个原始类型是否相等
assertNotEquals 判断两个对象或两个原始类型是否不相等
assertSame 判断两个对象引用是否指向同一个对象
assertNotSame 判断两个对象引用是否指向不同的对象
assertTrue 判断给定的布尔值是否为 true
assertFalse 判断给定的布尔值是否为 false
assertNull 判断给定的对象引用是否为 null
assertNotNull 判断给定的对象引用是否不为 null
assertThrows 判定调用某方法是否触发该异常

练习代码如下:

运行效果:

测试代码:

运行效果:

如果测试条件不满足就会打印出异常信息

测试异常Assertions.assertThrows:

assertThrows的第一个参数为预期异常,第二个为当执行testClass.getUser(null);触发

运行效果:

Java基础单元测试相关推荐

  1. (60)Java基础 --单元测试

    目录 一.测试的概念 二.使用Junit4.x进行单元环境 1.环境搭建 2.使用步骤 3.常见注解 三.规范的Junit测试方式 四.断言 1.为什么要使用断言 2.什么是断言(猜测) 3.常用AP ...

  2. Spring的核心机制依赖注入,Junit测试与Java基础Getter和Setter两种方法意义——2017.07.26...

    今天对Spring的基础理解又加深了一丢丢. 1 首先Spring的基础配置文件中,主要由以下几个配置文件, 1 <beans xmlns:xsi="http://w3.org/200 ...

  3. Java基础-SSM之mybatis快速入门篇

    Java基础-SSM之mybatis快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实你可能会问什么是SSM,简单的说就是spring mvc + Spring + m ...

  4. [转载] Java基础知识面试题(2020最新版)

    参考链接: Java中的异常类型与示例 文章目录 Java概述何为编程什么是Javajdk1.5之后的三大版本JVM.JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码? ...

  5. Java基础 (适合新手入门保姆级)

    基础1 1.进制的转换 1. 十进制数据转成二进制数据:使用除以2获取余数的方式 2. 二进制(0B/b开头)转换为十进制:1001 = 1*2^0+0*2^1+0*2^2 +1*2^3 = 9 3. ...

  6. Java基础知识面试题(2021最新版)

    转载自:https://thinkwon.blog.csdn.net/article/details/104390612 文章目录 Java概述 何为编程 什么是Java jdk1.5之后的三大版本 ...

  7. java基础总结-java技术栈快速复习

    java基础 java基础概念 java概述和语言背景 java语言是没有sun公司(Stanford University Network:斯坦福大学网络)在1995年推出的计算机语言 java之父 ...

  8. Java 基础入门,小白提升路线图

    1000+最新Java面试题 获取学习路线资料啦 Java的基础知识就像我们所住的房子的地基,如果地基不稳,上面所盖的楼房再宏伟,也是没人敢去入住的,同理Java的基础不牢固,以后也很难成为真正意义上 ...

  9. JAVA基础知识(用已知,释新知道)

    一.JAVA语言的特性 1).跨平台性: 2).运行原理: 二.八大基本类型  2.1)基本类型的类型转换: 口诀: 小到大,直接转 大到小,强制转 浮变整, 小数没 低 ----------> ...

最新文章

  1. TVM图优化与算子融合
  2. 【 Overview 】ALGORITHMS FOR SOURCE LOCALIZATION
  3. 获取窗口上指定控件集合 2012-08-22 16:14 498人阅读 评论(0) 收藏...
  4. 在Linux下快速搭建LAMP开发平台.doc
  5. 北妈每日一题:如何拿到 金条、蛋糕和大钻石
  6. .Net MVC中设置默认启动为某区域的视图
  7. c语言求1到20的各个阶乘,c语言求阶乘(c语言求1到20的阶乘)
  8. 本地跟单EA安装教程详解
  9. python俄罗斯方块小游戏实验报告_python实现俄罗斯方块游戏
  10. DS1308 Datasheet
  11. 【机器学习开放项目】安然公司电子邮件数据集
  12. 最最基本的SQL手动url注入方法
  13. JDK9 的字符串底层原理是什么?
  14. MATLAB将图片显示为热图并保存
  15. c语言disp函数_disp 在matlab中是什么意思
  16. NOIP练习赛题目1
  17. 市场调研—全球与中国手推式扫地机市场现状及未来发展趋势
  18. 《CMake 进阶之路》第四章 安装Installing 及 测试Testing
  19. synology群晖存储手机drive上传文件
  20. 玉石效果?——UnityShader学习笔记

热门文章

  1. NSIS脚本学习:判断版本并安装.NET Framework运行环境
  2. 奥的斯服务器显示chc,奥的斯服务器中文说明.docx
  3. Android设置屏幕保持长亮
  4. 隐马尔科夫模型(HMM)及其扩展
  5. div css每行文字显示一半 同时文字字体重叠显示不全解决方法
  6. EasyCVR视频广场iframe链接集成后播放失败是什么原因?
  7. 剖析强化学习 - 第八部分
  8. GitLabCICD实战----在.gitlab-ci.yml文件的步骤中使用git clone 另一个代码仓报错的解决办法
  9. Java开发者职业生涯要看的200+本书
  10. Redis 官方文档阅读之 High Availability