测试|Junit相关内容

测试|Junit相关内容

文章目录

  • 测试|Junit相关内容
    • 0.Junit说明
    • 1.Junit注解
      • @Test
      • @Disabled
      • @BeforeAll和@AfterAll
      • @BeforeEach和@AfterEach
    • 2.Junit参数化
      • 单参数
      • 多参数(多种/多组)
        • CSV获取参数(支持多种)
        • CSV文件获取参数(支持多种多组)
        • 方法获取参数(支持多种多组)
      • 补充:
    • 3.Junit测试用例执行顺序
      • 手动指定执行顺序(OrderAnnotation)
      • 随机执行顺序(Random)
    • 4.断言
      • 断言相等和断言不相等
      • 断言为空和断言不为空
    • 5.Junit测试套件
    • 常见问题
      • No tests were found

0.Junit说明

Junit是针对Java进行单元测试的一种框架。

注:这里使用的版本是Junit5,前边写的Selenium是Selenium5

1.Junit注解

@Test

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

测试用例跑过了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QN8T6FJ8-1690872547538)(F:\typora插图\image-20230801085852858.png)]

测试用例跑不过:(只跑一个,跑全部的)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4aJA9SZn-1690872547539)(F:\typora插图\image-20230801090615074.png)]

@Disabled

表示忽略当前测试用例,跳过当前测试用例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xrhll6DA-1690872547540)(F:\typora插图\image-20230801091522574.png)]

@BeforeAll和@AfterAll

含义:@BeforeAll:所有测试用例跑之前跑的,@AfterAll:所有测试用例跑完后跑的

说明:

  1. 这两个注解下的方法需要是静态的
  2. 一般初始化放在BeforeAll所在方法中,关闭资源放在AfterAll中
  3. 如果做UI自动化,通常情况下,创建驱动,打开网页,放到BeforeAll中;关闭浏览器放到AfterAll中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZhD92a7H-1690872547540)(F:\typora插图\image-20230801092207325.png)]

@BeforeEach和@AfterEach

@BeforeEach&@AfterEach 和 @BeforeAll和@AfterAll区别:

  1. @BeforeAll是在所有测试用例之前跑一次相应的方法
  2. @BeforeEach是在每个测试用例之前跑一次相应的方法
  3. @AfterEach 是在每个测试用例之后跑一次相应的方法
  4. @AfterAll是在所有测试用例之后跑一次相应的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LsjcYNCc-1690872547541)(F:\typora插图\image-20230801092856948.png)]

2.Junit参数化

不进行参数注册,就往注解下的方法中传参,会报错,这个时候就需要引入相关依赖,进行参数注册

<!-- 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>
    <scope>test</scope>
</dependency>

注意:这里的scope还是需要注释掉

其中@ParameterizedTest表明当前方法为参数化测试方法

单参数

这里的单不是单个,而是单种,只不过这一种参数下可以有一个参数也可以有多个参数

使用方法:在方法上加上两个注解:@ParameterizedTest,@ValueSource(类型名s={xxxxxx})

传参与入参

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z4NCLEmK-1690872547542)(F:\typora插图\image-20230801094303684.png)]

多参数(多种/多组)

其实我觉得这里如果是多个参数,对象包装一下会比较方便即对象单参数获取,如果是多个对象就是对象数组。

CSV获取参数(支持多种)

@CsvSource注释的值是一个字符串数组,每个字符串表示一组参数

每个参数对应一列

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5sX2G93I-1690872547542)(F:\typora插图\image-20230801103650424.png)]

入参的个数大于形参的情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YWF0x5oT-1690872547543)(F:\typora插图\image-20230801103908859.png)]

空字符串的传递:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pWukbtyN-1690872547543)(F:\typora插图\image-20230801104056120.png)]

不同类型的一组参数:(主要看第三种情况)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xIn0Jq3d-1690872547544)(F:\typora插图\image-20230801111457162.png)]

CSV文件获取参数(支持多种多组)

当存在多种参数的时候,使用ValueSource不再方便,使用csv文件更加方便。

1.类型的相同的多组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8OIS4ROt-1690872547544)(F:\typora插图\image-20230801100723844.png)]

2.类型不相等的多组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cw7FaqjQ-1690872547544)(F:\typora插图\image-20230801110745603.png)]

方法获取参数(支持多种多组)

