1-注解

区别于一般语言中的注释,程序运行时会根据注解,为标记注解的方法进行不同的操作,一般将注解写在测试方法的前面,常用的注解如下:

@BeforeAll,这个注解的定义是使用了该注解的方法在当前整个测试类中所有的测试方法之前执行,每个测试类运行时只会执行一次。@AfterAll,与@BeforeAll相对应,这个注解定义是在使用了该注解的方法在当前测试类中所有测试方法都执行完毕后执行的,每个测试类运行时只会执行一次。@BeforeEach,这个注解表示了在每一个测试方法之前执行。注意不要与@BeforeAll概念混淆,@BeforeEach会每一个测试方法执行之前都会执行,@BeforeAll只会执行一次。@AfterEach,此注解表示在每一个测试方法执行之后都会执行。@Test,表示该方法是一个测试方法。@DisplayName,该注解为测试类或测试方法声明了一个自定义显示的名称。@Tag,该注解表示为将测试类或者测试方法进行自定名称的标记,使用了标记后可以通过这些标记用来过滤、测试、发现和执行。@Disabled,该注解用来禁止整个测试类或者测试方法的执行。如上结果使用了此注解的测试方法skipRun并没有被执行,只输出了skip run的禁止执行声明。
package javatest;import org.junit.jupiter.api.*;
import org.junit.jupiter.api.Test;@DisplayName("Common annotation test")
public class AnnotationsTest {private static Add add;@BeforeAllpublic static void beforeAll() {add=new Add();System.out.println("This is beforeAll");}@BeforeEachpublic void beforeEach() {System.out.println("This is beforeEach");}@AfterEachpublic void afterEach() {System.out.println("This is afterEach");}@AfterAllpublic static void afterAll() {System.out.println("This is afterAll");}@Disabled@Test@DisplayName("Ignore the test")public void disabledTest() {System.out.println("This is disabledTest");}@Test@DisplayName("Test Methods 1+1")public void testAdd1() {System.out.println("This is Test1");Assertions.assertEquals(2,add.add(1,1));}@Test@DisplayName("Test Methods 2+2")public void testAdd2() {System.out.println("This is Test2");Assertions.assertEquals(4,add.add(2,2));}}

2-断言

用于检测传进去的参量,在测试方法中起特别大的作用,相当于真正判断逻辑值是否相等的方法,逻辑值相等则认为该断言通过,不相等则报错。

