JUnit 简介

JUnit 是什么?

JUnit是一个Java测试框架,主要用于单元测试、集成测试,也可以用于创建自动测试。

JUnit框架是最流行的Java测试框架之一。它提供了一些功能,使编写测试变得容易,包括支持多个测试用例、断言和报告。JUnit也是多功能的,允许用各种语言编写测试。它可以用于大多数语言制作的应用程序,但特别适合于测试Java应用程序。

JUnit 使用需要引入的包?

xml 复制代码
<!--junit 单元测试需要-->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>RELEASE</version>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>RELEASE</version>
</dependency>
<!--测试套件需要-->
<!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite -->
<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-suite</artifactId>
    <version>1.9.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.9.1</version>
    <scope>test</scope>
</dependency>

JUnit 常用注解有哪些?(熟悉)

@Test

添加到方法上,表示当前的方法是一个测试用例。示例如下:

java 复制代码
@Test
void test00() {
    System.out.println("test00");
}

@BeforeAll

@BeforeAll表示在当前类所有测试用例执行之前运行,方法有 static 修饰,只执行一次。示例如下:

java 复制代码
@BeforeAll
static void setUp(){
    System.out.println("开始执行@BeforeAll修饰的方法");
}

@AfterAll

@AfterAll表示在当前类所有测试用例执行之后运行,方法有 static 修饰,只执行一次。示例如下:

java 复制代码
@AfterAll
static void terDown(){
    System.out.println("开始执行@AfterAll修饰的方法");
}

@BeforeEach

@BeforeEach表示在每个测试方法执行前运行。

java 复制代码
@BeforeEach
void beforeTest(){
    System.out.println("执行单个before");
}

@AfterEach

@AfterEach表示在每个测试方法执行后运行。

java 复制代码
@AfterEach
void afterTest(){
    System.out.println("执行单个after");
}

@Disabled

作用:忽略当前的测试用例

如何控制多个测试用例的执行顺序?

使用 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)+ @Order(数字) 注解,实现执行顺序的控制。示例如下:

java 复制代码
//按顺序执行测试用例
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
//随机执行测试用例
//@TestMethodOrder(MethodOrderer.Random.class)
public class JunitApiTest {
    @Test
    @Order(2)//第二执行
    void test01() {
        System.out.println("test01");
    }

    @Test
    @Order(1)//第一执行
    void test02() {
        System.out.println("test02");
    }
}

也可以采用随机执行的方式,使用 @TestMethodOrder(MethodOrderer.Random.class) 注解。

测试用例如何传参?(熟悉)

单参数传递

使用 @ParameterizedTest + @ValueSource() 配合传递单参数。

注意:这两个注解不能和@Test一起使用,并且只能传一种类型的参数

示例如下:

java 复制代码
//下面两个注解不能和@Test一起使用,并且只能传一种类型的参数
@ParameterizedTest
@ValueSource(strings = {"你","我","他"})//传了3个参数,测试用例将执行3次。
void test03(String str){
    System.out.println(str);
}

多参数传递
参数直传 :使用 @ParameterizedTest + @CsvSource() 配合,示例如下:

java 复制代码
@ParameterizedTest
//可以传入多种类型的参数
@CsvSource({"我今年,18,true","你今年,17,false"})
void test04(String str,int num,Boolean flag){
    System.out.println(str+" "+num + flag);
}

文件传递 :使用 @ParameterizedTest+ @CsvFileSource(resources = "文件名.csv") 配合,文件必须是.csv类型,示例如下:

java 复制代码
@Disabled//忽略当前的测试用例,当前测试用例将不执行
@ParameterizedTest
//注意:文件必须是.csv类型
@CsvFileSource(resources = "test01.csv")
void Test05(int id,String name){
    System.out.println("id="+id+",name="+name);
}

方法传参

使用 @ParameterizedTest + @MethodSource("方法名") 传入一个方法,示例如下:

java 复制代码
@ParameterizedTest
@MethodSource("Generator")
void Test06(String num,String name){
    System.out.println(num+" "+name);
}

public static Stream<Arguments> Generator() {
    return Stream.of(Arguments.arguments("1,你","2,我"));
}

测试套件的使用

测试套件可以简单理解为:一系列测试用例的集合。

测试套件(test suite)有时也称为验证套件(validation suite),是许多测试用例的集合,测试用例可用来测试一程式是否正确工作,测试套件包括许多测试用例,一般也会有针对测试用例及其测试目的的详细说明,在进行测试时的系统组态资讯以及测试前需进行的步骤。

可通过类名集成测试套件,示例如下:

java 复制代码
@Suite
@SelectClasses({类名1.class, 类名2.class})
//创建一个新的测试类,类上添加如上两个注解
public class RunSuite {
}

也可通过包名集成测试套件,示例如下:

java 复制代码
@Suite
@SelectPackages({"org.example.junit1","org.example.junit2"})
public class RunSuit {
}

Assertions 断言的使用

断言主要用于判断代码逻辑是否正确进而继续执行或中断。

断言(Assertion)是一种用于检查程序或系统在执行某些操作或运行某些代码后是否符合预期行为的技术手段。在测试中,断言通常用于验证代码的正确性,确保代码在满足特定条件时会产生预期的结果。

Assertions 类中的几个静态方法需要掌握

  • assertNotNull:参数不为null就继续执行;
  • assertEquals:两个参数相等就继续执行;
  • assertTrue:参数为true就继续执行。

其他的API根据自己的需要去了解。

实际项目中的使用

在实际的项目中,很多方法是需要注入bean对象之后,用bean对象来调用的。需要在对象上添加如下注解:

java 复制代码
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;

@Mock
XXXService xxxService;

@InjectMocks
xxxServiceImpl xxxServiceImpl;

@Test
void beanTest(){
  xxxService.xxx();
  xxxServiceImpl.xxxx();
}

这种方式的测试用例不会与数据库进行交互,需要自定义方法执行过程中的返回值,示例如下:

java 复制代码
@Test
void beanTest(){
  //when中的参数为一个带返回结果的方法调用。
  //thenReturn 中的参数为 自己想要的返回结果。
  when(otherBean.method1(arg1...)).thenReturn(目标结果);
  xxxServiceImpl.test();
}

当然还有可以与数据库进行交互的测试用例,完全还原测试场景的方法。在后续章节详细说明。

相关推荐
q***385117 小时前
SpringCloud实战十三:Gateway之 Spring Cloud Gateway 动态路由
java·spring cloud·gateway
小白学大数据17 小时前
Python爬虫伪装策略:如何模拟浏览器正常访问JSP站点
java·开发语言·爬虫·python
程序员西西18 小时前
SpringBoot接口安全:APIKey保护指南
java·spring boot·计算机·程序员·编程·编程开发
summer_west_fish18 小时前
单体VS微服务:架构选择实战指南
java·微服务·架构
v***85718 小时前
Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat
java·ubuntu·centos
烤麻辣烫18 小时前
黑马程序员大事件后端概览(表现效果升级版)
java·开发语言·学习·spring·intellij-idea
q***965818 小时前
Spring总结(上)
java·spring·rpc
思密吗喽18 小时前
宠物商城系统
java·开发语言·vue·毕业设计·springboot·课程设计·宠物
ss27319 小时前
019:深入解析可重入互斥锁:原理、实现与线程安全实践
java·数据库·redis
luyun02020219 小时前
牛批了,某音录播神器
java·windows·figma