自动化测试Junit(测试系列8)

news2024/9/28 9:20:39

目录

前言:

1.什么是Junit

2.Junit相关的技术

2.1注解

2.1.1@Test

2.1.2@Disable

2.1.3@BeforeAll和@AfterAll

2.1.4@BeforeEach和@AfterEach 

2.2参数化

2.2.1单参数

2.2.2多参数

2.2.2.1CSV获取参数

2.2.2.2方法获取参数

2.3测试套件

2.3.1通过class运行测试用例

2.3.2通过包运行测试用例

2.4执行顺序

2.5断言

2.5.1断言相等

2.5.2断言不相等

2.5.3断言为空

2.5.4断言不为空

结束语:


前言:

在上一篇博客中小编主要与大家分享了该如何使用selenium来完成自动化测试,那么还有一种是Junit,Junit是单元测试的框架而Selenium是自动化测试的框架,Selenium是拿着一个技术写自动化测试用例,而Junit是拿着一个技术管理已经编写好的测试用例。所以两者之间还是有一定的差别的。接下来咱们就来谈谈Junit中相关的技术吧。

1.什么是Junit

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

2.Junit相关的技术

2.1注解

在Junit注解主要有:

  • @Test
  • @Disable
  • @BeforeAll,@AfterAll
  • @BeforEach,@AfterEach

下面我们来给大家一一讲解演示一下。

2.1.1@Test

在以前的代码中我们运行代码必须是通过主函数来进行运行的,如下所示:

代码展示:

public class Test02 {
    public static void main(String[] args) {
        Test();
    }

    private static void Test() {
        System.out.println("这是一个Test方法");
    }
}

结果展示:

那么通过@Test这样的一个注解我们就可以直接进行运行了,@Test表示当前这个方法是一个测试用,我们通过代码来感受一下。

代码展示:

package JunitTest;

import org.junit.jupiter.api.Test;

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

这里我们就可以点击旁边的按钮来进行运行了。

注意:点击①是运行整个程序的代码。点击②只是运行Test01这一块的代码。

结果展示: 

在上述中我们需要先去Maven中央仓库里导入依赖,步骤入下所示:

①打开Maven中央仓库点击搜索Junit。

②找到对应的依赖点击复制。(注:由于我们这里讲解的是Junit5,所以小编这里复制的是5.9.1里面的)

③将依赖粘贴到pom文件中。

④点击刷新Maven。

 

2.1.2@Disable

@Disable表示直接忽视这块代码。

代码展示:

package JunitTest;

import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

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

如果没有该注释上面的代码执行结果应该是这样的。

但是如果有@Disable这个注释的话,Test03就会被忽视。

 

2.1.3@BeforeAll和@AfterAll

  • @BeforeAll是指在所有的测试用例运行之前跑对应的方法。
  • @AfterAll是指在所有的测试用例运行之后跑对应的方法。

代码展示:

package JunitTest;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

public class JunitTest03 {
    @Test
    void Test01() {
        System.out.println("这是JunitTest03里面的Test01");
    }
    @Test
    void Test02() {
        System.out.println("这是JunitTest03里面的Test02");
    }
    @Test
    void Test03() {
        System.out.println("这是JunitTest03里面的Test03");
    }
    @BeforeAll
    static void SetUp() {
        System.out.println("这是BeforeAll里面的语句");
    }
    @AfterAll
    static void TearDown() {
        System.out.println("这是AfterAll里面的语句");
    }
}


结果展示:

需要注意的是我们要方法前面加上static,将他变成静态的,也就是类方法。

 

2.1.4@BeforeEach和@AfterEach 

  • @BeforeEach:在每一个测试用例之前跑对应的代码。
  • @AfterEach :在每一个测试用例之后跑对应的代码。

代码展示:

package JunitTest;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class JunitTest04 {
    @Test
    void Test01() {
        System.out.println("这是JunitTest04里面的Test01");
    }
    @Test
    void Test02() {
        System.out.println("这是JunitTest04里面的Test02");
    }
    @Test
    void Test03() {
        System.out.println("这是JunitTest04里面的Test03");
    }
    @BeforeEach
    void BeforeEachTest() {
        System.out.println("这是BeforeEach里面的语句");
    }
    @AfterEach
    void AfterEachTest() {
        System.out.println("这是AfterEach里面的语句");
    }
}


结果展示:

 

2.2参数化

如果我们想要在方法中传入参数,会出现什么情况呢?如下所示。

代码展示:

package JunitTest;

import org.junit.jupiter.api.Test;

public class JunitTest05 {
    @Test
    void Test01(int i) {
        System.out.println(i);
    }
}


结果展示:

