【软件测试】JUnit详解

news2024/11/25 20:49:37

文章目录

  • 一. Junit是什么?
  • 二.Junit中常见的注解
    • 1. @Test
    • 2. @BeforeAll & @AfterAll
    • 3. @BeforeEach & @AfterEach
    • 4. @ParameterizedTest参数化
    • 5. @Disabled
    • 6. @Order
  • 三. 测试套件
    • 1. 通过class运行测试用例
    • 2. 通过包运行测试用例
  • 四. 断言

一. Junit是什么?

JUnit是一个用于编写和运行Java程序单元测试的开源框架
它提供了一组注解和断言方法,以及用于执行测试的测试运行器。通过使用JUnit,开发人员可以轻松地编写自动化测试用例,验证代码的正确性,并且能够快速地发现和修复bug。JUnit的使用可以提高代码的质量和可维护性,同时也有助于进行持续集成和持续测试。它被广泛应用在Java开发领域中,成为了标准的单元测试框架之一。

为什么学了Selenium还需要学习Junit?
Selenium是自动化测试框架;Junit是单元测试框架.
拿着一个技术写自动化测试用例(Selenium3)
拿着一个技术管理已经编写好的测试用例(Junit5)

二.Junit中常见的注解

我们本节博客所学习的是Junit5,Junit5中的注解如下:

注解说明
@Test标识单元测试方法。
@ParameterizedTest标识参数化测试方法。
@RepeatedTest标识可重复执行的测试方法。
@TestFactory标识动态测试方法,用于生成测试用例。
@BeforeEach在每个测试方法之前执行。
@AfterEach在每个测试方法之后执行。
@BeforeAll在所有测试方法之前执行,只会执行一次。
@AfterAll在所有测试方法之后执行,只会执行一次。
@DisplayName设置测试类或测试方法的显示名称。
@Disabled标识禁用的测试类或测试方法。
@Nested声明内部测试类。
@Tag为测试类或测试方法添加标签,用于分组和过滤。
@Timeout设置测试方法执行超时时间。
@ExtendWith注册扩展,用于扩展JUnit的功能。
@RegisterExtension注册扩展实例,用于扩展JUnit的功能。

上述表格中,其中黑体为常用的注解,也是接下来主要介绍说明的注解.

想要使用Junit5的框架,我们首先要从中央仓库中引入Maven依赖.代码如下所示:

<dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.9.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-suite</artifactId>
            <version>1.9.1</version>
            <scope>test</scope>
        </dependency>

        <!-- 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>

1. @Test

@Test:用于标识单元测试方法。

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

在这里插入图片描述

2. @BeforeAll & @AfterAll

@BeforeAll:在所有测试方法之前执行,只会执行一次。
@AfterAll:在所有测试方法之后执行,只会执行一次。

    @Test
    void Test01() {
        System.out.println("这是JunitTest里面的Test01");
    }
    @Test
    void Test02() {
        System.out.println("这是JunitTest里面的Test02");
    }
    @BeforeAll
    static void SetUp() {
        System.out.println("这是BeforeAll里面的语句");
    }

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

在这里插入图片描述

3. @BeforeEach & @AfterEach

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

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

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

在这里插入图片描述

4. @ParameterizedTest参数化

@ParameterizedTest: 标识参数化测试方法。

  1. 单参数

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

    在这里插入图片描述

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

    如果想要打印空格可以用空字符串
    在这里插入图片描述

  2. CSV获取参数

        @ParameterizedTest
        @CsvFileSource(resources = "test01.csv")
        void Test06(String name) {
            System.out.println(name);
        }
    

    resource:test01.csv:

    张三1,李四1,王五1
    张三2,李四2,王五2
    张三3,李四31
    

    在这里插入图片描述

  3. 方法获取参数

        public static Stream<Arguments> Generator() {
            return Stream.of(Arguments.arguments(1, "张三"),
                    Arguments.arguments(2, "李四"),
                    Arguments.arguments(3, "王五")
            );
        }	
        @ParameterizedTest
        @MethodSource("Generator")
        void Test07(int num, String name) {
            System.out.println(num + ":" + name);
        }
    

    在这里插入图片描述

5. @Disabled

@Disabled: 标识禁用的测试类或测试方法。

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

执行所有测试用例发现:
在这里插入图片描述
Test03未被执行.

6. @Order

@Order 注解是 JUnit 5 中用来指定测试方法执行的顺序的注解。通过给测试方法添加 @Order 注解并指定一个整数值,可以确保测试方法按照指定的顺序执行。

import org.junit.jupiter.api.*;
@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(1)
    @Test
    void A() {
        System.out.println("A测试用例");
    }

    @Order(4)
    @Test
    void Test02() {
        System.out.println("被忽略的测试用例");
    }

}

