本篇博文目录:

  • 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. jepg图像的存储 转
  2. cisco switch
  3. 【深度学习】手把手教你实现一个人工智能案例(蓄电池爬碱识别)
  4. web服务器负载架构
  5. 【C++进阶】 遵循TDD原则,实现平面向量类(Vec2D)
  6. oracle的todate函数 不用英文,关于在mybaties 和 oracle的to_date函数的问题?
  7. 这些数据分析方法你都掌握了么
  8. 通过skimmer发动供应链攻击,苏富比地产100多个网站受影响
  9. Qtum量子链入驻慢雾区,漏洞赏金计划单项最高奖励达1万美金!
  10. 3dmax如何使阴天灯光设置更加自然
  11. 利用bat修复office文件图标
  12. 【系】微信小程序云开发实战坚果商城-云开发之分类数据实现
  13. thinkphp mysql order_ThinkPHP中order()使用方法详解
  14. 如何接入易班第三方登录
  15. SNP全称是什么? SNP是什么公司? SNP是什么意思?
  16. 2019-05-15过了这么久我才写了这么点Hhhhhhhh今天也没有刷题我真的不是偷懒啊只是想赶紧弄完老师给的任务今天写的也很匆忙一会儿回去给姥姥姥爷打个电话然后买个晚餐回宿舍洗澡找妈妈视频啦啦啦了
  17. Android中Alarm的机制
  18. HDMI各版本的区别
  19. ERP系统的八大主要功能模块
  20. 考研上岸 -- 告别象牙塔

热门文章

  1. 2021年专升本考试政策什么时候发布?发布前该准备什么?
  2. 【未授权访问】我就这么容易被曝光了吗?
  3. K-近邻(K-Nearest Neighbor, KNN)分类原理及相关公式
  4. [C] 腾讯公司后台服务器经典面试题 (2009年5月)
  5. 随笔 致颓废懒惰的自己 劝自己清醒振奋
  6. 电脑安全模式怎么进?
  7. HPUNIX环境常用查看硬件设备信息命令小结
  8. 【Vue】9 - 组件(全局、局部)、通信(props、$meit、$refs)、插槽slot、component、$nextTick等
  9. [视觉模型]迁移学习之五个步骤
  10. 解决电脑能上网,但是显示无法连接Internet