认识Junit

1. 前言

2. Junit注解

2.1. 常用的注解

2.1.1. @Test

表示当前方法是一个测试方法(不需要main来执行)

复制代码
@Test
void Test01() throws InterruptedException {
    System.out.println("测试用例1");
    WebDriver webDriver = new ChromeDriver();
    webDriver.get("https://www.baidu.com");
    Thread.sleep(500);
    webDriver.quit();
}

@Test
void Test02(){
    System.out.println("测试用例2");
}

2.1.2. @BeforeAll

在所有测试用例开始之前运行的方法, 要用static修饰

复制代码
@BeforeAll
static void SetUp(){
    System.out.println("开始执行@BeforeAll代码");
}

2.1.3. @AfterAll

在所有测试用例开始之后运行的方法, 要用static修饰

复制代码
@AfterAll
static void TearDown(){
    System.out.println("开始执行@AfterAll代码");
}

2.1.4. @BeforeEach

在每个测试用例开始之前运行的方法

复制代码
@BeforeEach
void beforeEach(){
    System.out.println("开始执行@BeforeEach代码");
}

2.1.5. @AfterEach

在每个测试用例开始之后运行的方法

复制代码
@AfterEach
void AfterEach(){
    System.out.println("开始执行@AfterEach代码");
}

2.1.6. @Disabled

忽略当前的测试用例

复制代码
@Disabled
@Test
void Test01() throws InterruptedException {
    System.out.println("测试用例1");
    WebDriver webDriver = new ChromeDriver();
    webDriver.get("https://www.baidu.com");
    Thread.sleep(500);
    webDriver.quit();
}

2.2. 执行顺序

2.2.1. 不同注解的执行顺序

复制代码
@BeforeAll代码
    
    @BeforeEach代码
    	测试用例1
    @AfterEach代码
        
    @BeforeEach代码
    	测试用例2
    @AfterEach代码
    
    @BeforeEach代码
    	...
    @AfterEach代码

@AfterAll代码

2.2.2. 各个@Test的执行顺序

没有特定的顺序, 是Junit自己决定, 不过可以自己指定顺序

2.2.2.1. 按指定顺序执行

加上类注解@TestMethodOrder(MethodOrderer.OrderAnnotation.class)

然后给每个方法加上@Order(序号)来决定顺序

  • 按照数字从小到大执行, 数字可以不相邻, 可以为负数

  • 没有加@Order注解的, 在所有有注解执行完毕再按默认顺序执行

    import org.junit.jupiter.api.*;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;

    //按指定顺序执行
    @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
    public class JunitTest {

    复制代码
      //忽略当前的测试用例
      @Disabled
      //@Test 表示当前方法是一个测试用例
      @Test
      void Test01() throws InterruptedException {
          System.out.println("测试用例1");
          WebDriver webDriver = new ChromeDriver();
          webDriver.get("https://www.baidu.com");
          Thread.sleep(500);
          webDriver.quit();
      }
      
      @Order(-1)
      @Test
      void Test02(){
          System.out.println("测试用例2");
      }
    
      @Order(40)
      @Test
      void Test03(){
          System.out.println("测试用例3");
      }
    
      @Order(30)
      @Test
      void Test04(){
          System.out.println("测试用例4");
      }
    
      @BeforeEach
      void beforeEach(){
          System.out.println("开始执行@BeforeEach代码");
      }
    
      @AfterEach
      void AfterEach(){
          System.out.println("开始执行@AfterEach代码");
      }
    
      @BeforeAll
      static void SetUp(){
          System.out.println("开始执行@BeforeAll代码");
      }
      @AfterAll
      static void TearDown(){
          System.out.println("开始执行@AfterAll代码");
      }

    }

2.2.2.2. 随机顺序执行

加上类注解@TestMethodOrder(MethodOrderer.Random.class)会按随机顺序执行

此时@Order(序号)就失效了

3. Junit参数化

3.1. 单参数 @ValueSource

