0


Junit框架

JUnit 是一个 Java 编程语言的单元测试框架。

环境配置

创建maven项目,导入Junit配置

<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.9.2</version>
    <scope>test</scope>
</dependency>

JUnit的一些注意事项

测试方法必须使用 @Test 修饰

测试方法必须使用 public void 进行修饰

一般使用单元测试会新建一个 test 目录存放测试代码,在生产部署的时候只需要将 test 目录下代码删除即可

测试代码的包应该和被测试代码包结构保持一致

测试单元中的每个方法必须可以独立测试,方法间不能有任何依赖

测试类一般使用 Test 作为类名的后缀

测试方法使一般用 test 作为方法名的前缀

注解

  1. @Test:将一个普通方法修饰成一个测试方法 这个方法不能是静态方法

2、@BeforeClass: 会在所有的方法执行前执行 (只会执行一次,而且是第一个运行)被这个注解修饰的方法是static方法

3、@AfterClass:会在所有的方法执行之后执行(只会执行一次,而且是最后一个运行)被这个注解修饰的方法是static方法

4、@Before:会在每一个测试方法被运行前执行一次 这个方法不能是静态方法

5、@After:会在每一个测试方法运行后被执行一次 这个方法不能是静态方法

6、@Ignore:所修饰的测试方法会被测试运行器忽略 可修饰静态和非静态方法

其中,在高版本的junit(junit5)中 @BeforeClass和@AfterClass注解替换为了@BeforeAll和@AfterAll注解,@Before和@After注解替换为@BeforeEach和@AfterEach注解

断言

序号

方法和描述

1

void assertEquals(boolean expected, boolean actual)

检查两个变量或者等式是否相等

2

void assertTrue(boolean condition)

检查条件为真

3

void assertFalse(boolean condition)

检查条件为假

4

void assertNotNull(Object object)

检查对象不为空

5

void assertNull(Object object)

检查对象为空

6

void assertSame(Object expected, Object actual)

assertSame() 方法检查两个相关对象是否指向同一个对象

7

void assertNotSame(Object expected, Object actual)

assertNotSame() 方法检查两个相关对象是否不指向同一个对象

8

void assertArrayEquals(expectedArray, resultArray)

assertArrayEquals() 方法检查两个数组是否相等

Junit各种注解的执行顺序

public class demo1Test {
    @BeforeAll//注解的静态方法最先执行 且执行一次
    public static void print() {
        System.out.println("@BeforeAll注解执行");
    }

    @AfterAll//注解的静态方法最后执行 且执行一次
    public static void print1() {
        System.out.println("@AfterAll注解执行");

    }

    @BeforeEach//注解的方法 在其他方法执行前执行一次
    public void print2() {
        System.out.println("@BeforeEach注解执行");
    }

    @AfterEach
    public  void print3() {
        System.out.println("@AfterEach注解执行");
    }

    @Test
    public  void print4() {
        System.out.println("@Test注解执行");
    }
}

@order注解

控制方法的执行顺序

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)  //引入方法排序 这个类的方法就可以使用Order注解进行排序,根据排序执行
public class OrderTest {
    @Test
    @Order(1)//第一个执行
    void print(){
        System.out.println("aaa");
    }
    @Test
    @Order(2)//第二个执行
    void print1(){
        System.out.println("bbb");
    }
    @Test
    @Order(3)//第三个执行
    void print2(){
        System.out.println("ccc");
    }
}

测试套件

在实际项目中,随着项目进度的开展,单元测试类会越来越多,可是直到现在我们还只会一个一个的单独运行测试类,这在实际项目实践中肯定是不可行的。为了解决这个问题,JUnit 提供了一种批量运行测试类的方法,叫做测试套件。

  1. 创建一个空类作为测试套件的入口

  2. 使用@Suite注解修饰类,表示这个类是一个套件

  3. @SelectClasses注解选择加入套件的类

  4. 保证这个空类使用 public 修饰,而且存在公开的不带有任何参数的构造函数

@Suite//表示这个类是一个套件
@SelectClasses({demo1Test.class,demoTest.class})
public class suiteTest {

}

运行这个类,可以同时执行选择的类

除了选择类之外,还可以选择包加入到套件中

使用@SelectPackages()注解的前提是:包里面的类要以Test结尾,所有方法都要加入@Test注解

参数化测试

参数化测试允许开发人员使用不同的值反复运行同一个测试。

  1. @ParameterizedTest注解 标识方法类型是参数化

  2. @ValueSource注解 标识参数来源 其中的类型有int,byte,String,short,long,char等

  1. @ValueSource注解是设置单参数的,使用@CsvSource注解设置多参数,默认分割参数是逗号,delimiterString参数可以设置分隔符

  @org.junit.jupiter.params.ParameterizedTest
    @CsvSource(value = {"张三-10","李四-19"},delimiterString = "-") //设置分隔符是-
    public void setNameAndAge(String name, int age) {
        System.out.println(name + age);
    }
  1. 如果参数内容过多,可以使用文件保存传入数据

使用@CsvFileSource()注解

  1. 在当前项目的resources文件夹下创建.csv文件

  1. 在@CsvFileSource注解中设置文件路径
  @org.junit.jupiter.params.ParameterizedTest
    @CsvFileSource(resources = "/my.csv",delimiterString = "-")
    public void setNameAndAge(String name, int age) {
        System.out.println(name + age);
    }
  1. 如果不是resources文件夹下的文件,就不使用resources参数设置,要使用files参数设置
 @org.junit.jupiter.params.ParameterizedTest
    @CsvFileSource(files = "C:\\Users\\30283\\Desktop\\demo.csv",delimiterString = "-")
    public void setNameAndAge(String name, int age) {
        System.out.println(name + age);
    }

动态参数

方法的参数是不固定的,如果参数是由另外一个方法返回,就要使用@MethodSource(方法名)注解

提供动态参数的方法必须能够生成一个由参数集组成的流。这里所说的“流”是指所有可以被JUnit转换为Stream类型的任何类型,如Stream, DoubleStream, LongStream, IntStream, Collection, Iterator, Iterable,对象数组,原始类型数组等等。流中的元素也可以作为Arguments类的实例、对象数组、单个值(如果参数化测试方法只接受单个参数)等提供给参数化测试方法。

1、处理单参数

//这个方法提供传入的参数 返回的结果可以是Stream流
    private static Stream<String> get() {
        return Stream.of("张三","李四","王五");
    }

    @org.junit.jupiter.params.ParameterizedTest
    @MethodSource("get") //get方法返回的结果 将作为print的参数传入
    public void print(String  num){
        System.out.println(num);
    }

2、处理多参数

这是 提供参数的方法必须返回以Arguments类型的对象为元素的流

 //这个方法提供传入的参数 返回的结果可以是Stream流  arguments对象存储的是实际 传递给函数的参数,
    private static Stream<Arguments>  get() {
        return Stream.of(Arguments.arguments("张三",13), Arguments.arguments("李四",10));
    }

    @org.junit.jupiter.params.ParameterizedTest
    @MethodSource(value = {"get"}) //get方法返回的结果 将作为print的参数传入
    public void print(String num,int age){
        System.out.println(num+age);
    }

标签: junit 单元测试 java

本文转载自: https://blog.csdn.net/m0_58342797/article/details/128729864
版权归原作者 two 倩 所有, 如有侵权,请联系我们删除。

“Junit框架”的评论:

还没有评论