当前位置: 首页 > news >正文

【软件测试】了解JUnit单元测试框架常用注解

目录

1、认识JUnit

2、Junit中常见的注解 

1、@Test

 2、@Disabled

 3、@BeforeAll和@AfterAll

4、@BeforeEach和@AfterEach

5、 @ParameterizedTest:参数化

 6、@order

3、断言 

1、断言相等【Assertions.assertEquals(预期,比较值)】;相等测试通过

2、断言不相等(Assertions.assertNotEqals(预期,比较值));不相等则让测试通过 

 3、断言为空:Assertions.assertNull(值)

4、断言不为空:Assertions.assertNotNull(值) 

4、测试套件 

1、指定一组要执行的测试类(@SelectClasses)

 2、指定一个包执行测试用例(@SelectPackages)


1、认识JUnit

JUnit是针对Java编程语言的最流行的单元测试框架,用于庇阿涅和运行测试,提供注释来识别测试方法,提供断言来测试预期结果,提供测试运行来运行测试。JUnit测试可以自动运行并检查自身结果并提供即时反馈。

Selenium和Junit的关系

Selenium是自动化测试框架,JUnit是单元测试框架

拿着一个技术写自动化测试测试用例(Selenium3)

拿着一个技术管理已经编写好的测试用例(JUnit5)

2、Junit中常见的注解 

我们在这里主要介绍JUnit5中的注解,JUnit版本,其中的注解也有所不同。在正常的类中,如果我们想要运行一个方法,需要我们在main方法中调用这个方法,但是现在我们在方法上添加下面的注解之后,就可以将该方法运行起来。

注解说明
@Test表示当前的这个方法为一个测试用例
@Disabled标识禁用的测试类或者测试方法
@BeforeAll在所有的测试方法之前执行,并只会执行一次
@BeforeEach在每个测试方法之前执行
@AfterAll在所有的测试方法执行完成之后执行,只会执行一次
@AfterEach在每个测试方法之后执行
@ParameterizedTest标识参数化测试方法
@order设置测试方法的执行顺序

1、@Test

用来表示当前这个方法为一个测试用例。

    @Testvoid test01(){System.out.println("这是JunitTest中的Test01");}

 2、@Disabled

标识禁用的测试类或者测试方法

public class JunitTest {@Testvoid test01(){System.out.println("这是JunitTest中的Test01");}@Disabledvoid test02(){System.out.println("这是JunitTest中的Test02");}
}

 3、@BeforeAll@AfterAll

因为这两个注解是正对整个类中的方法的,所以需要给这些方法用static修饰

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

@AfterAll:在所有的测试方法执行之后执行,之后执行一次

public class JunitTest {@Testvoid test01(){System.out.println("这是JunitTest中的Test01");}@Testvoid test02(){System.out.println("这是JunitTest中的Test02");}@AfterAllstatic void TearDown(){System.out.println("这是AfterAll的语句");}@BeforeAllstatic void SetUp(){System.out.println("这是BeforeAll里面的语句");}
}

 这两注解的使用场景,比如在做UI自动化的时候,通常情况下,我们会将创建驱动、打开网页这些操作放到BeforeAll里面,将关闭浏览器放到AfterAll中。

4、@BeforeEach@AfterEach

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

@AfterAll:在每个测试方法执行之后执行

public class JunitTest {@Testvoid test01(){System.out.println("这是JunitTest中的Test01");}@Testvoid test02(){System.out.println("这是JunitTest中的Test02");}@AfterEachvoid TearDown(){System.out.println("这是AfterEach的语句");}@BeforeEachvoid SetUp(){System.out.println("这是BeforeEach里面的语句");}
}

5、 @ParameterizedTest:参数化

🍂单参数

1️⃣单参数使用@ValueSource获取数据

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

2️⃣单参数@CsvfileSource(resources= "test01.csv")获取参数 。

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

 这个方法的执行次数根据.csv文件中数据行数来执行。

🍂多参数获取,

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

 6、@order