你会发现会报错,原因是因为我们没有给注册一个参数。那么此时我们该怎么办呢?这里就需要我们先在Maven里面导入一个依赖,如下所示:

 


 

将其复制到pom中,并刷新。

 

此时我们就可以使用注解@ ParameterizedTest了,通过该注解我们就可以实现传递参数了,具体的我们看下述操作。

2.2.1单参数

我们通过@ValueSource就可以进行单参数的传递了。

代码展示:

package JunitTest;

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

public class JunitTest05 {
    @ParameterizedTest
    @ValueSource(ints = {1,2,3})
    void Test01(int num) {
        System.out.println(num);
    }
    @ParameterizedTest
    @ValueSource(strings = {"1", "2", "3"})
    void Test02(String number) {
        System.out.println(number);
    }
}


结果展示:

2.2.2多参数

2.2.2.1CSV获取参数

如果我们想要进行多参数的传递那又该怎么传递呢?

可以通过@ CsvSource来进行传递,它既可以进行单参数的传递也可以进行多参数的传递。

单参数:

代码展示:

package JunitTest;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

public class JunitTest06 {
    @ParameterizedTest
    @CsvSource({"1","2","3"})
    void Test02(String num) {
        System.out.println(num);
    }

}

结果展示:

多参数:
代码展示:

package JunitTest;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

public class JunitTest09 {
    @ParameterizedTest
    @CsvSource({"1,2", "3,4"})
    void Test01(String str, int num) {
        System.out.println(str + " : " + num);
    }
}

结果展示:

 

也可以通过 @CsvFileSource来传递。

代码展示:

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;

public class Test01 {
    @ParameterizedTest
    @CsvFileSource(resources = "test01.csv")
    void Test01(int num, String name) {
        System.out.println(num + ":" + name);
    }
}


结果展示:

注意在上述代码中我们是通过以下的方式来创建一个.csv文件的。

 

 然后就在文件中进行填写数据即可。

2.2.2.2方法获取参数

除了上述的三种方式之外我们还可以通过@MethodSource来传递参数。

代码展示:

package JunitTest;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

import java.util.stream.Stream;

public class JunitTest08 {
    public static Stream<Arguments> Generator() {
        return Stream.of(Arguments.arguments(
                "1","张三"
        ));
    }

    @ParameterizedTest
    @MethodSource("Generator")
    void Test01(String num, String name) {
        System.out.println(num + ":" + name);
    }
}

结果展示:

2.3测试套件

2.3.1通过class运行测试用例

这里我们先在java文件夹中新建两个.class类。

代码展示:

代码①:
​​​​​​​代码②:

import org.junit.jupiter.api.Test;

public class Test04 {
    @Test
    void Test04() {
        System.out.println("Test04");
    }
}

代码③:

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

@Suite
//通过class测试用例运行
@SelectClasses(value = {Test03.class,Test04.class})
public class RunSuite {
}

结果展示:

  

2.3.2通过包运行测试用例

在上述代码中我们是通过class来运行的,这里我们来通过包来运行。

代码展示:

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

@Suite
//通过包来运行测试用例
@SelectPackages({"Test1","Test2"})
public class RunSuite2 {
}

 结果展示:

2.4执行顺序

我们先来看下面这个代码的执行顺序。

代码展示:

package JunitTest;

import org.junit.jupiter.api.Test;

public class JunitTest11 {
    @Test
    void A() {
        System.out.println("A");
    }
    @Test
    void B() {
        System.out.println("B");
    }
    @Test
    void C() {
        System.out.println("C");
    }
    @Test
    void D() {
        System.out.println("D");
    }
}


结果展示:

如果我们现在换一下代码块之间的顺序结果会是什么呢?

代码展示:

package JunitTest;

import org.junit.jupiter.api.Test;

public class JunitTest11 {
    @Test
    void D() {
        System.out.println("D");
    }
    @Test
    void A() {
        System.out.println("A");
    }

    @Test
    void C() {
        System.out.println("C");
    }
    @Test
    void B() {
        System.out.println("B");
    }
}


结果展示:
 

你会发现即是是换了代码的顺序,结果还是一样的没有变,那么我们该怎么让代码的顺序变动呢?

这里我们可以借助@TestMethodOrderer来指定执行的顺序,具体使用请看代码。

代码展示:

package JunitTest;

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 JunitTest11 {
    @Order(1)
    @Test
    void D() {
        System.out.println("D");
    }
    @Order(2)
    @Test
    void A() {
        System.out.println("A");
    }
    @Order(3)
    @Test
    void C() {
        System.out.println("C");
    }
    @Order(4)
    @Test
    void B() {
        System.out.println("B");
    }
}


结果展示:

通过上述的方法我们就可以让代码来按照我们指定的顺序来进行执行了。

2.5断言