有时参数不能直接生成,我们就需要使用方法获取参数的方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rnM9EIqE-1690872547545)(F:\typora插图\image-20230801101608162.png)]

补充:

在这里插入图片描述

虽然不能完全理解,也不知道到底是哪些类实现了这些接口,但是从这些源码大概能知道单参数的时候起码是数组,一定程度上可以帮助理解。

3.Junit测试用例执行顺序

public class JunitTest01 {
    @Test
    void testB(){
        System.out.println("testB的测试用例");
    }
    @Test
    void test01(){
        System.out.println("test01的测试用例");
    }
    @Test
    void test02(){
        System.out.println("test02的测试用例");
    }
    @Test
    void testA(){
        System.out.println("testA的测试用例");
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8pFPffRq-1690872547545)(F:\typora插图\image-20230801112340280.png)]

为什么执行顺序是固定的?

因为Junit有自己执行顺序的算法,如果想要指定执行顺序需要特殊处理

手动指定执行顺序(OrderAnnotation)

@TestMethodOrder(MethodOrderer .OrderAnnotation.class)
public class JunitTest01 {
    @Order(1)
    @Test
    void testB(){
        System.out.println("testB的测试用例");
    }
    @Order(2)
    @Test
    void test01(){
        System.out.println("test01的测试用例");
    }
    @Order(3)
    @Test
    void test02(){
        System.out.println("test02的测试用例");
    }
    @Order(4)
    @Test
    void testA(){
        System.out.println("testA的测试用例");
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ektrtvMx-1690872547546)(F:\typora插图\image-20230801112819652.png)]

随机执行顺序(Random)

@TestMethodOrder(MethodOrderer.Random.class)
//@TestMethodOrder(MethodOrderer .OrderAnnotation.class)
public class JunitTest01 {
//    @Order(1)
    @Test
    void testB(){
        System.out.println("testB的测试用例");
    }
//    @Order(2)
    @Test
    void test01(){
        System.out.println("test01的测试用例");
    }
//    @Order(3)
    @Test
    void test02(){
        System.out.println("test02的测试用例");
    }
//    @Order(4)
    @Test
    void testA(){
        System.out.println("testA的测试用例");
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j9r3ZhcM-1690872547546)(F:\typora插图\image-20230801113328137.png)]

4.断言

测试用例需要有校验,需要把执行结果和预期结果进行对比。使用assert关键字。

断言相等和断言不相等

断言相等:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6WXYibkj-1690872547547)(F:\typora插图\image-20230801114756634.png)]

断言不相等:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1NnlIvcc-1690872547548)(F:\typora插图\image-20230801114510217.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xMHFDp2p-1690872547548)(F:\typora插图\image-20230801114722836.png)]

当断言数组时,可以使用 assertArrayEquals 方法来比较两个数组是否相等。以下是一个示例:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;

public class ArrayAssertionTest {

    @Test
    public void testArrayEquals() {
        int[] expected = {1, 2, 3, 4};
        int[] actual = {1, 2, 3, 4};

        assertArrayEquals(expected, actual);
    }
}

在上述示例中,assertArrayEquals 方法将会比较两个数组 expectedactual 是否相等。如果数组内容相同,则断言通过,否则断言失败。

断言为空和断言不为空

期待是不为空和期待是空:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XZiq0Xmo-1690872547549)(F:\typora插图\image-20230801115111257.png)]

5.Junit测试套件

测试套件的相关操作需要引入相关依赖,注意,因为这里是在main文件夹下而不是在test文件夹下,所以记得把scope这个标签注释掉

<dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-suite-api</artifactId>
            <version>1.9.1</version>
<!--            <scope>test</scope>-->
        </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>

使用方法有两种,一种是通过class,另外一种是通过包。

对应的注解分别是@SelectClasses,@SelectPackage

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

//通过包
//@SelectPackages(value = {"package01","package02"})
public class RunSuite {

}
public class Test01 {
    @Test
    public void test01(){
        System.out.println("package01-->test01");
    }
}
public class Test01 {
    @Test
    public void test01(){
        System.out.println("package02-->test01");
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d2mj1eiv-1690872547549)(F:\typora插图\image-20230801143349213.png)]

常见问题

No tests were found

原因1:这是@Test注解方法的权限问题,类中方法默认权限是default,

对于@Test注解的方法,我们可以选择写public,也可以选择不写。

