JUnit-自动化测试框架

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

引入依赖

xml 复制代码
<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

示例

java 复制代码
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

java 复制代码
@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)注解,表示当前类使用方法来进行排序

java 复制代码
@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:显示名称

java 复制代码
    @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)	天

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

java 复制代码
@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
java 复制代码
    @ParameterizedTest
    @ValueSource(ints= {1,2})
     public void test(int age){
        System.out.println(age);
    }

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

java 复制代码
    @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行开始读取

java 复制代码
    @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注解中未指明方法名,会自动调用与测试方法同名的静态方法
java 复制代码
  /**
     * 单个参数
     * @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)
                );
    }
相关推荐
麦兜*7 小时前
Spring Boot集成方案 + Elasticsearch向量检索,语义搜索核弹
java·spring boot·python·spring·elasticsearch·spring cloud·系统架构
Absinthe_苦艾酒8 小时前
JVM学习专题(四)对象创建过程
java·jvm·后端
程序员奈斯8 小时前
苍穹外卖Day10
java
CodeHackerBhx8 小时前
Jenkins
java·运维·jenkins
忘忧人生9 小时前
docker 容器常用命令
java·docker·容器
慕y2749 小时前
Java学习第一百一十部分——CI/CD
java·学习·ci/cd
柊二三9 小时前
spring boot开发中的资源处理等问题
java·spring boot·后端
一枚小小程序员哈9 小时前
基于springboot的宠物商城设计与实现
java·spring boot·spring·eclipse·tomcat·maven·宠物
崎岖Qiu10 小时前
leetcode643:子数组最大平均数 I(滑动窗口入门之定长滑动窗口)
java·算法·leetcode·力扣·双指针·滑动窗口
Asu520210 小时前
思途AOP学习笔记 0806
java·sql·学习·mybatis