认识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 {

}
相关推荐
ytadpole32 分钟前
揭秘设计模式:命令模式-告别混乱,打造优雅可扩展的代码
java·设计模式
用户37215742613537 分钟前
Java 教程:轻松实现 Excel 与 CSV 互转 (含批量转换)
java
叫我阿柒啊1 小时前
Java全栈开发实战:从基础到微服务的深度解析
java·微服务·kafka·vue3·springboot·jwt·前端开发
凯尔萨厮1 小时前
Java学习笔记三(封装)
java·笔记·学习
霸道流氓气质1 小时前
Java开发中常用CollectionUtils方式,以及Spring中CollectionUtils常用方法示例
java·spring
失散131 小时前
分布式专题——5 大厂Redis高并发缓存架构实战与性能优化
java·redis·分布式·缓存·架构
通达的K1 小时前
Java实战项目演示代码及流的使用
java·开发语言·windows
David爱编程2 小时前
深入 Java synchronized 底层:字节码解析与 MonitorEnter 原理全揭秘
java·后端
索迪迈科技2 小时前
Protobuf 新版“调试表示为什么有链接?为什么会打码?我该怎么改代码?
java·log4j·apache