【软件测试】单元测试工具---Junit详解

1.junit

1.1 junit是什么

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

虽然我们已经学习了selenium测试框架,但是有的时候测试用例很多,我们需要一个测试工具来管理这些测试用例,Junit就是一个很好的管理工具,简单来说Junit是一个针对Java单元测试的框架。Junit由Junit Platform _ Junit Jupiter + junit Vintage3部分组成。

1.2 Junit和Selenium的关系

Junit和Selenium是完全不同的两个东西!!!

在一个灯串上,如果说selenium编写的测试用例是一个小灯泡,那么junit就是把它们串起来的线。junit是用来管理selenium的测试用例的。

2.junit技术

2.0 前置工作

在pom.xml文件中添加依赖

引入selenium:

java 复制代码
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.7.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>

参数化:

java 复制代码
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.9.2</version>
        </dependency>       

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.9.2</version>
        </dependency>

测试套件:

java 复制代码
        <!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite -->
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-suite</artifactId>
            <version>1.9.1</version>
        </dependency>
      
        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.9.1</version>
            <scope>test</scope>
        </dependency>

2.1 junit常用注解

@Test

@Test表示当前的方法是一个测试用例

使用:

@Test

void + 方法名(){}

举例:

java 复制代码
    //表示当前的方法是一个测试用例
    @Test
    void Test01(){
        // 创建了一个options对象,用来给请求设置一些参数
        ChromeOptions options = new ChromeOptions();
        // 允许所有的请求
        options.addArguments("--remote-allow-origins=*");
        //设置驱动路径
        System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");
        // 创建了一个驱动
        WebDriver webDriver = new ChromeDriver(options);
        //打开百度
        webDriver.get("https://www.baidu.com/");
    }

@BeforeAll 和 @AfterAll

这两个注解在整个测试的时候会执行一次。

复制代码
@BeforeAll表示在当前类所有测试用例执行之前运行
@AfterAll表示在当前类所有测试用例执行之后运行
并且这两个方法都有static修饰,都只执行一次

使用:

@BeforeAll

static void 方法名(){}

举例:

java 复制代码
	//当前类里面所有的测试用例执行之前执行这个方法
    @BeforeAll
    static void SetUp(){
        System.out.println("开始执行@BeforeAll修饰的方法");
    }

使用:

@AfterAll

static void 方法名(){}

举例:

java 复制代码
	//当前类里面所有的测试用例执行之后执行这个方法
    @AfterAll
    static void TearDown(){
        System.out.println("开始执行@AfterAll对应的方法");
    }

运行结果:

@BeforeEach 和 @AfterEach

这两个注解会在每一个测试用例执行的时候都执行一次。

  • @BeforeEach表示在每个测试方法执行前运行
  • @AfterEach表示在每个测试方法执行后运行

举例:

java 复制代码
    @BeforeEach
    void BeforeTest(){
        System.out.println("这是一个@BeforeEach注解");
    }
    @AfterEach
    void AfterTest(){
        System.out.println("这是一个@AfterEach注解");
    }

结果:

@Disabled

作用:忽略当前的测试用例

举例:

java 复制代码
    //忽略当前的测试用例
    @Disabled
    //表示当前的方法是一个测试用例
    @Test
    void Test01(){
        // 创建了一个options对象,用来给请求设置一些参数
        ChromeOptions options = new ChromeOptions();
        // 允许所有的请求
        options.addArguments("--remote-allow-origins=*");
        //设置驱动路径
        System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");
        // 创建了一个驱动
        WebDriver webDriver = new ChromeDriver(options);
        //打开百度
        webDriver.get("https://www.baidu.com/");
    }

结果:并没有执行这个测试用例

2.2 junit测试用例执行顺序

有人觉得junit的测试顺序是从上到下的,是这样吗?

先来看一个示例:

java 复制代码
    @Test
    void Test06(){
        System.out.println("这是测试用例5");
    }

    @Test
    void Test05(){
        System.out.println("这是测试用例4");
    }


    @Test
    void Test04(){
        System.out.println("这是测试用例3");
    }

    @Test
    void Test02(){
        System.out.println("这是测试用例1");
    }

    @Test
    void Test03(){
        System.out.println("这是测试用例2");
    }

结果:

以上结果表明了它不是按照从上到下执行的测试用例。

指定顺序执行

使用@TestMethodOrder(MethodOrderer.OrderAnnotation.class)+ @Order(数字)注解顺序执行测试用例。

举例:

java 复制代码
//按照指定顺序执行测试用例
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest {
    @Order(1)
    @Test
    void Test06(){
        System.out.println("这是测试用例5");
    }
    @Order(2)
    @Test
    void Test05(){
        System.out.println("这是测试用例4");
    }
    @Order(3)
    @Test
    void Test04(){
        System.out.println("这是测试用例3");
    }
    @Order(4)
    @Test
    void Test02(){
        System.out.println("这是测试用例1");
    }
    @Order(5)
    @Test
    void Test03(){
        System.out.println("这是测试用例2");
    }
}

结果:

是按照order里面的顺序执行的。

随机执行

使用@TestMethodOrder(MethodOrderer.Random.class)随机执行测试用例。

举例:

java 复制代码
//按照随机顺序执行测试用例
@TestMethodOrder(MethodOrderer.Random.class)
public class JunitTest {
    @Order(1)
    @Test
    void Test06(){
        System.out.println("这是测试用例5");
    }
    @Order(2)
    @Test
    void Test05(){
        System.out.println("这是测试用例4");
    }
    @Order(3)
    @Test
    void Test04(){
        System.out.println("这是测试用例3");
    }
    @Order(4)
    @Test
    void Test02(){
        System.out.println("这是测试用例1");
    }
    @Order(5)
    @Test
    void Test03(){
        System.out.println("这是测试用例2");
    }
}

2.3 参数化测试

测试方法一般需要传参数。

单参数

使用 @ParameterizedTest + @ValueSource() 配合传递单参数

@ParameterizedTest : 注册参数

!!!注意:这两个注解不能和@Test一起使用,并且只能传一种类型的参数

示例:

java 复制代码
    @ParameterizedTest  //注册
    @ValueSource(strings = {"1","2","3"})
    void Test07(String str){
        System.out.println(str);
    }

结果:

多参数

上面只可以传入一种类型的参数,所以如果我们需要传入多种类型的参数,就可以使用csv 。

CSV

①直接传参数:使用@ParameterizedTest + @CsvSource()配合

举例:

java 复制代码
    @ParameterizedTest
    @CsvSource({"1,2","3,4"})
    void Test08(String str,int num){
        System.out.println(str+" "+num);
    }

结果:

②传递文件:使用@ParameterizedTest+ @CsvFileSource(resources = "文件名.csv")配合

!!!注意:文件必须是.csv类型

示例:

java 复制代码
    @ParameterizedTest
    @CsvFileSource(resources = "test01.csv")
    void Test09(int id,String name){
        System.out.println("id="+id+",name="+name);
    }

test01.csv文件内容:

java 复制代码
1,温温
2,苏苏
3,怜怜

结果:

方法传参

使用@ParameterizedTest + @MethodSource("方法名") 传入一个方法

示例:

java 复制代码
    @ParameterizedTest  //注册参数
    @MethodSource("Generator")  //注册的参数是什么
    void Test10(String num,String name){
        System.out.println(num+" "+name);
    }

Generator方法代码:

java 复制代码
	public static Stream<Arguments> Generator() {
        return Stream.of(Arguments.arguments("1,温温","2,苏苏"));
    }

结果:

2.4 断言

在软件测试中,断言(Assertion)是一种用于检查程序或系统在执行某些操作或运行某些代码后是否符合预期行为的技术手段。在测试中,断言通常用于验证代码的正确性,确保代码在满足特定条件时会产生预期的结果。

示例:

java 复制代码
    @ParameterizedTest
    @ValueSource(ints = {10})
    void Test11(int num){
        //断言相等
        Assertions.assertEquals(num,10);
        //断言不相等
        Assertions.assertNotEquals(num,11);
    }
java 复制代码
    @ParameterizedTest
    @ValueSource(strings = {"1"})
    void Test11(int num){
        //断言为空
        Assertions.assertNull(num);
        //断言不为空
        Assertions.assertNotNull(num);
    }

2.5 测试套件

测试套件(test suite)有时也称为验证套件(validation suite),是许多测试用例的集合,测试用例可用来测试一程式是否正确工作,测试套件包括许多测试用例,一般也会有针对测试用例及其测试目的的详细说明,在进行测试时的系统组态资讯以及测试前需进行的步骤。

通过测试套件,将服务于同一个测试目的或同一运行环境下的一系列测试用例有机的组合起来。测试套件是按照测试计划所定义的各个阶段的测试目标决定的,即先有测试计划,后面才有测试套件。

例如:此时有三个类的测试用例都需要测试。

通过测试套件全部测试:

方法①:在括号中写入测试类

java 复制代码
@Suite
@SelectClasses({JunitTest.class, JunitTest02.class})
public class RunSuite {
}

方法②:根据指定的包来运行多个测试用例

java 复制代码
@Suite
@SelectPackages({"org.example.junit01","org.example.junit"})
public class RunSuit {
}
相关推荐
唐青枫几秒前
Java Gradle 实战指南:从 Wrapper、Kotlin DSL 到 Spring Boot 多模块构建
java·kotlin·gradle
带刺的坐椅3 分钟前
Solon TeamAgent 协作协议:从 SEQUENTIAL 流水线到 HIERARCHICAL 主管团队
java·ai·llm·agent·solon
wuqingshun31415911 分钟前
SpringBoot是如何实现自动配置的
java·spring boot·后端
用户0537040314314 分钟前
我的学习记录泛型
java
zhouhui00116 分钟前
AI帮我写了个Spring Boot校验,线上漏掉了这组边界条件
java·spring boot·redis·ai编程
JRedisX23 分钟前
Java从零手写企业级内存数据库
java
萧瑟余晖25 分钟前
JDK 20 新特性详解
java·开发语言
hdsoft_huge28 分钟前
SpringBoot系列17:日志体系Logback配置,日志分割、脱敏、异常堆栈收集规范(生产级落地)
java·spring boot·logback
吃饱了得干活30 分钟前
扫码登录如何实现?从原理到实战
java·spring boot·redis
JRedisX33 分钟前
JRedisX 项目骨架搭建指南 从零开始 — 手把手教你搭
java