Junit 单元测试框架(简单使用)

news2024/11/27 15:41:26

目录

一、注解

1. @Test

2. @BeforeEach 和 @BeforeAll

3. @AfterEach 和 @AfterAll

二、断言

1. Assertions类

1.1 assertEquals 和 assertNotEquals

1.2 assertTrue 和 assertFalse 

1.3 assertNull 和 assertNotNull

三、用例执行顺序

1. 方法的排序 —— @Order

四、测试套件Suit

1. 指定类,添加到套件中并执行

2.  指定包,添加到套件中并执行

 五、参数化

1. 单参数

2. 多参数

2.1 参数为数据

2.2 参数为文件

3. 动态参数

3.1 单参数

3.2 多参数


        Junit 是一个开源的Java语言的单元测试框架。如果说要实现一个灯泡,那么selenium 就是灯泡,而Juniit就是电源。

引入相关依赖:

    <dependencies>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-commons</artifactId>
            <version>1.8.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-reporting</artifactId>
            <version>1.8.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

一、注解

1. @Test

        表示一个方法/用例。使用Test注解后,就不需要在另外创建类来启动用例了。

    @Test
    public void Test1() {
        //创建driver驱动对象
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);

        driver.get("https://baidu.com");
        driver.findElement(By.cssSelector("#kw")).sendKeys("selenium");
        driver.quit();
    }

当有多个方法时,可以显示出来哪个通过了哪个没有通过。

    @Test
    public void Test1() {
        //创建driver驱动对象
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);

        driver.get("https://baidu.com");
        driver.findElement(By.cssSelector("#kw")).sendKeys("selenium");
        driver.quit();
    }
    @Test
    public void Test2() {
        //创建driver驱动对象
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);

        driver.findElement(By.cssSelector("#kw")).sendKeys("selenium");
    }

 

2. @BeforeEach 和 @BeforeAll

        表示被注解的方法应该在其他方法之前。

@BeforeEach:表示被注解的反复在其他方法之前都要执行一遍;

@BeforeAll:表示被注解的方法在其他方法之前只用执行一遍。(该方法必须加上@Test,同时必须是一个静态方法static)

    @Test
    void Test01() {
        System.out.println("01");
    }
    @Test
    void Test02() {
        System.out.println("02");
    }
    @BeforeEach
    void Test03() {
        System.out.println("03");
    }

    @Test
    void Test01() {
        System.out.println("01");
    }
    @Test
    void Test02() {
        System.out.println("02");
    }
    @BeforeAll
    @Test
    static void Test03() {
        System.out.println("03");
    }

3. @AfterEach 和 @AfterAll

        表示被注解的方法应该在其他方法之后。

@AfterEach:其他的方法执行后,都要执行一遍

@AfterAll:其他所有的方法执行之后只需要执行一遍。(必须是静态方法static)

二、断言

1. Assertions类

1.1 assertEquals 和 assertNotEquals

asserEquals( expect, actual ):校验期望值和实际值是否匹配。

assertNotEquals( expect, sctual ):校验期望值和实际值是否不匹配。

    @Test
    void test1() {
        //创建driver驱动对象
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);

        driver.get("https://baidu.com");
        String text = driver.findElement(By.cssSelector("#su")).getAttribute("value");
        Assertions.assertEquals("百度一下",text);
        driver.quit();
    }

1.2 assertTrue 和 assertFalse 

assertTure( 表达式 ):表达式为真则通过。

assertFalse( 表达式 ):表达式为假则通过。

    @Test
    void test2() {
        Assertions.assertTrue(1 == 1);
    }

1.3 assertNull 和 assertNotNull

asserNull(a):a为空则通过。

assertNotNull(a): a不为空则通过。

三、用例执行顺序

        Junit默认的执行顺序是不确定的,但是我们可以使用Junit里提供的方法去规定用例的执行顺序。

注意:

        因为用例之间是存在关联关系的,因此就需要手动的指定用例的顺序。但是在编写测试用例的时候,要保持用例的独立性,避免关联关系的出现。

1. 方法的排序 —— @Order

通过注解

@TestMethodOrder(MethodOrder.OrderAnnotation.class):表示通过方法排序

@Order(i):传入每个方法的顺序

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class Test03 {
    @Test
    @Order(1)
    void yi() {
        System.out.println("111");
    }
    @Test
    @Order(2)
    void er() {
        System.out.println("222");
    }
    @Test
    @Order(3)
    void san() {
        System.out.println("333");
    }
}

 

四、测试套件Suit

        一个包下有很多个类的用例,要将所有的用例都执行起来就要用到测试套件@Suite。

1. 指定类,添加到套件中并执行

@Suite
//选择指定文件来添加到套件中执行
@SelectClasses({Test03.class, AsserTest.class})
public class RunAllSuite {
}

2.  指定包,添加到套件中并执行

前提:所有的文件都要以Test、tests命名,并且用例都要加上@Test。

@Suite
//选择指定的包添加到套件中执行
@SeleceClasses("test1")
public class RunAllSuite {
}

 五、参数化