🍂按照程序员指定的顺序执行

@order注解是Junit5中用来指定测试方法的执行顺序的,@order搭配@TestMethodOrder(MethodOrder.OrderAnnotation.class)【指定测试方法按照程序员设定的顺序执行】来使用。

可以看到上图中的方法执行顺序,并没有按照方法的编写顺序执行。这里的测试方法在没有设置执行顺序的时候,这些测试方法的执行顺序不一定是按照从上到下的顺序执行的,这里还是要看Junit5内部是如何设计测试方法的执行顺序的。

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest1 {@Order(1)@Testvoid A(){System.out.println("这是JunitTest的A");}@Order(2)@Testvoid test01(){System.out.println("这是JunitTest中的Test01");}@Order(3)@Testvoid test02(){System.out.println("这是JunitTest中的Test02");}@Order(4)@Testvoid B(){System.out.println("这是JunitTest的B");}}

 

 可以看到我们添加了@TestMethodOrder(MethodOrder.OrderAnnotation.class)注解和@Order注解,现在这些测试方法按照我们设定的顺序进行执行了。

🍂随机顺序执行测试方法

使用@TestMethodOrder(MethodOrder.Random.class)注解,来进行随机的执行顺序,这个时候就不需要再测试方法上添加@Order注解来指定执行顺序了。

@TestMethodOrder(MethodOrderer.Random.class)
public class JunitTest1 {@Testvoid A(){System.out.println("这是JunitTest的A");}@Testvoid test01(){System.out.println("这是JunitTest中的Test01");}@Testvoid test02(){System.out.println("这是JunitTest中的Test02");}@Testvoid B(){System.out.println("这是JunitTest的B");}

3、断言 

断言方法说明
assertEquals(expected,actual)验证两个数据是否相等,相等测试通过
assertNotEquals(expected,actual)验证两个数据是否不相等,不相等测试通过
assertNotNull(expected,actual)验证对象是否为不为空,不为空测试通过
assertNull(expected,actual)验证对象是否为空,为空测试通过

1、断言相等【Assertions.assertEquals(预期,比较值)】;相等测试通过

    @ParameterizedTest@ValueSource(ints = {1})void Test03(int num) {Assertions.assertEquals(1, num);}

 

2、断言不相等(Assertions.assertNotEqals(预期,比较值));不相等则让测试通过 

    @ParameterizedTest@ValueSource(ints = {1})void Test03(int num) {Assertions.assertNotEquals(2, num);}

 

 3、断言为空:Assertions.assertNull(值)

    @Testvoid Test4(){String str = null;Assertions.assertNull(str);}

4、断言不为空:Assertions.assertNotNull(值) 

    @Testvoid Test4(){String str = "zhangsan";Assertions.assertNotNull(str);}

4、测试套件 

在Junit5中,@Suite注解用于将多个测试类组合成一个测试套件。测试条件是一种组织测试用例的方式,可以将多个测试类组合在一起执行。这对于在项目中有多个相关的测试类是非常有用,可以方便的运行所有的相关测试用例。

使用@Suite注解时,需要将注解添加到一个测试类上,该类将作为测试套件的主类,用于组织和执行其他测试类。

1、指定一组要执行的测试类(@SelectClasses)

@SelectClasses注解用于选择要运行的测试类,它允许指定一组类,JUnit将仅运行这些类中的测试用例。这些类的执行顺序时按照这些类的添加顺序执行。

//设置该类为套件测试的主类
@Suite
//选择要运行的测试类
@SelectClasses({JunitTest.class,JunitTest1.class})
public class RunSuite {
}