在这里插入图片描述
可以看到,执行顺序使我们所手动指定的顺序.
上述例子中,@TestMethodOrder(MethodOrderer.OrderAnnotation.class) 注解指定了使用 OrderAnnotation 来排序测试方法。然后,每个测试方法都使用 @Order 注解指定了它们应该执行的顺序。
需要注意的是:测试方法的默认执行顺序是不确定的.因此使用 @Order 注解可以提供一致和可预测的执行顺序。

三. 测试套件

测试套件是一种组织和执行一组测试的方式。在JUnit中,可以使用 @RunWith 注解和 Suite 类来创建测试套件。

1. 通过class运行测试用例

	@Suite
	//通过class测试用例运行
	@SelectClasses({JunitTest03.class, JunitTest.class, JunitTest01.class})
	public class RunSuite {
	}

在这里插入图片描述

2. 通过包运行测试用例

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;

@Suite
@SelectPackages(value = {"Test09", "Test08"})
public class RunSuite {
}

package Test08;

import org.junit.jupiter.api.Test;

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

import org.junit.jupiter.api.Test;

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

在这里插入图片描述

四. 断言

JUnit 5 中,断言方法位于 org.junit.jupiter.api.Assertions 类中。

使用断言可以在测试中验证预期结果是否与实际结果相符。如果断言失败,则测试将被标记为失败,并提供有关错误的详细信息。这有助于快速定位和修复问题。

断言方法说明
assertEquals(expected, actual)验证两个对象是否相等。可以用于比较基本数据类型、对象和数组。
assertTrue(condition)验证条件是否为真。如果条件为真,则测试通过;否则,测试失败。
assertFalse(condition)验证条件是否为假。如果条件为假,则测试通过;否则,测试失败。
assertNull(actual)验证对象是否为 null。如果对象为 null,则测试通过;否则,测试失败。
assertNotNull(actual)验证对象是否不为 null。如果对象不为 null,则测试通过;否则,测试失败。
assertSame(expected, actual)验证两个对象引用是否相同。即判断两个对象是否指向同一个内存地址。
assertNotSame(unexpected, actual)验证两个对象引用是否不相同。
assertArrayEquals(expectedArray, actualArray)验证两个数组是否相等。用于比较数组的元素是否相等。
assertThrows(expectedType, executable)验证代码块是否抛出了特定类型的异常。
assertTimeout(duration, executable)验证代码块是否在指定的时间内执行完成,超过指定时间则测试失败。
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class MyTest {

    @Test
    public void test() {
        String str = "Hello, World!";
        int number = 42;
        boolean condition = true;

        assertEquals("Hello, World!", str);
        assertTrue(number > 0);
        assertFalse(condition);
        assertNull(null);
        assertNotNull(str);
    }
}

上述例子中.assertFalse(condition);即测试中验证预期结果与实际结果不相符.
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1070930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3D打印机升级killpper

本来是想整台新机的&#xff0c;但是想想老机器4max也不能就此放弃&#xff0c;看了看视频&#xff0c;改装升级似乎也没有那么难。然后就是换了喷头、皮带、轴承、挤出机、打印平台、加热板等等。做了干燥箱&#xff0c;改装挤出机结构来适配&#xff0c;风扇口也一并搞掉&…

Astory 访谈|了解「非常律师禹英禑」背后的故事

请先简单做个自我介绍吧&#xff1f; 大家好&#xff0c;我是 Astory 的首席制作人 Younghwa Lee&#xff0c;负责监督《非常律师禹英禑》的制作。很高兴认识你。 是什么启发了你创造了《非常律师禹英禑》系列&#xff1f; 作为制片人&#xff0c;我非常感谢全球粉丝对《非常…

NVIDIA ORIN GPIO

NVIDIA ORIN GPIO 说明 1.Identifying the GPIO Number If you designed your own carrier board, to translate from SOM connector pins to actual GPIO numbers, you must understand the following GPIO mapping formula. The translated GPIO numbers can be controlled …

2023软件测试面试题大全

1.B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行&#xff0c;可以实现跨平台&#xff0c;客户端零维护&#xff0c;维护成本低&#xff0c;但是个性化能力低&#xff0c;响应速度较慢 C/S响应速度快&#xff0c;安全性强&#xff0c;一般应用于局域网中&#xff0c;…

Bootstrap元素的边框样式和设置

目录 01-添加完整边框、上边框、右边框、下边框、左边框02-不要整个边框、上边框、右边框、下边框、左边框03-指定边框的颜色04-设置圆角边框和圆形边框 01-添加完整边框、上边框、右边框、下边框、左边框 示例代码如下&#xff1a; <!DOCTYPE html> <html> <…

关于 Vite 的浅显学习 - 总览

大部分内容来源于vite官网&#xff0c;部分内容来自于 自己测试和总结 Vite 官方中文文档 总览 Vite 是一种新型前端构建工具&#xff0c;能够显著提升前端开发体验。&#xff08;vue 官网打造的&#xff0c;旧一代是 webpack&#xff09; 它主要由两部分组成&#xff1a; 一…