如果我们需要对测试用例进行预期的判断,判断我们的结果是不是和我们的预期相符,那么此时我们就可以使用断言这样的操作来进行判断,这里我们具体看下面的代码案例。

2.5.1断言相等

代码展示:

package JunitTest;

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

public class JunitTest12 {
    @ParameterizedTest
    @ValueSource(ints = {1})
    void Test01(int num) {
        System.out.println(num);
        //在这里判断我们接收到的参数是不是1
        Assertions.assertEquals(1,num);
    }
}

结果展示:

我们可以看到结果展示的是1,那就说明我们的预期结果与实际结果是相符的。 

2.5.2断言不相等

代码展示:

package JunitTest;

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

public class JunitTest13 {
    @ParameterizedTest
    @ValueSource(ints = {1})
    void Test01(int num) {
        System.out.println(num);
        //在这里判断接收到的参数是不是与预期的不相符,也就是断言不相等
        Assertions.assertNotEquals(1,num);
    }
}

结果展示:

注意:这里是预期的如果与实际的相符的话就会报错!!!

2.5.3断言为空

断言为空就是判断接收到的值是不是空值。

代码展示:

package JunitTest;

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

public class JunitTest14 {
    @ParameterizedTest
    @ValueSource(ints = {1})
    void Test01(int num) {
        System.out.println(num);
        //判断断言是不是空值
        Assertions.assertNull(num);
    }
}


结果展示:

上述代码的结果表明接收到的值不为空。

2.5.4断言不为空

断言不为空就是判断如果断言是空的话就报错,不为空才是正确的。

代码展示:

package JunitTest;

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

public class JunitTest15 {
    @Test
    void Test01() {
        String str = "1";
        Assertions.assertNotNull(str);
        System.out.println(str);
    }
}


结果展示:

上述结果表明str不是空值。

结束语:

希望这节对大家学习自动化测试有一定的帮助,下节中小编将重点给大家介绍一下Junit里的一些操作,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)

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

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

相关文章

Java工程师研学之路【002Java基础语法上】

知识体系&#xff08;Knowledge system&#xff09; 练习&#xff08;practice&#xff09; 要求&#xff1a;从控制台输入两个数字&#xff0c;然后输出两个数字的求和结果。 import java.util.Scanner; public class HelloJava {public static void sum(){System.out.print…

kafka集群搭建(Linux环境)

zookeeper搭建&#xff0c;可以搭建集群&#xff0c;也可以单机&#xff08;本地学习&#xff0c;没必要搭建zookeeper集群&#xff0c;单机完全够用了&#xff0c;主要学习的是kafka&#xff09; 1. 首先官网下载zookeeper&#xff1a;Apache ZooKeeper 2. 下载好之后上传到…

以数据要素为支点,兴业银行撬动企业“技术杠杆”

文 | 螳螂观察 作者 | 李永华 推荐理财产品&#xff0c;恰好符合客户能承受的风险水平和想要的收益率水平&#xff0c;在资金投入上也契合客户当下的财务安排&#xff0c;于是顺利成交&#xff1b; 为客户办理的信用卡&#xff0c;优惠的场景方向与客户常常消费的领域大体一…

RWEQ模型教程

详情点击链接&#xff1a;基于“RWEQ”集成技术在土壤风蚀模拟与风蚀模数估算、变化归因分析中的实践应用及SCI论文撰写 前沿 土壤风蚀是一个全球性的环境问题。中国是世界上受土壤风蚀危害最严重的国家之一&#xff0c;土壤风蚀是中国干旱、半干旱及部分湿润地区土地荒漠化的…

U盘安装CentOS7.9出错:进入 dracut问题和解决方法

U盘安装CentOS7.9出错&#xff1a;进入 dracut问题和解决方法 原因&#xff1a;U盘名称未识别&#xff0c; 解决&#xff1a;进入启动界面&#xff0c;按e进入编辑界面 修改&#xff1a; vmlinuz initrdinitrd.img inst.stage2hd:LABELCentOS\x207\x20x86_64.check quiet 为 …

前端框架学习-Vue(二)

最近在学习Vue框架&#xff0c;Vue中的内容很多。相当于把之前后端的MVC&#xff0c;V层转移到前端来编写和部署。下面是学习Vue时的大纲。 Vue生命周期是Vue应用的生命周期Vue脚手架&#xff0c;即vue-cli&#xff0c;使用node.js 来创建和启动vue项目Vue组件知识&#xff0c;…

java重试机制实现方案

本文内容是目前团队内小磊同学对重试机制实现方案的梳理总结。 从为什么需要重试的背景开始&#xff0c;到重试的场景&#xff0c;大致的一些设计思路&#xff0c;最后通过两个成熟的retry组件进行案例讲解&#xff0c;理论实战。 背景 重试是系统提高容错能力的一种手段。在一…