如果写成private,当前方法就不能被识别出是一个测试用例了。

解决办法:改成public,或去掉private


原因2:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PTPtCo8o-1690872547549)(F:\typora插图\image-20230801121136525.png)]

同样的标签需要导两次…

<dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</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>
        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
        <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>



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

原因3:方法不能有返回值

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

tomcat限制IP访问

tomcat可以通过增加配置&#xff0c;来对来源ip进行限制&#xff0c;即只允许某些ip访问或禁止某些来源ip访问。 配置路径&#xff1a;server.xml 文件下 标签下。与同级 <Valve className"org.apache.catalina.valves.RemoteAddrValve" allow"192.168.x.x&…

单片机中的通用LED驱动

前言 项目中需要用到很多的LED灯&#xff0c;存在不同的闪烁方式&#xff0c;比如单闪&#xff0c;双闪&#xff0c;快闪&#xff0c;慢闪等等&#xff0c;我需要一个有如下特性的LED驱动 方便的增加不同闪烁模式可以切换闪烁模式增加LED数目不会有太多的改动方便移植&#x…

Jmeter教程

目录 安装与配置 一&#xff1a;下载jdk——配置jdk环境变量 二&#xff1a;下载JMeter——配置环境变量 安装与配置 一&#xff1a;下载jdk——配置jdk环境变量 1.新建环境变量变量名:JAVA_HOME变量值&#xff1a;&#xff08;即JDK的安装路径&#xff09; 2.编辑Path%J…

Agents改变游戏规则,亚马逊云科技生成式AI让基础模型加速工作流

最近&#xff0c;Stability AI正式发布了下一代文生图模型——Stable Diffusion XL 1.0这次的1.0版本是Stability AI的旗舰版生图模型&#xff0c;也是最先进的开源生图模型。 在目前的开放式图像模型中&#xff0c;SDXL 1.0是参数数量最多的。官方表示&#xff0c;这次采用的…

指向字符串常量(字符串右值)的char指针,free的时候为什么会报错?

起因是如下代码 char *p "abc"; free(p);先说结果&#xff0c;这里会报错&#xff0c;会报一个错误如下 一开始还没反应过来&#xff0c;只知道 “test_content” 是一个右值&#xff0c;这是一个指向右值的指针。 但是free的时候为什么会报错呢&#xff1f; 首…

【无网络】win10更新后无法联网,有线无线都无法连接,且打开网络与Internet闪退

win10更新后无法联网&#xff0c;有线无线都无法连接&#xff0c;且打开网络与Internet闪退 法1 重新配置网络法2 更新驱动法3 修改注册表编辑器法4 重装系统 自从昨晚点了更新与重启后&#xff0c;今天电脑就再也不听话了&#xff0c;变着花样地连不上网。 检查路由器&#xf…

JAVA基础原理篇_1.1—— 关于JVM 、JDK以及 JRE

目录 一、关于JVM 、JDK以及 JRE 1. JVM 2. JDK 3. JRE 二、为什么说 Java 语言“编译与解释并存”&#xff1f; 2.2 将高级编程语言按照程序的执行方式分为两种&#xff1a; 2.2 Java的执行过程&#xff1a; 2.3 所以为什么Java语言“编译与解释"共存&#xff1a…

2023华数杯数学建模C题思路 - 母亲身心健康对婴儿成长的影响

# 1 赛题 C 题 母亲身心健康对婴儿成长的影响 母亲是婴儿生命中最重要的人之一&#xff0c;她不仅为婴儿提供营养物质和身体保护&#xff0c; 还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况&#xff0c;如抑郁、焦虑、 压力等&#xff0c;可能会对婴儿的认知、情…

滥⽤合法商⽤程序⽤以进⾏访问控制

背景 攻击对抗日益激烈的局势下&#xff0c;安全产品的围追堵截使得攻击者将目光逐渐转向合法工具的滥用。通过使用具有合法签名的应用程序进行访问控制可以有效提高攻击隐匿性&#xff0c;也对防守及检测提出新的挑战。本文以Vscode、AnyDesk、GotoAssist为例探索攻击者用于访…

网页版Java五子棋项目(一)websocket【服务器给用户端发信息】