ASPICE标准快速掌握「4.2. 过程能力等级与过程属性」

过程能力等级 0 级:不完整的过程 过程未实施、或未能实现其过程目的。在这个等级只有很少或没有系统化实现过程目的的证据。 过程能力等级 1 级:已执行的过程 已执行的过程实现其过程目的。以下过程属性证明这个等级的实现: PA 1.1 过程实施过程属性 <成就> 过程…

【Redis】Redis中的数据结构和内部编码

Redis中的数据结构和内部编码 type命令实际返回的就是当前键的数据结构类型&#xff0c;它们分别是&#xff1a;string&#xff08;字符串&#xff09;、list&#xff08;列表&#xff09;、hash&#xff08;哈希&#xff09;、set&#xff08;集合&#xff09;、zset&#xf…

文件批量改名:大量文件重命名,不再烦恼

在日常生活和工作中&#xff0c;我们常常会遇到大量的文件需要重命名的情况。例如&#xff0c;整理照片、整理网络下载图片、整理音频和视频文件等等。如果一个一个地手动修改文件名&#xff0c;不仅费时费力&#xff0c;而且容易出错。那么&#xff0c;如何快速高效地批量修改…

Shell 解释器,帮你解析一条Shell语句到底是什么意思

使用Linux系统的朋友&#xff0c;几乎每天都在使用Shell命令&#xff0c;比如 # 新建一个.sh脚本&#xff1a; vim 脚本名.sh # 运行一个.sh脚本&#xff1a; ./脚本名.sh ​​​​​​​Shell语句是一种用于与计算机操作系统交互的文本命令。Shell是计算机操作系统的命令行…

如何在逍遥模拟器上加载Magisk模块

本机环境&#xff1a;win7 64位&#xff0c;Python3.8.10&#xff0c;逍遥模拟器版本9.0.6&#xff0c;安卓版本9&#xff08;手机里的设置-系统-关于平板电脑-Android版本&#xff09;。 已经安装了Magsik&#xff0c;现在需要加载一个新模块。 一、电脑上下载需要安装的模块…

15.(开发工具篇vscode)vscode保存操作后,代码发生变化

问题描述&#xff1a;:visible.sync会自动变成v-model:visible 解决方案&#xff1a; 一&#xff1a;打开设置 二&#xff1a;关键字&#xff08;保存&#xff09;&#xff0c;打开settings.json 三&#xff1a;修改配置项source.fixAll.eslint为false

漏洞复现--Juniper Networks Junos OS EX远程命令执行漏洞(CVE-2023-36845)

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

学习记录——StyleGAN2+SA-UNet

SA-UNet for Retinal Vessel improvment using StyleGAN2 作者提出了一种改进视网膜图像分割的方法,通过创建图像及其相应的分割地图来实现。作者的解决方案包括使用DRIVE数据集1对StylGAN2进行训练,并使用目前在分割DRIVE图像方面取得最先进结果的SA-UNet模型对新合成的图像…

软件测试面试常常遇到的6大“套路”!

前言 面试中&#xff0c;如何回答HR提出的问题很大程度上决定了面试能不能成功。 下面是软件测试人员在面试过程中经常被问到的6个问题&#xff0c;告诉你怎么回答才不会被面试官套路.. 01、请你做一个自我介绍 误区&#xff1a; 一般人回答这个问题过于平常&#xff0c;只…

(2021|NIPS,VQ-VAE,精度瓶颈松弛,三明治层归一化,CapLoss)CogView:通过转换器掌握文本到图像的生成

CogView: Mastering Text-to-Image Generation via Transformers 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 0. 摘要 通用领域中的文本到图像生成长期以来一直是一个悬而未决的问题&#…

接口测试及常用接口测试工具

首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能给你…

c语言动态内存分布

前言&#xff1a; 随着我们深入的学习c语言&#xff0c;之前使用的静态内存分配已经难以满足我们的实际需求。比如前面我们的通讯录功能的实现&#xff0c;如果只是静态内存分配&#xff0c;那么也就意味着程序开始的内存分配大小就是固定的&#xff0c;应该开多大的空间呢&am…

重启Oracle数据库命令列表逐步操作

&#x1f495;欢迎来到 Oracle 数据库重启教程&#x1f495; &#x1f3af;第一步&#xff1a;以 oracle 身份登录数据库&#x1f3af; su - oracle &#xff08;如果是WINdows系统的CMD窗口&#xff09;直接从第二步开始&#xff01; &#x1f3af;第二步&#xff1a;进入…

【MySQL】视图特性

目录 MySQL视图特性 基本使用 准备测试表 创建视图 修改视图影响基表 修改基表影响视图 删除视图 视图规则和限制 MySQL视图特性 视图的概念 视图是一个虚拟表&#xff0c;其内容由查询定义&#xff0c;同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。…