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

目录

前言:

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 {@Testvoid 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 {@Testvoid Test01() {System.out.println("这是JunitTest02里面的Test01");}@Testvoid Test02() {System.out.println("这是JunitTest02里面的Test02");}@Disabled@Testvoid 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 {@Testvoid Test01() {System.out.println("这是JunitTest03里面的Test01");}@Testvoid Test02() {System.out.println("这是JunitTest03里面的Test02");}@Testvoid Test03() {System.out.println("这是JunitTest03里面的Test03");}@BeforeAllstatic void SetUp() {System.out.println("这是BeforeAll里面的语句");}@AfterAllstatic 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 {@Testvoid Test01() {System.out.println("这是JunitTest04里面的Test01");}@Testvoid Test02() {System.out.println("这是JunitTest04里面的Test02");}@Testvoid Test03() {System.out.println("这是JunitTest04里面的Test03");}@BeforeEachvoid BeforeEachTest() {System.out.println("这是BeforeEach里面的语句");}@AfterEachvoid AfterEachTest() {System.out.println("这是AfterEach里面的语句");}
}


结果展示:

 

2.2参数化

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

代码展示:

package JunitTest;import org.junit.jupiter.api.Test;public class JunitTest05 {@Testvoid 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 {@Testvoid 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 {@Testvoid A() {System.out.println("A");}@Testvoid B() {System.out.println("B");}@Testvoid C() {System.out.println("C");}@Testvoid D() {System.out.println("D");}
}


结果展示:

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

代码展示:

package JunitTest;import org.junit.jupiter.api.Test;public class JunitTest11 {@Testvoid D() {System.out.println("D");}@Testvoid A() {System.out.println("A");}@Testvoid C() {System.out.println("C");}@Testvoid 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)@Testvoid D() {System.out.println("D");}@Order(2)@Testvoid A() {System.out.println("A");}@Order(3)@Testvoid C() {System.out.println("C");}@Order(4)@Testvoid 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);//在这里判断我们接收到的参数是不是1Assertions.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 {@Testvoid Test01() {String str = "1";Assertions.assertNotNull(str);System.out.println(str);}
}


结果展示:

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

结束语:

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

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

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

相关文章

vue3引用Font-Awesome字体图标库

环境&#xff1a;vue3tsviteelement plus 介绍&#xff1a;这里安装引用的是Font-Awesome 6.x 版本&#xff0c;有专业版&#xff08;付费&#xff09;&#xff0c;这里只介绍免费版字体使用方法 一、安装 1.使用npm安装&#xff0c;终端打开项目目录或者命令行cd到目录文件夹…

面向对象程序三大特性一:多态(超详细)

目录 1.重写 1.1基本语法规则 1.2规则深化 1.3重写与重载的区别 2.向上转型 2.1简单介绍 2.3向上转型的作用 3.向下转型 3.1介绍 3.2instanceof 基本介绍 4.多态 4.1多态实现条件 4.2避免在构造方法中调用重写的方法 1.重写 重写 (override) &#xff1a;也称为覆…

【漏洞挖掘】Xray+rad自动化批量漏洞挖掘

文章目录 前言一、挖掘方法二、使用步骤工具安装使用方法开始挖掘 总结 前言 自动化漏洞挖掘是指利用计算机程序和工具来扫描、分析和检测应用程序、网络和系统中的安全漏洞的过程。这种方法可以帮助安全专家和研究人员更高效地发现和修复潜在的安全威胁&#xff0c;从而提高整…

Docker-Compose编排与部署

目录 Docker Compose Compose的优点 编排和部署 Compose原理 Compose应用案例 安装docker-ce 阿里云镜像加速器 安装docker-compose docker-compose用法 Yaml简介 验证LNMP环境 Docker Compose Docker Compose 的前身是 Fig&#xff0c;它是一个定义及运行多个 Dock…

异或运算详解

异或运算详解 定义特性用途总结 定义 参与运算的两个数据,按二进制位进行 ^ 运算,如果两个相对应为值相同结果为0,否则为1 1 ^ 0 1 0 ^ 1 1 0 ^ 0 0 1 ^ 1 0特性 异或^运算只能用于数值(整数) x ^ 0 x x ^ x 0用途 两个值交换,而不用使用临时变量 a a ^ b; b b ^…

负数的二进制转换成十进制

对于一个k位的二进制正数&#xff0c;其表示成十进制的结果是&#xff1a; pos[i]表示&#xff1a;这个正数的二进制形式的第i位是1。 i从最低位&#xff08;第0位&#xff09;开始&#xff0c;一直到k-1位。有符号数中&#xff0c;正数的第k-1为0&#xff0c;负数的第k-1位为…

SequenceDiagram 查看代码时序图的利器,做技术方案必备!

前言 “ 无论是快速了解业务流程&#xff0c;还是快速的熟悉系统的业务代码逻辑&#xff0c;以及各个类和方法等的调用关系&#xff0c;时序图无疑是其中一种不可获取的简便快捷的方式。一起来了解下&#xff0c;IDEA如何快速生成时序图吧。” 工作中&#xff0c;经常需要绘制…

【动态规划算法】-回文串问题题型(34-40题)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

CRM系统如何进行公海池线索分配自动化?

在销售过程中&#xff0c;线索分配是一个非常重要的环节。传统的线索分配方式往往是由销售主管手动进行&#xff0c;不仅效率低下&#xff0c;还存在着不公平、不灵活的问题。因此&#xff0c;许多企业通过CRM来实现公海池线索分配自动化。 1、基于规则的分配 CRM可以让用户设…

express学习笔记6 - 用户模块

新建router/user.js const express require(express) const routerexpress.Router() router.get(/login, function(req, res, next) {console.log(/user/login, req.body)res.json({code: 0,msg: 登录成功})})module.exportsrouter 在router/user.js引入并使用 const us…

Vue进阶(幺叁陆): transition标签实现页面跳转动画

文章目录 一、前言二、方案实现三、延伸阅读 transition标签四、拓展阅读 一、前言 在Vue项目开发过程中&#xff0c;应用全家桶vue-router实现路由跳转&#xff0c;且页面前进、后退跳转过程中&#xff0c;分别对应不同的切换动画。vue-router 切换页面时怎么设置过渡动画&am…

MySQL日志——错误日志、二进制日志

错误日志二进制日志查询日志慢查询日志 1.错误日志 查看日志位置&#xff1a; show variables like %log_error%查看错误日志&#xff1a; tail -f /var/log/mysql.log2.二进制日志 show variables like %log_bin%;cd /var/lib/mysql ll2.1 日志格式 查看日志格式指令&…

计算机视觉与图形学-神经渲染专题-ConsistentNeRF

摘要 Neural Radiance Fields (NeRF) 已通过密集视图图像展示了卓越的 3D 重建能力。然而&#xff0c;在稀疏视图设置下&#xff0c;其性能显着恶化。我们观察到&#xff0c;在这种情况下&#xff0c;学习不同视图之间像素的 3D 一致性对于提高重建质量至关重要。在本文中&…

【多模态】21、BARON | 通过引入大量 regions 来提升模型开放词汇目标检测能力(CVPR2021)

文章目录 一、背景二、方法2.1 主要过程2.2 Forming Bag of Regions2.3 Representing Bag of Regions2.4 Aligning bag of regions 三、效果 论文&#xff1a;Aligning Bag of Regions for Open-Vocabulary Object Detection 代码&#xff1a;https://github.com/wusize/ovdet…

pytorch(续周报(1))

文章目录 2.1 张量2.1.1 简介2.1.2 创建tensor2.1.3 张量的操作2.1.4 广播机制 2.2 自动求导Autograd简介2.2.1 梯度 2.3 并行计算简介2.3.1 为什么要做并行计算2.3.2 为什么需要CUDA2.3.3 常见的并行的方法&#xff1a;网络结构分布到不同的设备中(Network partitioning)同一层…

微服务系列<3>---微服务的调用组件 rpc 远程调用

什么是rpc调用,让我们调用远程方法就像调用本地方法一样 这就属于rpc调用 rpc是针对于本地来说的 调用远程方法根调用本地方法一样 如果能达到这种效果 就是rpc调用如果达到一种效果 调用远程和调用本地一样 他就是一种rpc框架2个微服务 之间发的调用 我们之前通过ribbon的方式…

springboot访问请求404的原因

是记录&#xff0c;可能出现错误 可能出现的原因 1.你请求的URL路径不对,比如说你请求的路径是/usr/list,GET方法,但是你UserController上面的RequestMapping是这个样子:RequestMapping(“user”)&#xff0c;有可能哈 2.前端的请求时GET方法&#xff0c;后端对应的处理函数的方…

【Linux命令200例】whereis用于搜索以及定位二进制文件

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜…

IDA+Frida分析CTF样本和Frid源码和objection模块

文章目录 一些资料IDA调试命令IDA调试安卓的10个技巧objection基本使用 Wallbreaker1frida源码阅读之frida-java 第一个实例EasyJNI第二个实例objection资料 art_trace2.pyart_trace2.js IDAFrida分析CTF样本和Frid源码和objection模块 一些资料 IDA调试命令 adb devices adb…

Python 批量处理JSON文件,替换某个值

Python 批量处理JSON文件&#xff0c;替换某个值 直接上代码&#xff0c;替换key TranCode的值 New 为 Update。输出 cancel忽略 import json import os import iopath D:\\Asics\\850\\202307 # old path2 D:\\test2 # new dirs os.listdir(path) num_flag 0 for file…