Windows下Nginx安装与配置教程

一、前言 1、Nginx是什么&#xff1f; Nginx是一个开源的Web服务器&#xff0c;同时Nginx也提供了反向代理和负载均衡的功能。 Nginx通常作为负载均衡器暴露在外网接受用户请求&#xff0c;同时也使用其反向代理的功能&#xff0c;将用户的请求转发到实际提供服务的内网服务器…

带wiringPi库的交叉编译 ---宿主机x86Ubuntu,目标机ARMv8 aarch64(香橙派)

带wiringPi库的交叉编译如何进行 先交叉编译wiringPi库&#xff0c;编译出的库适合香橙派&#xff0c;这时候交叉编译可执行程序的平台和链接库的格式也是正确的&#xff0c;然后通过-I和-L来指定链接的wiringPi库的头文件和库的位置&#xff0c;但是现在还没有学习过&#xf…

基于正交滤波器组的语音DPCM编解码算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...........................................................g0zeros(1,lenH); g1zeros(1,l…

加解密相关工具网站总结

加解密相关工具&网站总结 文章目录 加解密相关工具&网站总结CMD5&#xff0c;解密&#xff0c;反向查询JSFuck&#xff08;JavaScriptAAEncode加密/解密&#xff08;Javascript在线CTF编码工具开源加解密工具大佬文章&#xff1a;1.30余种加密编码类型的密文特征分析2.…

VMware搭建Hadoop集群 for Windows(完整详细,实测可用)

目录 一、VMware 虚拟机安装 &#xff08;1&#xff09;虚拟机创建及配置 &#xff08;2&#xff09;创建工作文件夹 二、克隆虚拟机 三、配置虚拟机的网络 &#xff08;1&#xff09;虚拟网络配置 &#xff08;2&#xff09;配置虚拟机 主机名 &#xff08;3&#xf…

数值分析第六章节 用Python实现解线性方程组的迭代法

参考书籍&#xff1a;数值分析 第五版 李庆杨 王能超 易大义编 第5章 解线性方程组的迭代法 文章声明&#xff1a;如有发现错误&#xff0c;欢迎批评指正 文章目录 迭代法的基本概念雅可比迭代法与高斯-塞格尔迭代法雅可比迭代法高斯-塞格尔迭代法 迭代法的基本概念 6.1.1引言…

Python 进阶(三):正则表达式(re 模块)

❤️ 博客主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;Python 入门核心技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; 文章目录 1. 导入re模块2. re模块中的常用函数2.1 re.search()2.2 re.findall()2.3 re.sub()2.4…

020 - STM32学习笔记 - Fatfs文件系统(二) - 移植与测试

020 - STM32学习笔记 - Fatfs文件系统&#xff08;二&#xff09; - 移植与测试 上节学习了FatFs文件系统的相关知识&#xff0c;这节内容继续学习在STM32上如何移植FatFs文件系统&#xff0c;并且实现文件的创建、读、写与删除等功能。 一、FatFs文件系统移植 移植还是在之…

uniapp 全局数据(globalData)的设置,获取,更改

globalData&#xff0c;这是一种简单的全局变量机制。这套机制在uni-app里也可以使用&#xff0c;并且全端通用 因为uniapp基本上都是将页面&#xff0c;或者页面中相同的部分&#xff0c;进行组件化&#xff0c;所以会存在父&#xff0c;子&#xff0c;&#xff08;子&#xf…

AI革命:揭开微软无与伦比的AI技术面纱

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 2023年7月25日&#xff0c;全球科技行业的领导者之一微软(MSFT)公布了其2023财年第四季度的财报。 除了举世闻名的Windows操作系统&#xff0c;微软还通过笔记本电脑、个人电脑和服务器等产品改变了世界&#xff0c;该公司…

ARM裸机-2

1、搞清楚各种版本号 1.1、ARM的型号命名问题 ARM7和ARMv7不是一回事。 Cortex-A9比Cortex-A7更先出来。 型号很乱&#xff0c;初学者容易分不清哪个是哪个&#xff0c;比较迷茫。 1.2、ARM的几种版本号 ARM内核版本号&#xff08;ARM卖给别人的核心版本号&#xff09; …

IntelliJ IDEA 2023.2 主要更新了什么?(图文版)

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

无敌的服务注册中心Spring CloudAlibaba Nacos不进来看一看吗?

1、Nacos概述 Nacos支持发现、配置和管理几乎所有类型的服务。其Key features&#xff1a;Service Discovery And Service Health Check、Dynamic configuration management、Dynamic DNS service、Service governance and metadata management 官网 2、Nacos安装运行 安装 …