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)
                );
    }
相关推荐
MarcoPage13 分钟前
Python 字典推导式入门:一行构建键值对映射
java·linux·python
脸大是真的好~13 分钟前
黑马JAVAWeb-11 请求参数为数组-XML自动封装-XML手动封装-增删改查-全局异常处理-单独异常分别处理
java
Hello.Reader3 小时前
Data Sink定义、参数与可落地示例
java·前端·网络
2401_837088504 小时前
stringRedisTemplate.opsForHash().entries
java·redis
lkbhua莱克瓦245 小时前
Java基础——集合进阶3
java·开发语言·笔记
蓝-萧5 小时前
使用Docker构建Node.js应用的详细指南
java·后端
多喝开水少熬夜6 小时前
Trie树相关算法题java实现
java·开发语言·算法
研究司马懿6 小时前
【ETCD】ETCD常用命令
网络·数据库·云原生·oracle·自动化·运维开发·etcd
lkbhua莱克瓦246 小时前
Java基础——集合进阶用到的数据结构知识点1
java·数据结构·笔记·github
音符犹如代码7 小时前
Java并发List实战:CopyOnWriteArrayList原理与ArrayList常见面试题
java·开发语言·面试·list