@Parameterizedtest 标注方法类型为参数化,同时要搭配参数的来源。不需要再添加@Test注解。否则会再执行一遍。

1. 单参数

@ValueSource( 类型={参数1,参数2,参数3......} )

这里的类型是指原生类型:ints、floats、strings...

    @ParameterizedTest
    @ValueSource(strings = {"丫丫","糯糯","小狗"})
    void test01(String name) {
        System.out.println(name);
    }

 

2. 多参数

2.1 参数为数据

@CsvSource( value = { "丫丫,2" , "糯糯,1" ......} )

默认参数里面使用逗号分隔,也可以使用 delimiterString = “” 来进行设置。

若参数中包含都要,就使用单引号作为转义字符。

    @ParameterizedTest
    @CsvSource(value = {"丫丫,2","糯糯,1"})
    void test02(String name,int i) {
        System.out.println("名字:" + name + "  年龄:" + i);
    }

2.2 参数为文件

当要输入的参数过多,在代码中不美观,就可以使用第三方来进行添加。借助文件注入的方式来添加。

@CsvFileSource( resources = " csv文件 " )

指定的文件路径为当前项目下,resources文件中的 csv文件。

如果要使用本地任意文件夹下的文件:

@CsvFileSource( files = " 文件路径 " )

    @ParameterizedTest
    @CsvFileSource(resources = "/my.csv")
    void test03(String name,int i) {
        System.out.println("名字:" + name + "  年龄:" + i);
    }

3. 动态参数

3.1 单参数

@MethodSources(" ") 参数为数据来源的方法。

注意:参数中的方法必须是静态方法。

@MethodSources

如果参数中为空,就自动找与其同名的静态方法。 

    @ParameterizedTest
    @MethodSource("MethoDemo")
    void test04(String s) {
        System.out.println(s);
    }
//返回值是一个Stream流
    static Stream<String> MethoDemo() {
        return Stream.of("yyy","sss");
    }

3.2 多参数

        使用 Arguments类型。

    @ParameterizedTest
    @MethodSource
    void test05(String name,int i) {
        System.out.println("名字:" + name + "  年龄:" + i);
    }
    static Stream<Arguments> test05() {
        return Stream.of(Arguments.arguments("yaya",22),
                Arguments.arguments("nuonuo",2));
    }

 

 

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

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

相关文章

人工智能轨道交通行业周刊-第44期(2023.5.8-5.14)

本期关键词&#xff1a;智能列控、苏州城轨智慧大脑、智慧乘务系统、深铁智慧运维、铁路遥感、3D视觉 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通R…

【C++入门攻略】和【编程常见问题】

常见问题 vsstudio快捷键 快速注释组合键 ctrlk ctrlc 取消注释快捷键 ctrlk ctrl u 支持垃圾回收机制 大多数面向对象编程语言具有垃圾回收机制。早期的C语言不具备垃圾回收机制&#xff0c;这意味着申请的内存资源在使用完成后&#xff0c;需要程序员自己释放。直到C11标…

1066 Root of AVL Tree(51行代码+超详细注释)

分数 25 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebala…

孙鑫VC++第一章 Windows程序内部运行机制

目录 1.1 API和SDK 1.2 窗口和句柄 1.3 消息和队列 1.4 WinMain 1.4.1 WinMain函数的定义 1.4.2 窗口的创建 1.4.3 消息循环 1.4.4 窗口过程函数 1.1 API和SDK API:Windows操作系统提供给应用程序编程的接口。 SDK&#xff08;软件开发包&#xff09;:用于开发的所有资…

swing列表框_强制存储的DefaultListModel和DefaultComboBoxModel

