Junit 快速入门

✏️作者:银河罐头
系列专栏:JavaEE

“种一棵树最好的时间是十年前,其次是现在”

目录

  • 为什么学 Junit
  • Junit 相关技术
    • 注解
      • @Test
      • @Disabled
      • @BeforeAll, @AfterAll
      • @BeforeEach, @AfterEach
    • 参数化
      • 单参数
      • CSV 获取参数
      • 多参数
      • 方法获取参数
    • 测试用例执行顺序
    • 断言
    • 测试套件

以下说明针对版本是 Junit5.

为什么学 Junit

为什么学了 Selenium 还要去学 Junit?

Selenium 是自动化测试框架,Junit 是单元测试框架。

拿着一个技术写自动化测试用例(Selenium3),

拿着一个技术去管理已经编写好了的测试用例(Junit5)

Junit 相关技术

Junit 是针对 Java 的一个单元测试框架。

注解

@Test

表示当前的这个方法是一个测试用例。

添加依赖:


        <dependency>
            <groupId>org.junit.jupitergroupId>
            <artifactId>junit-jupiter-apiartifactId>
            <version>5.9.1version>
        dependency>
        <dependency>
            <groupId>org.junit.jupitergroupId>
            <artifactId>junit-jupiter-paramsartifactId>
            <version>5.9.1version>
        dependency>
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class JunitTest {
    @Test
    public void Test01(){
        System.out.println("这是 JunitTest 里面的 Test01");
    }

    @Test
    void Test02(){
        System.out.println("这是 JunitTest 里面的 Test02");
    }

    @Test
    void Test03(){
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#s-top-left111 > a:nth-child(6)")).click();//点击"图片"
    }
}

在Junit中,@Test注解的方法默认是public的。

@Disabled

忽略测试用例。

Junit 快速入门_第1张图片

@BeforeAll, @AfterAll

@BeforeAll
//在所有的测试用例之前执行
@AfterAll
//在所有的测试用例之后执行

如果做 UI 自动化,把 创建驱动,打开网页这样的操作放在 @BeforeAll里面。

把关闭浏览器这样的操作放在@AfterAll里面。

@BeforeEach, @AfterEach

@BeforeEach
//在每一个测试用例之前执行
@AfterEach
//在每一个测试用例之后执行
import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class JunitTest {
    @Test
    public void Test01(){
        System.out.println("这是 JunitTest 里面的 Test01");
    }

    @Test
    void Test02(){
        System.out.println("这是 JunitTest 里面的 Test02");
    }

    @Disabled
    void Test03(){
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#s-top-left111 > a:nth-child(6)")).click();//点击"图片"
    }

    @BeforeAll
    static void SetUp(){
        System.out.println("这是 BeforeAll 里面的 SetUp");
    }

    @AfterAll
    static void TearDown(){
        System.out.println("这是 AfterAll 里面的 TearDown");
    }

    @BeforeEach
    void beforeEachTest(){
        System.out.println("这是 BeforeEach 里面的 beforeEachTest");
    }

    @AfterEach
    void afterEachTest(){
        System.out.println("这是 AfterEach 里面的 afterEachTest");
    }
}

Junit 快速入门_第2张图片

参数化

单参数

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.ValueSource;

public class JunitTest {

    @Test
    void Test01(){
        System.out.println("这是 JunitTest 里面的 Test01");
    }

    @Test
    void Test02(){
        System.out.println("这是 JunitTest 里面的 Test02");
    }

    @Disabled
    @Test
    void Test03(){
        System.out.println("这是 JunitTest 里面的 Test03");
    }

    @BeforeEach
    void beforeEachTest(){
        System.out.println("这是 BeforeEach 里面的 beforeEachTest");
    }

    @AfterEach
    void afterEachTest(){
        System.out.println("这是 AfterEach 里面的 afterEachTest");
    }


    @ParameterizedTest
    @ValueSource(ints = {1, 2, 3})
    void Test04(int num){
        System.out.println(num);
    }

    @ParameterizedTest
    @ValueSource(strings = {"1", "2", "3"})
    void Test05(String number){
        System.out.println(number);
    }
}

Junit 快速入门_第3张图片

