JUnit 是什么?

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

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

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><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.9.1</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.9.1</version><scope>test</scope></dependency>

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

@Test

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

@Testvoid test00() {System.out.println("test00");}

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

@BeforeAllstatic void setUp(){System.out.println("开始执行@BeforeAll修饰的方法");}

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

@AfterAllstatic void terDown(){System.out.println("开始执行@AfterAll修饰的方法");}

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

@BeforeEachvoid beforeTest(){System.out.println("执行单个before");}

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

@AfterEachvoid afterTest(){System.out.println("执行单个after");}

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

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

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

//按顺序执行测试用例@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一起使用,并且只能传一种类型的参数

示例如下:

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

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

@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类型,示例如下:

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

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

@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),是许多测试用例的集合,测试用例可用来测试一程式是否正确工作,测试套件包括许多测试用例,一般也会有针对测试用例及其测试目的的详细说明,在进行测试时的系统组态资讯以及测试前需进行的步骤。

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

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

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

@Suite@SelectPackages({"org.example.junit1","org.example.junit2"})public class RunSuit {}

Assertions 断言的使用

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

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

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

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

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

实际项目中的使用

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

import org.junit.jupiter.api.Test;import org.mockito.InjectMocks;import org.mockito.Mock;@MockXXXService xxxService;@InjectMocksxxxServiceImpl xxxServiceImpl;@Testvoid beanTest(){xxxService.xxx();xxxServiceImpl.xxxx();}

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

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

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