package javatest;import static java.time.Duration.ofMillis;
import static java.time.Duration.ofMinutes;
import static org.junit.jupiter.api.Assertions.*;import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;class Assert {@Testvoid standardAssertions() {assertEquals(2, 2);assertEquals(4, 4, "error message");assertTrue(2 == 2, () -> "error message");}@Testvoid groupedAssertions() {assertAll(() -> assertEquals("John", "John"),() -> assertEquals("Doe", "Doe"));}@Testvoid dependentAssertions() {assertAll("properties",() -> {String firstName = "John";assertNotNull(firstName);assertAll("first name",() -> assertTrue(firstName.startsWith("J")),() -> assertTrue(firstName.endsWith("n")));},() -> {String lastName = "Doe";assertNotNull(lastName);assertAll("last name",() -> assertTrue(lastName.startsWith("D")),() -> assertTrue(lastName.endsWith("e")));});}@Testvoid exceptionTesting() {Throwable exception = assertThrows(IllegalArgumentException.class, () -> {throw new IllegalArgumentException("a message");});assertEquals("a message", exception.getMessage());}@Testvoid timeoutNotExceeded() {assertTimeout(ofMinutes(2), () -> {});}@Testvoid timeoutNotExceededWithResult() {String actualResult = assertTimeout(ofMinutes(2), () -> {return "result";});assertEquals("result", actualResult);}@Disabled@Testvoid timeoutExceeded() {// 断言超时,会在任务执行完毕后才返回,也就是1000毫秒后返回结果assertTimeout(ofMillis(10), () -> {// 执行任务花费时间1000毫秒Thread.sleep(1000);});}@Disabled@Testvoid timeoutExceededWithPreemptiveTermination() {// 断言超时,如果在10毫秒内任务没有执行完毕,会立即返回断言失败,不会等到1000毫秒后assertTimeoutPreemptively(ofMillis(100), () -> {Thread.sleep(1000);});}}

3-假设

假设的作用更像是进行if-else判断,只有假设的条件满足,才会进行该测试方法后续的内容,否则将会中断当前测试方法。

import static org.junit.jupiter.api.Assumptions.assumeFalse;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
import static org.junit.jupiter.api.Assumptions.assumingThat;import org.junit.jupiter.api.Test;class Assumption {@Testvoid assumeTrueTest() {//如果假设传入的值为True,那么就会执行后面测试,否则直接停止执行assumeTrue(false);System.out.println("This will not be implemented.");}@Testvoid assumeFalseTest() {//如果假设传入的值为false,那么就会执行后面测试,否则直接停止执行assumeFalse(true);System.out.println("This will not be implemented.");}@Testvoid assumingThatTest() {//    assumingThat​(boolean assumption, Executable executable)//assumingThat 接受一个boolean值assumption,如果assumption为true,那么将会执行executable,否则不会执行,//但是assumingThat即使为false也不会影响后续代码的执行,他和assumeFalse和assumeTrue不同,assumingThat只//决定Executable是否执行,Executable是一个函数式接口,接受一个没有参数和返回值的方法。assumingThat(false,() -> {System.out.println("This will not be implemented.");});//下面的输出将会执行System.out.println("This will be implemented.");}
}

4-禁用

禁用的操作就比较简单,理论上属于前面注解的一种。@Disabled注解可以注解在方法上或者注解在类上,注解在方法上时禁用对应的方法,注解在类上的时候禁用该类中所有的测试。

import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;class DisabledTest {@Test//使用@Disabled注解关闭@Disabledvoid disabled() {System.out.println("Not running");}@Testvoid open() {System.out.println("running");}
}

5-重复测试

可以看做一般语言中的循环,设定初始值并循环进行测试,节省了一次一次输入测试数据的时间。也用到了注释的方法。通过@RepeatedTest注解可以完成重复测试的工作,@RepeatedTest中的value属性可以设置重复的次数,name属性可以自定义重复测试的显示名,显示名可以由占位符和静态文本组合,目前支持下面几种占位符:{displayName}: 显示名、{currentRepetition}: 当前重复次数、{totalRepetitions}: 总重复次数。
name属性实际上就是改变了测试在控制台输出的内容,不写会显示默认的格式。

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.RepetitionInfo;
import org.junit.jupiter.api.TestInfo;class Repeated {//自定义重复测试的显示名称@RepeatedTest(value=10,name="{displayName}-->{currentRepetition}/{totalRepetitions}")@DisplayName("repeatTest")void repeatedTest(TestInfo testInfo,RepetitionInfo repetitionInfo) {//我们可以通过TestInfo在测试中获取测试的相关信息,比如输出自定义的测试名System.out.println(testInfo.getDisplayName());//输出当前重复次数System.out.println("currentRepetition:"+repetitionInfo.getCurrentRepetition());}}

6-参数化测试

与重复测试很相似,区别在于参数化测试是在给定的测试集合里面进行重复测试,而普通的重复测试仅仅是暴力。相当于重复测试的增强版。参数化测试使用@ParameterizedTest 注解声明,而且参数化测试必须声明至少一个参数源,用@ValueSource等注解参数源。参数化测试会分别将参数源里面的内容作为形参输入进测试方法中。
参数源的注解也有很多类。@ValueSource允许指定单个文字值数组,并且只能用于为每个参数化测试调用提供单个参数。@EnumSource提供了一种使用 Enum 常量的便捷方法。注释提供了一个可选 names 参数,允许指定应使用哪些常量。如果省略,将使用所有常量。@MethodSource允许引用测试类或外部类的一个或多个工厂方法。@CsvSource允许将参数列表定义为以逗号分隔的值(即String类型)。@CsvSource使用单引号’作为引号字符。空的引用值’'会被解释成空的的 String 类型; 而完全空值被解释为 null。@ArgumentsSource @ArgumentsSource可用于指定自定义,可重用 ArgumentsProvider。

import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.ArgumentsProvider;
import org.junit.jupiter.params.provider.ArgumentsSource;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.EnumSource;
import org.junit.jupiter.params.provider.ValueSource;class ParameterTest {@ParameterizedTest@ValueSource(strings= {"shi","yan","lou"})void parameter(String args) {System.out.println(args);}@ParameterizedTest//使用names制定需要的枚举常量@EnumSource(value = TimeUnit.class, names = { "DAYS", "HOURS" })void enumSource(TimeUnit timeUnit) {System.out.println(timeUnit.toString());}@ParameterizedTest@CsvSource({ "shi, 1", "yan, 2", "'lou, plus', 3" })void csvSource(String first, int second) {System.out.println(first+"---"+second);}@ParameterizedTest@ArgumentsSource(MyArgumentsProvider.class)void argumentsSource(String argument) {System.out.print(argument);;}static class MyArgumentsProvider implements ArgumentsProvider {@Overridepublic Stream<? extends Arguments> provideArguments(ExtensionContext context) {return Stream.of("shi-", "yan-", "lou\n").map(Arguments::of);}}
}

7-过滤测试

一般情况下不使用禁用注解,会执行测试程序中的所有测试方法,但是具体使用时如果只想用所有测试方法中的几个进行测试,就可以使用过滤测试。通过tag注解,对测试方法进行标注,测试时选择几个进行运行。在测试文件上单击右键->run as ->run configurations,点击configure,在输入框中填入需要运行的测试方法的标签名,点击 ok,接着点击 Run。这样就只会运行选中的几个测试方法,使得整个测试程序更加灵活。

Junit使用方法总结相关推荐

  1. java junit 私有方法_有没有办法在Junit5中的另一个方法中模拟私有方法调用

    下面是我想测试的方法,但据我所知Junit5不支持PowerMockito.那么有什么方法可以在另一个方法内部模拟私有方法调用吗? public Class MyClass { private voi ...

  2. Junit的安装与使用

    一.简介: JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个. JUnit有它 ...

  3. 用JUnit框架实现Java单元测试

    http://tech.it168.com/j/2007-08-27/200708271737659.shtml 单元测试是整个测试流程中最基础的部分,它们要求程序员尽可能早地发现问题,并给予控制,这 ...

  4. 基础概念总结(spring security、Quartz、JUnit测试)

    1.Spring Security 的大体框架和原理 (1)在web.xml中配置过滤器,这样就可以控制这个项目的每个请求.  (2)在applicationContext.xml配置,其中http标 ...

  5. JUnit测试框架的使用经验分享

    为什么80%的码农都做不了架构师?>>>    ‍ 1.学习Junit框架的使用 可通过以下两个示例进行学习. A.Junit使用方法示例1 1)把Junit引入当前项目库中 新建一 ...

  6. 扩展 junit 框架_JUnit 5 –扩展模型

    扩展 junit 框架 我们已经对Java最普遍的测试框架的下一个版本了解很多. 现在,让我们看一下JUnit 5扩展模型,该模型将允许库和框架将自己的实现添加到JUnit中. 总览 建立 基本 建筑 ...

  7. JUnit 5和Selenium –改善项目配置

    Selenium是一组支持浏览器自动化的工具和库,主要用于Web应用程序测试. Selenium的组件之一是Selenium WebDriver,它提供客户端库,JSON有线协议(与浏览器驱动程序进行 ...

  8. junit测试设置不回滚_正确设置JUnit测试名称

    junit测试设置不回滚 寻找好名字是手工软件的挑战之一. 您需要随时随地找到它们-类,方法,变量,仅举几例. 但是,什么使名字成为好名字呢? 引用Oncle Bob的话:"三件事:可读性, ...

  9. 参数化测试 junit_使用JUnitParams进行参数化的JUnit测试

    参数化测试 junit 参数化的单元测试用于在不同条件下测试相同的代码. 借助参数化的单元测试,我们可以建立一种测试方法,该方法从某个数据源中检索数据. 该数据源可以是测试数据对象,外部文件甚至数据库 ...

最新文章

  1. 删除Openstack所有组件
  2. 配置Eclipse支持java和xml文件的代码补全功能
  3. TFLearn 在给定模型精度时候提前终止训练
  4. java怎么xml文件解析_Java对Xml文件解析
  5. 趣学python3(10)-函数注释方法
  6. 人工智能实践之旅 —— 简单说说主要内容和安排
  7. python 批量下载网页图片_Python实现多线程批量下载图片
  8. MyEclipse for Mac快捷键
  9. 自带flash的浏览器_解决Flash插件已被屏蔽的问题(谷歌、火狐、IE、Edge)
  10. 安装electron-react-boilerplate遇到的问题
  11. Ubuntu 安装R/Rstudio
  12. 欧洲最大云服务公司 OVH 法国机房着火:1个数据中心被完全烧毁、部分客户数据完全丢失且无法恢复
  13. java 拆分文本文件
  14. POJ 2185 Milking Grid KMP循环节周期
  15. Java 最常见的 200+ 面试题:面试必备
  16. 没有权限角色管理功能菜单加载
  17. 我的在校项目:校园类app
  18. 概率论基础 - 5 - 马尔可夫不等式
  19. 微信公众号文章中插入的图片如何实现滑动效果
  20. 3D动画制作流程概要

热门文章

  1. JSon_零基础_005_将po(bean)对象转换为JSon格式的对象字符串,返回给界面
  2. table表格某一td内容太多导致样式混乱的解决方案
  3. GDAL源码剖析(五)之Python命令行程序
  4. 测试转开发,一个女孩子短短的工作心得
  5. 从 Google 代码库找到的好东西 [转]
  6. [绝对原创]一些你们想不到的简单方法,就可以让你手机飞快起来!!!
  7. Inside Dynamics Axapta源代码赏析(三)
  8. Axios和Ajax处理后台返回文件流实现文件下载(图片和Excel)
  9. slect,poll,epoll区别
  10. 关于ibatis.net框架(NPetshop学习)