网页版Java五子棋项目&#xff08;一&#xff09;websocket【服务器给用户端发信息】 一、为什么要用websocket二、websocket介绍原理解析 三、代码演示1. 创建后端api&#xff08;TestAPI&#xff09;新增知识点&#xff1a;extends TextWebSocketHandler重写各种方法 2. 建立…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)七:工作台界面实现

一、本章内容 本章实现工作台界面相关内容,包括echart框架引入,mock框架引入等,实现工作台界面框架搭建,数据加载。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 基于VUE3+Layui从头搭建通用后台管理系统合集-工作台界面布局实现 五、…

基于VR技术的新型实验室教学模式——VR线上生物实验室

随着科技的发展&#xff0c;虚拟现实技术已经逐渐走进了我们的生活。在教育领域中&#xff0c;虚拟现实技术也被广泛应用于各种学科的教学中。其中&#xff0c;VR线上生物实验室是广州华锐互动开发的&#xff0c;一种基于VR技术的新型教学模式&#xff0c;它能够为学生提供更加…

vCenter Server Appliance(VCSA )7.0 部署指南

部署准备 1、下载VMware-VCSA-all-7.0.0-xxxx.iso文件&#xff0c;用虚拟光驱挂载或者解压运行&#xff0c;本地系统以win10拟光驱挂载为例&#xff0c;运行vcsa-ui-installer/win32/installer.exe。 2、选择“安装”&#xff0c;VCSA 7.0版本同时提供其他选项。 第一阶段 3、…

想参加华为杯竞赛、高教社杯和数学建模国赛的小伙伴看过来

本文目录 ⭐ 赛事介绍⭐ 辅导比赛 ⭐ 赛事介绍 ⭐ 参赛好处 ⭐ 辅导比赛 ⭐ 写在最后 ⭐ 赛事介绍 华为杯全国研究生数学建模竞赛是由华为公司主办的一项面向全国研究生的数学建模竞赛。该竞赛旨在通过实际问题的建模和解决&#xff0c;培养研究生的创新能力和团队合作精神&a…

无涯教程-Lua - 函数声明

函数是一起执行任务的一组语句&#xff0c;您可以将代码分成单独的函数。 Lua语言提供了程序可以调用的许多内置方法。如方法 print()打印在控制台中作为输入传递的参数。 定义函数 Lua编程语言中方法定义的一般形式如下- optional_function_scope function function_name(…

【腾讯云 Cloud Studio 实战训练营】使用Cloud Studio快速构建React完成点餐H5页面还原

文章目录 一、前言二、Cloud Studio 功能介绍三、实验介绍四、实操指导打开官网注册 Cloud Studio 五、开发一个简版的点餐系统安装 antd-mobile安装 Less 六、发布仓库七、开发空间八、总结 一、前言 IDE&#xff08;集成开发环境&#xff09;是一种软件工具&#xff0c;旨在…

C#+WPF上位机开发(模块化+反应式)

在上位机开发领域中&#xff0c;C#与C两种语言是应用最多的两种开发语言&#xff0c;在C语言中&#xff0c;与之搭配的前端框架通常以QT最为常用&#xff0c;而C#语言中&#xff0c;与之搭配的前端框架是Winform和WPF两种框架。今天我们主要讨论一下C#和WPF这一对组合在上位机开…

【计算机网络】数据链路层

文章目录 1. 数据链路层1.1 数据链路层简介1.2 数据链路层做了什么 2. 以太网协议2.1 以太网2.2 以太网帧的格式2.3 MAC地址2.4 MTU 3. 数据跨网络传输的整体过程4. ARP协议4.1 认识ARP协议4.2 ARP协议的格式4.3 ARP协议的工作流程 1. 数据链路层 1.1 数据链路层简介 数据链路…

帕累托森林:IEEE Fellow唐远炎院士出任「儒特科技」首席架构官

导语 「儒特科技」作为一家拥有全球独创性极致化微内核Web引擎架构的前沿科技企业&#xff0c;从成立即受到中科院软件所和工信部的重点孵化及扶持&#xff0c;成长异常迅速。前不久刚正式官方融入中国五大根操作系统体系&#xff0c;加速为其下游上千家相关衍生OS和应用软件企…

shell脚本

#include <stdio.h> #include <string.h> #include <stdlib.h>void fun(int num); int main(int argc, char *argv[]) {int num;printf("请输入一个数&#xff1a;");scanf("%d", &num);fun(num);putchar(10);return 0; }void fun(i…