使用@ParameterizedTest来修饰方法, 表示这个方法有参数. 此时不能再用@Test

使用@ValueSource来传入单参数, 可以设置参数类型, 例如下面的string

strings = {"1","2","3"}代表本方法执行三次, 传入参数分别为1,2,3

复制代码
@ParameterizedTest
@ValueSource(strings = {"1","2","3"})
void Test03(String str){
    System.out.println(str);
}

3.2. 多参数: CSV

3.2.1. @CsvSource

使用@ParameterizedTest修饰方法

使用@CsvSource传入多个参数, 可以参照下面的代码(本方法将会执行三次)

复制代码
@ParameterizedTest
@CsvSource({"1, 2", "3, 4", "5, 6"})
void Test06(String str, int num){
    System.out.println("str="+str+", num="+num);
}

3.2.2. @CsvFileSource

当我们需要特别多组的测试数据时, 全部写在注解里不友好,可以传入参数文件(.csv)来进行测试

使用@ParameterizedTest修饰方法

使用@CsvFileSource(resources = "csv文件路径")传入参数

右键可以让idea自动创建文件, 可以选择放在resource/Junit/xxx.csv

(其中""表示空字符串)

复制代码
@ParameterizedTest
@CsvFileSource(resources = "test01.csv")
void Test07(int id, String name){
    System.out.println("id="+id);
    System.out.println("name="+name);
}

3.3. 多参数: 传入方法

使用@ParameterizedTest修饰方法

使用MethodSource("方法名")表示参数来源于哪个方法

多组数据可以用多个Arguments.arguments(参数1,参数2,...)来传递

复制代码
public static Stream<Arguments> myMethod() {
    return Stream.of(Arguments.arguments(1,"张三"),
            Arguments.arguments(2, "李四"),
            Arguments.arguments(3, "王五")
    );
}
@ParameterizedTest
@MethodSource("myMethod")
void Test08(int num, String name){
    System.out.println("id="+num);
    System.out.println("name="+name);
}

4. Junit断言

断言分为: 断言相等, 断言不相等, 断言为空, 断言不为空

对于每个断言, 符合条件就没有任何提示, 不符合会报错并且之后的代码不运行

复制代码
@ParameterizedTest
@ValueSource(strings = {"10"})
void Test09(String num){
    //断言相等:符合条件就没有任何提示, 不符合会报错并且之后的代码不运行
    Assertions.assertEquals(num,"10");
    //断言不相等
    Assertions.assertNotEquals(num,"11");
    //断言为空
	//Assertions.assertNull(num);
    //断言不为空
    Assertions.assertNotNull(num);
}

5. Junit测试套件

5.1. 自动启动测试

5.1.1. @SelectClasses

@SelectClasses()里面写上类名.class即可自动运行这些类

例如, 一个类时@SelectClasses(类名1Test.class)

多个类时, @SelectClasses({类名1Test.class, 类名2Test.class})

复制代码
import Junit.Junit02Test;
import Junit.JunitTest;
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;

@Suite
@SelectClasses({JunitTest.class, Junit02Test.class})
public class RunSuite {
	
}

5.1.2. @SelectPackages

@SelectPackages()里写上包的完整路径名就可以自动运行包下的所有Test类

例如, 一个包时, @SelectPackages("包完整名称")

多个包时, @SelectPackages({"包1","包2"})

测试类的名称必须以Test结尾, 不然不会识别为测试类, 从而不执行

复制代码
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;

@Suite
@SelectPackages("Junit")
public class RunSuite {

}
相关推荐
考虑考虑9 小时前
Jpa使用union all
java·spring boot·后端
用户37215742613510 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊11 小时前
Java学习第22天 - 云原生与容器化
java
渣哥13 小时前
原来 Java 里线程安全集合有这么多种
java
间彧13 小时前
Spring Boot集成Spring Security完整指南
java
间彧13 小时前
Spring Secutiy基本原理及工作流程
java
Java水解14 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆16 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学17 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole17 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端