JUnit-自动化测试框架

发布于:2025-07-19 ⋅ 阅读:(16) ⋅ 点赞:(0)

JUnit是一个开源的java语言单元测试框架,在UI自动化测试中可以利用JUnit配合Selenium完成自动化测试,自动化代码和自动化测试有区别,区别在于自动化代码只是一个操作,要想达到自动化测试的效果,我们需要对测试结果进行判断,因此就要通过Junit来实现。

引入依赖

<dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>
<!--        参数化-->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.8.2</version>
            <scope>compile</scope>
        </dependency>

注解

@Test:注解的方法被视为一个用例

@BeforeAll:在所有测试执行之前执行一次,被注解的方法必须是静态的

@BeforeEach:在每个测试方法执行之前执行

@AfterAll:在所有测试方法执行之后执行一次,被注解的方法必须是静态的

@AfterEach:在每个测试方法执行之后执行

@Order:指定用例执行顺序

@DisplayName:为测试类或测试方法提供自定义名称

@ParameterizedTest:允许将参数传递给测试方法进行一次或多次执行

执行顺序:@BeforeAll>@BeforeEach>@Test>@AfterEach>@AfterAll

示例

public class JunitTestDemo {
    @Test
    public void test(){
        System.out.println("这是第一条用例");
    }
    @Test
    public void test2(){
        System.out.println("这是第二条用例");
    }
    @BeforeAll
    public static void test3(){
        System.out.println("优先级最高");
    }
    @BeforeEach
    public void test4(){
        System.out.println("每条用例执行前执行");
    }
    @AfterEach
    public void test5(){
        System.out.println("每条用例执行后执行");
    }
    @AfterAll
    public static void test6(){
        System.out.println("最后执行");
    }
}

执行结果
在这里插入图片描述

断言

通常用于自动化测试中的结果校验,确保测试结果与预期相符,AssertActions类的assertEquals和assertTrue方法:

assertEquals(excepted,actual):excepted和actual一致,则表示成功

assertTrue(boolean condition):判断一个条件是否为true,true表示成功,false则抛异常AssertionError

@Test
    public void test7(){
        System.out.println("用例01");
        Assertions.assertEquals(1,1);
    }
    @Test
    public void test8(){
        System.out.println("用例02");
        Assertions.assertTrue(0>1);
    }
    @Test
    public void test9(){
        System.out.println("用例03");
        Assertions.assertTrue(true);
    }

@Order:用例执行顺序

在方法上加注解@Order,需先在方法所在类上加@TestMethodOrder(MethodOrderer.OrderAnnotation.class)注解,表示当前类使用方法来进行排序

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTestDemo {  
	@Test
    @Order(2)
    public void test01(){
        System.out.println("用例01");
        Assertions.assertTrue(true);
    }
    @Test
    @Order(3)
    public void test02(){
        System.out.println("用例02");
        Assertions.assertTrue(true);
    }
    @Test
    @Order(1)
    public void test03(){
        System.out.println("用例03");
        Assertions.assertTrue(true);
    }
}

@DisplayName:显示名称

    @Test
    @DisplayName("这是第一条用例")
    public void test10(){
        System.out.println("用例名01");
    }
    @Test
    @DisplayName("这是第二条用例")
    public void test11(){
        System.out.println("用例名02");
    }

在这里插入图片描述

**@Timeout:**超时测试

默认单位秒,可以指定单位

@Timeout(1)	秒
@Timeout(value = 1,unit = TimeUnit.MILLISECONDS)	毫秒
@Timeout(value = 1,unit = TimeUnit.SECONDS)	秒
@Timeout(value = 1,unit = TimeUnit.MINUTES)	分
@Timeout(value = 1,unit = TimeUnit.HOURS)	时
@Timeout(value = 1,unit = TimeUnit.DAYS)	天

如果一个用例执行的时间超过指定时间,则标记为失败

@Test
    @DisplayName("这是第二条用例")
    @Timeout(1)
    public void test11() throws InterruptedException {
        Thread.sleep(3000);
        System.out.println("用例名02");
    }

参数化

@ValueSource:单参数

  • 参数化用例的时候使用的注解由@Test换成@ParameterizedTest(:这两个注解不能同时使用,同时使用会多执行一次)
  • 单参数化注解:@ValueSource

单参数化注解支持以下类型的参数数据的参数化

short/byte/int/long/float/double/char/boolean/java.lang.String/java.lang.Class

参数名 参数类型
shorts short
bytes bytes
ints int
longs long
floats float
doubles double
chars char
booleans boolean
strings java.lang.String
classes java.lang.Class
    @ParameterizedTest
    @ValueSource(ints= {1,2})
     public void test(int age){
        System.out.println(age);
    }

@CsvSource:多参数,通过delimiterString指定分隔符实现参数化,如下例子中指定参数与参数之间用 "-"分隔

    @ParameterizedTest
    @CsvSource(value = {"tom-10","jerry-11"},delimiterString = "-")
    public void test2(String name,int age){
        System.out.println("姓名:"+name+"\t年龄:"+age);
    }

@CsvFileSource:多参数文件参数化注解,在项目的test/resource中新增测试数据csv文件,numLinesToSkip可以指定从第n行开始读取

    @ParameterizedTest
    @CsvFileSource(resources = "/account.csv",numLinesToSkip = 1)
    public void test3(String name,String pwd,String num){
        System.out.println(name+","+pwd+","+num);
    }

@MethodSource

  • 通过@MethodSource注解引用方法作为参数化的数据源信息
  • 用@MethodSource注解的参数必须是静态的工厂方法,除非测试类被注解为@TestInstance(Lifecycle.PER_CLASS)
  • 静态工厂方法的返回值需要和测试方法的参数对应
  • 如果在@MethodSource注解中未指明方法名,会自动调用与测试方法同名的静态方法
  /**
     * 单个参数
     * @param str
     */
    @ParameterizedTest
    @MethodSource("dataParams")
    public void test(String str){
        System.out.println(str);
    }
    static Stream<String> dataParams(){
        return Stream.of("tom","jerry");
    }

    /**
     * 多个参数
     * @param name
     * @param age
     */
    @ParameterizedTest
    @MethodSource("multiParams")
    public void test2(String name,int age){
        System.out.println(name+","+age);
    }
    public static Stream<Arguments> multiParams(){
        return Stream.of(
                Arguments.arguments("tom",10),
                Arguments.arguments("jerry",11)
                );
    }

网站公告

今日签到

点亮在社区的每一天
去签到