package com.aynu.layout;import javax.swing.*; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;public class DefaultListModelTest {JFrame jf new JFrame("测试DefaultListModel");JTextField bookNa…

JVM学习(二)

1. JVM 运行时内存 Java 堆从 GC 的角度还可以细分为: 新生代 ( Eden 区 、 From Survivor 区 和 To Survivor 区 )和 老年 代。 1.1. 新生代 是用来存放新生的对象。一般占据堆的 1/3 空间。由于频繁创建对象&#xff0c;所以新生代会频繁触发 MinorGC 进行垃圾回收。新…

《如何评价北化面向对象江某英之我是传奇》

点进来的都是家人了&#xff0c;来&#xff0c;今天带你们一起速通江某英的面向对象。 首先&#xff0c;我们先看一下江某英的教学安排&#xff0c;所谓知己知彼&#xff0c;百战不殆。 一共是九个章节&#xff0c;但是最后一个总复习没讲&#xff0c;这不是为难我们吗&#x…

【移动端网页布局】Flex 弹性布局案例 ② ( 顶部固定定位搜索栏 | 固定定位盒子居中对齐 | 二倍精灵图设置 | CSS3 中的垂直居中对齐 )

文章目录 一、顶部固定定位搜索栏1、固定定位盒子居中对齐2、设置最大宽度和最小宽度3、使用 Flex 弹性布局管理宽度4、二倍精灵图设置5、CSS3 中的垂直居中对齐 - 行高 内容高度 ( 总高度 - 边框高度 - 内边距高度 ) 二、代码示例1、HTML 标签结构2、CSS 样式3、展示效果 一、…

Pytroch nn.Unfold() 与 nn.Fold()图码详解

文章目录 Unfold()与Fold()的用途nn.Unfold()Unfold()与Fold() 变化模式图解 nn.Fold()单通道 滑动窗口无重叠模拟图片数据&#xff08;b,3,9,9&#xff09;&#xff0c;通道数 C 为3&#xff0c;滑动窗口无重叠。单通道 滑动窗口有重叠。 卷积等价于&#xff1a;Unfold Matri…

国民技术N32G430开发笔记(20)- FreeRTOS的移植

FreeRTOS的移植 1、官网下载FreeRTOSv202212.01&#xff0c;搜索官网下载即可。 2、新建一个FreeRTOSDemo的工程&#xff0c;可以把之前的工程中的Bootloader工程复制一份。 3、打开下载的freertos代码将相应代码移植到我们的工程中。 protable文件夹&#xff0c;因为是gcc环…

ChatGPT国内镜像网站集合

ChatGPT是一个基于人工智能的聊天机器人&#xff0c;它可以与用户进行自然语言交互。ChatGPT使用了最新的自然语言处理技术&#xff0c;包括深度学习和神经网络&#xff0c;以便更好地理解用户的意图和回答用户的问题。 ChatGPT可以回答各种问题&#xff0c;包括但不限于常见问…

RabbitMQ如何避免丢失消息

目录标题 消息丢失1. 生产者生产消息到RabbitMQ Server 消息丢失场景1. 网络问题2. 代码层面&#xff0c;配置层面&#xff0c;考虑不全导致消息丢失解决方案&#xff1a;开启confirm模式 2. 队列本身可能丢失消息1. 消息未完全持久化&#xff0c;当机器重启后&#xff0c;消息…

shell脚本之“sed“命令

文章目录 1.sed编辑器概述2.sed命令常用选项3.sed命令常用操作4.sed命令演示操作部分5.总结 1.sed编辑器概述 sed是一种流编辑器&#xff0c;流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理数据流中的数据&#xff0c;这些…

C嘎嘎~~[类 下篇 之 日期类的实现]

类 下篇 之 日期类的实现 6.const成员6.1 const成员的引入6.2const成员的概念 7.日期类的实现 6.const成员 6.1 const成员的引入 class Date { public:// 构造函数Date(int year 2023, int month 5, int day 5){_year year;_month month;_day day;}void Print(){cout &…

【STL】vector的使用

目录 前言 默认成员函数 构造函数 拷贝构造 赋值重载 迭代器 正向迭代器 反向迭代器 容量管理 查看容量和大小 扩容 判空 访问数据 下标访问 边界访问 数据修改 尾插尾删 指定位置插入删除 迭代器失效 清空 ​编辑 交换 查找数据 vector可以代替strin…

VOACAP 软件的简单介绍

VOACAP 软件可以预测短波通信中的最高可用频率、最佳传输频率、角度、延迟、反射点高度、信噪比、收发增益等参数&#xff0c;它可以直接输出文本文件&#xff0c;或者以图表输出&#xff0c;同时&#xff0c;它也可以绘制某一参数随时间、距离的变化图表。 该软件的下载安装可…

C语言从入门到精通第18天(指针和函数的联用)

指针和函数的联用 一级指针作为函数的形参二级指针 一级指针作为函数的形参 当函数的形参为数组时&#xff0c;我们定义函数如下&#xff1a; 语法: 数据类型 函数名(数据类型 数组名) 例如 : void func(int a[],int a){ 语句; } 但是在实际使用中我们通常用指针的形式进行…

GEE:如何进行对MOD09GA数据集进行水体/云掩膜并计算NDVI将其导出至云盘?

目录 01 为什么用GEE而不是传统的下载ENVIArcGIS&#xff1f; 02 操作详解 01 为什么用GEE而不是传统的下载ENVIArcGIS&#xff1f; 由于地理空间数据云中缺少2015年10月份的NDVI月合成影像&#xff0c;于是查看了地理空间数据云的NDVI数据集处理的一些介绍如下(地理空间数据…

【Linux内核】信号量semaphore机制

信号量实现方法 信号量机制是一种用于控制并发访问的同步机制&#xff0c;常用于多进程或多线程之间的协调。在Linux内核中&#xff0c;信号量机制是通过struct semaphore结构体来实现的。 每个semaphore结构体包含一个计数器和一个等待队列&#xff0c;它们用于跟踪当前可用…

Linux 并发与竞争

一、并发与竞争 1、并发 Linux 系统是个多任务操作系统&#xff0c;会存在多个任务同时访问同一片内存区域&#xff0c;这些任务可 能会相互覆盖这段内存中的数据&#xff0c;造成内存数据混乱。 多线程并发访问&#xff0c; Linux 是多任务(线程)的系统&#xff0c;所以多线…