 2、指定一个包执行测试用例(@SelectPackages)

在Junit5中,@SelectPackages注解用于选择要运行测测试包,它允许指定一个或多个包,Junit将仅运行这些包中的测试用例。

package Test08;import org.junit.jupiter.api.Test;public class Test07 {@Testvoid Test007(){System.out.println("Test08 Test07 Test007");}
}
package Test09;import org.junit.jupiter.api.Test;public class Test09 {@Testvoid Test01(){System.out.println("Test09 Test09 Test01");}
}
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;
//设置该类为套件测试的主类
@Suite
//选择要运行的测试包
@SelectPackages(value = {"Test09", "Test08"})
public class RunSuite {
}

相关文章:

【软件测试】了解JUnit单元测试框架常用注解

目录 1、认识JUnit 2、Junit中常见的注解 1、Test 2、Disabled 3、BeforeAll和AfterAll 4、BeforeEach和AfterEach 5、 ParameterizedTest&#xff1a;参数化 6、order 3、断言 1、断言相等【Assertions.assertEquals(预期&#xff0c;比较值)】&#xff1b;相等测试通…...

【广州华锐互动】三维全景3D消防科普展馆

在我们的日常生活中&#xff0c;火灾安全是一个不容忽视的重要问题。然而&#xff0c;由于缺乏对火灾的了解和应对技巧&#xff0c;许多人在面对火灾时往往感到无助和恐慌。为了解决这个问题&#xff0c;广州华锐互动开发了三维全景3D消防科普展馆&#xff0c;它是一个以虚拟现…...

某大型车企:加强汽车应用安全防护,开创智能网联汽车新篇章

​某车企是安徽省最大的整车制造企业&#xff0c;致力于为全球消费者带来高品质汽车产品和服务体验&#xff0c;是国内最早突破百万销量的汽车自主品牌。该车企利用数字技术推动供应链网络的新型互动&#xff0c;加快数字化转型&#xff0c;持续进行场景创新、生态创新&#xf…...

LLVM学习笔记(50)

4.1.4. DAG合并与合法化 来自SelectionDAGBuilder的SelectionDAG输出还不能进行指令选择&#xff0c;必须通过额外的转换——显示在上图。在指令选择前应用的遍序列如下&#xff1a; 匹配一组节点&#xff0c;在有利时使用更简单的构造来替换它们&#xff0c;DAG合并遍优化Se…...

rpc入门笔记0x01

syntax "proto3"; // 这是个proto3的文件message HelloRequest{ // 创建数据对象string name 1; // name表示名称&#xff0c;编号是1 }生成python文件 安装grpcio和grpcio-tools库 pip install grpcio #安装grpc pip install grpcio-tools #安装grpc tools生成…...

web - Tomcat服务器

文章目录 目录 文章目录 前言 一 . CS和BS的异同 二 . 什么是Tomcat 二 . Tomcat安装 四 . Tomcat目录结构 bin目录: 用于存放二进制的可执行文件 config目录 server.xml&#xff1a;配置整个服务器信息。例如修改端口号。默认HTTP请求的端口号是&#xff1a;8080 lib目录 log…...

后端接口返回常见的状态码

2开头 &#xff08;请求成功&#xff09;表示成功处理了请求的状态代码 200 &#xff08;成功&#xff09; 服务器已成功处理了请求。 通常&#xff0c;这表示服务器提供了请求的网页。 201 &#xff08;已创建&#xff09; 请求成功并且服务器创建了新的资源。 202 &#xf…...

50.MongoDB快速入门实战

MongoDB概念 MongoDB是一个文档数据库&#xff08;以 JSON 为数据模型&#xff09;&#xff0c;由C语言编写&#xff0c;旨在为WEB应用提供可扩展的高性能数据存储解决方案。 原则上 Oracle 和 MySQL 能做的事情&#xff0c;MongoDB 都能做&#xff08;包括 ACID 事务&#x…...

一款功能强大的音乐曲谱软件Guitar Pro 8 .1.1for Mac 中文破解版

Guitar Pro 8 .1.1for Mac 中文破解版是一款功能强大的音乐曲谱软件&#xff0c;非常适合学习如何玩&#xff0c;改进技巧&#xff0c;重现喜爱的歌曲或陪伴自己。可以帮助我们进行吉他的学习、绘谱与创作&#xff0c;它包含了几乎所有的吉他现有指法及音色&#xff0c;在做弹拨…...

图论基础和表示

一、概念及其介绍 图论(Graph Theory)是离散数学的一个分支&#xff0c;是一门研究图(Graph)的学问。 图是用来对对象之间的成对关系建模的数学结构&#xff0c;由"节点"或"顶点"(Vertex&#xff09;以及连接这些顶点的"边"&#xff08;Edge&a…...

STM32 音频ADC转wav格式

STM32 音频ADC DAC测试方法_stm32 adc 音频-CSDN博客 STM32--vs1053 WAV录音实现&#xff08;保存在SD卡&#xff09;_vs1053 多字节读取-CSDN博客 单片机内部AD实现录音wav文件_adc语音信号采样_天外飞仙CUG的博客-CSDN博客 PCM编码格式_pcm格式-CSDN博客 用ADC编码PCM数据…...

面试中经常问道的问题二

深入理解前端跨域方法和原理 前言 受浏览器同源策略的限制&#xff0c;本域的js不能操作其他域的页面对象&#xff08;比如DOM&#xff09;。但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦。所以我们要通过一些方法使本域的js能够操作其他域的页面对象或者使…...

SQL UPDATE 语句(更新表中的记录)

SQL UPDATE 语句 UPDATE 语句用于更新表中已存在的记录。 还可以使用AND或OR运算符组合多个条件。 SQL UPDATE 语法 具有WHERE子句的UPDATE查询的基本语法如下所示&#xff1a; UPDATE table_name SET column1 value1, column2 value2, ... WHERE conditi…...

js节流和防抖

节流&#xff08;throttle&#xff09;和防抖&#xff08;debounce&#xff09;是为了解决函数频繁触发而引发性能问题的两种优化方法。 节流&#xff1a; 指定一个时间间隔&#xff0c;在时间间隔内只执行一次函数&#xff0c;即在一段时间内&#xff0c;多次触发函数只执行一…...

权限系统设计(转载)

1 为什么需要权限管理 2 权限模型 2.1 权限设计 2.2 为什么需要角色 2.3 权限模型的演进 2.4 用户划分 2.5 理想的RBAC模型 3 权限系统表设计 3.1 标准RBAC模型表设计 3.2 理想RBAC模型表设计 4 结语 1 为什么需要权限管理 日常工作中权限的问题时时刻刻伴随着我们&a…...

【机器学习合集】标准化与池化合集 ->(个人学习记录笔记)

文章目录 标准化与池化1. 标准化/归一化1.1 归一化归一化的作用 1.2 标准化批标准化方法 Batch Normailzation标准化方法的对比自动学习标准化方法 2. 池化2.1 池化的作用2.2 常见的池化方法2.3 池化方法的差异2.4 池化的必要性 标准化与池化 1. 标准化/归一化 1.1 归一化 归…...

Dockerfile文件自动化生成R4L镜像

Dockerfile文件自动化生成R4L镜像的步骤 1、安装Docker&#xff1a;2、使用Dockerfile一键生成镜像&#xff1a;3、查看生成的Docker镜像&#xff1a;4、删除Docker镜像&#xff1a;5、生成Docker容器&#xff1a;6、查看容器7、删除容器 1、安装Docker&#xff1a; curl -fsS…...

基于SSM的居家养老系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…...

[C#基础训练]FoodRobot食品管理部分代码-2

参考代码&#xff1a; using System; using System.Collections.Generic;namespace FoodRobotDemo {public class FoodInfo{ public string Name { get; set; } public int Id { get; set; } public int Count { get; set; }}public class FoodRobot{private …...

docker部署rabbitmq的坑

背景 今天用docker部署rabbitmq&#xff0c;启动都一起正常&#xff0c;但是当访问15672端口时&#xff0c;不能加载出页面。 排查 1.防火墙是否开启 ufw status2.ip是否能ping通 ping 192.168.x.x3.检查docker日志 docker psdocker logs -f 容器id4.进入容器&#xff0c…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...