CSV 获取参数

@ParameterizedTest
@CsvFileSource(resources = "test01.csv")
void test06(String name){
    System.out.println(name);
}
张三1,李四1,王五1
张三2,李四2,王五2
张三3,李四3,王五3

Junit 快速入门_第4张图片

@ParameterizedTest
@CsvFileSource(resources = "test01.csv")
void test06(String name1,String name2,String name3){
    System.out.println(name1);
    System.out.println(name2);
    System.out.println(name3);
}
张三1,李四1,王五1
张三2,李四2,王五2
张三3,李四3,王五3

Junit 快速入门_第5张图片

@ParameterizedTest
@CsvSource({"1,2,3"})
void test08(String x){
    System.out.println(x);
}

Junit 快速入门_第6张图片

@ParameterizedTest
    @CsvSource({"1,2,3,''"})
    void test08(String x,String y,int z,String q){
        System.out.println(x);
        System.out.println(y);
        System.out.println(z);
        System.out.println(q);
        System.out.println("==========================");
    }

Junit 快速入门_第7张图片

多参数

方法获取参数

多参数:传不同类型的参数

@ParameterizedTest
@MethodSource("Generator")
void test07(int id, String name){
    System.out.println("id = " + id + ", name = " + name);
}

public static Stream<Arguments> Generator() {
    return Stream.of(Arguments.arguments(1,"张三"),
            Arguments.arguments(2,"李四"),
            Arguments.arguments(3,"王五"));
}

Junit 快速入门_第8张图片

@ParameterizedTest 和 @Test 不能一起使用

测试用例执行顺序

测试用例执行顺序能够人为控制吗?

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest01 {

    @Order(2)
    @Test
    void B(){
        System.out.println("B测试用例");
    }

    @Order(3)
    @Test
    void test01(){
        System.out.println("test01测试用例");
    }

    @Order(4)
    @Test
    void test02(){
        System.out.println("test02测试用例");
    }

    @Order(1)
    @Test
    void A(){
        System.out.println("A测试用例");
    }

}

Junit 快速入门_第9张图片

  • 随机运行方式
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;

//@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@TestMethodOrder(MethodOrderer.Random.class)
public class JunitTest01 {

//    @Order(2)
    @Test
    void B(){
        System.out.println("B测试用例");
    }

//    @Order(3)
    @Test
    void test01(){
        System.out.println("test01测试用例");
    }

//    @Order(4)
    @Test
    void test02(){
        System.out.println("test02测试用例");
    }

//    @Order(1)
    @Test
    void A(){
        System.out.println("A测试用例");
    }

}

Junit 快速入门_第10张图片

断言

断言相等

断言不相等

断言为空

断言不为空

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

public class JunitTest02 {

    @ParameterizedTest
    @ValueSource(ints = {1})
    void Test01(int num){
        System.out.println(num);
        Assertions.assertEquals(2,num);
    }
}

Junit 快速入门_第11张图片

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

public class JunitTest02 {
    @ParameterizedTest
    @ValueSource(ints = {1})
    void Test01(int num){
        System.out.println(num);
//        Assertions.assertEquals(1,num);
//        Assertions.assertNotEquals(2,num);
        String str = "abc";
//        Assertions.assertNull(str);
        Assertions.assertNotNull(str);

    }
}

测试套件

  • 通过 class 运行测试用例
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;

@Suite
@SelectClasses({JunitTest02.class,JunitTest.class,JunitTest01.class})
public class RunSuite {

}

Junit 快速入门_第12张图片

  • 通过包运行测试用例
package Test09;


import org.junit.jupiter.api.Test;

public class Test09 {
    @Test
    void Test01(){
        System.out.println("package Test09 Test01");
    }
}
package Test08;


import org.junit.jupiter.api.Test;

public class Test07 {
    @Test
    void Test007(){
        System.out.println("Test08 package Test007");
    }
}
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;

@Suite
//@SelectClasses({JunitTest02.class,JunitTest.class,JunitTest01.class})
@SelectPackages(value = {"Test09","Test08"})
public class RunSuite {

}

Junit 快速入门_第13张图片

你可能感兴趣的:(软件测试,单元测试)