JUnit4

JUnit4 介绍

JUnit 是 Java 编程语言的单元测试框架,用于编写和运行可重复的自动化测试。

JUnit 特点:

  • JUnit 是一个开放的资源框架,用于编写和运行测试。
  • 提供注解来识别测试方法。
  • 提供断言来测试预期结果。
  • JUnit 测试允许你编写代码更快,并能提高质量。
  • JUnit 优雅简洁,没那么复杂,花费时间较少。
  • JUnit 测试可以自动运行并且检查自身结果并提供即时反馈,所以也没有必要人工梳理测试结果的报告。
  • JUnit 测试可以被组织为测试套件,包含测试用例,甚至其他的测试套件。
  • JUnit 在一个条中显示进度。如果运行良好则是绿色;如果运行失败,则变成红色。

JUnit4 改进:

  • JUnit4 是 JUnit 框架有史以来的最大改进,其主要目标便是利用 Java5 的 Annotation 特性简化测试用例的编写。

  • 什么是 Annotation:这个单词一般是翻译成元数据,元数据就是描述数据的数据。也就是说,这个东西在 Java 里面可以用来和 public、static 等关键字一样来修饰类名、方法名、变量名。修饰的作用是描述这个数据是做什么用的,正如 public 的作用是描述这个数据是公有的。

JUnit4 注解

注解描述
@Test将一个方法标记为测试方法,使其可以作为一条测试用例
@Before每一个测试方法调用前必执行的方法
@After每一个测试方法调用后必执行的方法
@BeforeClass所有测试方法调用前执行一次,在测试类没有实例化之前就已被加载,需用 static 修饰
@AfterClass所有测试方法调用后执行一次,在测试类没有实例化之前就已被加载,需用 static 修饰
@Ignore每个被注解为 @Ignore 的方法将不再执行
@Runwith放在测试类名上,用来确定这个类怎么运行的。也可以不标注,会使用默认运行器
@Parameters用于使用参数化功能
@SuiteClasses用于套件测试

详解:

@Test

  • @Test 注解的 public void 方法将会被当做测试用例。

  • JUnit 每次都会创建一个新的测试实例,然后调用 @Test 注解方法。

  • 任何异常的抛出都会认为测试失败

  • @Test 注解提供 2 个参数:

    1. expected:定义测试方法应该抛出的异常,如果测试方法没有抛出异常或者抛出了一个不同的异常,测试失败。
    2. timeout:如果测试运行时间长于该定义时间,测试失败(单位为毫秒)。

@After

  • 如果在 @Before 注解方法中分配了额外的资源,那么在测试执行完后,需要释放分配的资源。
  • 使用 @After 注解一个 public void 方法会使该方法在 @Test 注解方法执行后被执行
  • 即使在 @Before 注解方法、@Test 注解方法中抛出了异常,所有的 @After 注解方法依然会被执行。
  • 父类中的 @After 注解方法会在子类 @After 注解方法执行后被执行。

@AfterClass

  • 如果在 @BeforeClass 注解方法中分配了代价高昂的额外的资源,那么在测试类中的所有测试方法执行完后,需要释放分配的资源。
  • 使用 @AfterClass 注解一个 public static void 方法会使该方法在测试类中的所有测试方法执行完后被执行。
  • 即使在 @BeforeClass 注解方法中抛出了异常,所有的 @AfterClass 注解方法依然会被执行。
  • 父类中的 @AfterClass 注解方法会在子类 @AfterClass 注解方法执行后被执行。

@Before

  • 当编写测试方法时,经常会发现一些方法在执行前需要创建相同的对象。

  • 使用 @Before 注解一个 public void 方法会使该方法在 @Test 注解方法被执行前执行(那么就可以在该方法中创建相同的对象)。

  • 父类的 @Before 注解方法会在子类的 @Before 注解方法执行前执行。

@BeforeClass

  • 有些时候,一些测试需要共享代价高昂的步骤(如数据库登录),这会破坏测试独立性,通常是需要优化的。

  • 使用 @BeforeClass 注解一个 public static void 方法,并且该方法不带任何参数,会使该方法在所有测试方法被执行前执行一次,并且只执行一次。

  • 父类的 @BeforeClass 注解方法会在子类的 @BeforeClass 注解方法执行前执行。

@Ignore

  • 对包含测试类的类或 @Test 注解方法使用 @Ignore 注解将使被注解的类或方法不会被当做测试执行。

  • JUnit 执行结果中会报告被忽略的测试数。

示例:JUnit4 执行过程

public class JunitTest {@BeforeClasspublic static void beforeClass() {System.out.println("in before class");}@AfterClasspublic static void afterClass() {System.out.println("in after class");}@Beforepublic void before() {System.out.println("in before");}@Afterpublic void after() {System.out.println("in after");}@Testpublic void testCase1() {System.out.println("in test case 1");}@Testpublic void testCase2() {System.out.println("in test case 2");}}

执行结果:

in before class
in before
in test case 1
in after
in before
in test case 2
in after
in after class

JUnit4 断言

断言描述
void assertEquals([String message], expected value, actual value)断言两个值内容是否相等(第一个参数是一个可选字符串消息)。值类型可能是 int、short、long、byte、char、Object
void assertTrue([String message], boolean condition)断言一个条件为真
void assertFalse([String message], boolean condition)断言一个条件为假
void assertNotNull([String message], Object object)断言一个对象不为空(null)
void assertNull([String message], Object object)断言一个对象为空(null)
void assertSame([String message], Object expected, Object actual)断言两个对象是否引用相同的对象
void assertNotSame([String message], Object unexpected, Object actual)断言两个对象不是引用同一个对象
void assertArrayEquals([String message], expectedArray, resultArray)断言预期数组和结果数组相等,数组类型可能是 int、short、long、byte、char、Object

示例:

import org.junit.Assert;
import org.junit.Test;public class JavaBase {@Testpublic void testDemo () {String s1 = "123";String s2 = "123";String s3 = new String("123");int[] i1 = new int[]{1, 2, 3};int[] i2 = new int[]{1, 2, 3};int[] i3 = new int[]{2, 1, 3};Assert.assertEquals(s1, s2);  // trueAssert.assertEquals(s2, s3);  // trueAssert.assertSame(s1, s2);  // trueAssert.assertSame(s1, s3);  // falseAssert.assertArrayEquals(i1, i2);  // trueAssert.assertSame(i2, i3);  // false}}

异常测试

@Test(expected) 提供了一个追踪异常的选项,让我们可以测试代码是否抛出了想要得到的异常。

示例:

    @Test(expected=ArithmeticException.class)public void testCase() {System.out.println("in test case 3");int a = 0;int b = 1 / a;  // 由于得到了一个预期异常,所以测试通过}

@RunWith

首先要分清几个概念:测试方法、测试类、测试集、测试运行器。

  • 测试方法就是用 @Test 注解的一些函数。
  • 测试类是包含一个或多个测试方法的一个 .java 文件。
  • 测试集是一个 suite,可能包含多个测试类。
  • 测试运行器则决定了用什么方式偏好去运行这些测试集/类/方法。

而 @Runwith 就是放在测试类名之前,用来确定这个类怎么运行的。也可以不标注,会使用默认运行器。常见的运行器有:

  • @RunWith(Parameterized.class):参数化运行器,配合 @Parameters 使用 JUnit 的参数化功能。
  • @RunWith(Suite.class):测试集运行器,如传入单个测试集。
  • @SuiteClasses({ATest.class, BTest.class, CTest.class}):测试集运行器,如传入测试类数组。
  • @RunWith(JUnit4.class):junit4 的默认运行器。
  • @RunWith(JUnit38ClassRunner.class):用于兼容 junit3.8 的运行器。
  • 一些其它运行器具备更多功能。例如 @RunWith(SpringJUnit4ClassRunner.class) 集成了 spring 的一些功能。

参数化测试

Junit4 引入了一个新的功能参数化测试。参数化测试允许开发人员使用不同的值反复运行同一个测试。

创建参数化测试的步骤如下:

  1. 为准备使用参数化测试的测试类指定特殊的运行器:org.junit.runners.Parameterized。
  2. 为测试类声明几个变量,分别用于存放期望值和测试所用数据。
  3. 为测试类声明一个带有参数的公共构造函数,并在其中为步骤二中声明的几个变量赋值。
  4. 为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters 修饰的,且返回值为 java.util.Collection 的公共静态方法,并在此方法中初始化所有需要测试的参数对。
  5. 编写测试方法,使用定义的变量作为参数进行测试。

案例:

package com.basetest;import org.junit.*;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;import java.util.Arrays;
import java.util.Collection;// 质数检查
class PrimeNumberChecker {public Boolean validate(final Integer parimeNumber) {for (int i = 2; i < (parimeNumber / 2); i++) {if (parimeNumber % i == 0) {return false;}}return true;}
}// 质数检查 测试类
@RunWith(Parameterized.class)
public class PrimeNumberCheckerTest {/*** 步骤二:声明变量*/private Integer inputNumber;private Boolean expectedResult;private PrimeNumberChecker primeNumberChecker;/*** 步骤三:为测试类声明一个带有参数的公共构造函数,为变量赋值(参数即对应参数化数据)*/public PrimeNumberCheckerTest(Integer inputNumber,Boolean expectedResult) {this.inputNumber = inputNumber;this.expectedResult = expectedResult;}/*** 步骤四:为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters 修饰的,且返回值为* java.util.Collection 的公共静态方法,并在此方法中初始化所有需要测试的参数对*   1)该方法必须由Parameters注解修饰2)该方法必须为 public static 的3)该方法必须返回 Collection 类型4)该方法的名字不做要求5)该方法没有参数*/@Parameterized.Parameterspublic static Collection primeNumbers() {return Arrays.asList(new Object[][]{{2, true},{6, false},{19, true},{22, false},{23, true}});}@Beforepublic void initialize() {primeNumberChecker = new PrimeNumberChecker();}/*** 步骤五:编写测试方法,使用自定义变量进行测试*/@Testpublic void testPrimeNumberChecker() {System.out.println("Parameterized Number is : " + inputNumber);Assert.assertEquals(expectedResult,primeNumberChecker.validate(inputNumber));}}

执行结果:

Parameterized Number is : 2
Parameterized Number is : 6
Parameterized Number is : 19
Parameterized Number is : 22
Parameterized Number is : 23

套件测试

“套件测试”是指捆绑了几个单元测试用例并运行起来。在JUnit中,@RunWith 和 @Suite 这两个注解可配合用来运行套件测试。

示例:

  • 测试类 1:
import org.junit.Test;public class JunitTest1 {@Testpublic void printMessage(){System.out.println("in JunitTest1");}
}
  • 测试类 2:
import org.junit.Test;public class JunitTest2 {@Testpublic void printMessage(){System.out.println("in JunitTest2");}
}
  • 测试集:
import org.junit.runner.RunWith;
import org.junit.runners.Suite;@RunWith(Suite.class)
@Suite.SuiteClasses({/*** 此处类的配置顺序会影响执行顺序*/JunitTest1.class,JunitTest2.class})
public class JunitSuite {}
  • 测试类执行结果:
in JunitTest1
in JunitTest2

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

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

相关文章

Python-TCP编程-UDP编程-SocketServer-IO各种概念及多路复用-asyncio-学习笔记

序 欠4前年的一份笔记 &#xff0c;献给今后的自己。 网络编程 Socket介绍 Socket套接字 Python中提供socket.py标准库&#xff0c;非常底层的接口库。 Socket是一种通用的网络编程接口&#xff0c;和网络层次没有一一对应的关系。 协议族 AF表示Address Family&#xff0c;用于…

Mybatis-开发一个类似mybatisplus的mybatis扩展,该怎么入手?

开发一个类似mybatisplus的mybatis扩展&#xff0c;该怎么入手&#xff1f; 要开发一个类似于 MyBatis-Plus 的 MyBatis 扩展框架&#xff0c;你需要从以下几个核心方面入手&#xff0c;逐步构建出一个功能完整、易用性强、兼容性好的增强型 MyBatis 框架。&#x1f9f1; 一、整…

深入了解linux系统—— 信号的捕捉

前言 信号从产生到处理&#xff0c;可以分为信号产生、信号保存、信号捕捉三个阶段&#xff1b;了解了信号产生和保存&#xff0c;现在来深入了解信号捕捉。 信号捕捉 对于1-31号普通信号&#xff0c;进程可以立即处理&#xff0c;也可以不立即处理而是在合适的时候处理&#x…

twikitFKS: 基于 twikit 2.3.1 的改进版本

twikitFKS: 基于 twikit 2.3.1 的改进版本 项目概述 关于 twikit twikit 是一个优秀的 Twitter API 爬虫库&#xff0c;它的核心优势在于无需 API Key即可访问 Twitter 功能。通过网页爬虫技术&#xff0c;twikit 实现了&#xff1a; 发布推文和媒体内容搜索推文和用户获取…

C Primer Plus 第6版 编程练习——第9章(下)

7.编写一个函数&#xff0c;从标准输入中读取字符&#xff0c;直到遇到文件结尾。程序要报告每个字符是否是字母。如果是&#xff0c;还要报告该字母在字母表中的数值位置。例如&#xff0c;c和C在字母表中的位置都是3。合并一个函数&#xff0c;以一个字符作为参数&#xff0c…

如何用文思助手改好一篇烂材料

在日常工作中&#xff0c;我们常常会遇到这样的问题&#xff1a;因为工作要使用到之前写的文章再看发现内容杂乱无章、或者收到的一些返稿内容质量差&#xff0c;不修改无法使用。但其实它们可能只是缺少了系统性的梳理与打磨。今天我们就来聊一聊&#xff0c;如何对一些不满意…

VSCODE常规设置

摘要&#xff1a;用于新下载的vscode设置一些个人化的操作在 "Files: Auto Save" 下拉菜单中&#xff0c;选择你想要的自动保存模式。常见的选项包括&#xff1a;"off"&#xff1a;禁用自动保存。 "afterDelay"&#xff1a;在你停止编辑一段时间…

2025秋招突围战:AI智能监考如何重构远程笔试公平防线?

2025秋招季即将来临&#xff0c;企业校招规模预计突破百万量级&#xff0c;远程笔试成为主流筛选方式。然而&#xff0c;传统监考模式暴露出作弊行为难追溯、人力成本过高、数据维度单一等痛点&#xff0c;让HR陷入“效率与公平”的两难困境。牛客AI智能监考系统&#xff0c;通…

Python 基础语法与数据类型(十三) - 实例方法、类方法、静态方法

文章目录1. 实例方法 (Instance Methods)1.1 特点与语法1.2 实例方法示例2. 类方法 (Class Methods)2.1 特点与语法2.2 类方法示例3. 静态方法 (Static Methods)3.1 特点与语法3.2 静态方法示例4. 三种方法的对比总结总结练习题练习题答案创作不易&#xff0c;请各位看官顺手点…

Wireshark的安装和基本使用

文章目录一、Wireshark介绍二、Wireshark安装三、Wireshark讲解1.界面介绍&#xff08;1&#xff09;分组列表&#xff08;2&#xff09;分组详情&#xff08;3&#xff09;分组字节流一、Wireshark介绍 Wireshark 是一款开源的网络协议分析工具&#xff0c;能够捕获、过滤和分…

[yotroy.cool] Git 历史迁移笔记:将 Git 项目嵌入另一个仓库子目录中(保留提交记录)

个人博客https://www.yotroy.cool/&#xff0c;感谢关注&#xff5e; 图片资源可能显示不全&#xff0c;请前往博客查看哦&#xff01; 说来惭愧&#xff0c;这篇是AI帮助我解决实际问题后&#xff0c;又生成的一篇博客&#xff0c;效率特别高。 在开发中&#xff0c;我们常会…

91套商业策划创业融资计划书PPT模版

创业融资计划书PPT模版&#xff0c;商业项目技术书PPT模版&#xff0c;商业创业计划书&#xff0c;商业融资企业宣传PPT模版&#xff0c;活动策划方案书PPT模版&#xff0c;IOS风格商业计划书PPT模版 91套商业策划创业融资计划书PPT模版&#xff1a;https://pan.quark.cn/s/739…

探秘阿里云通义九子:解锁AI无限可能

通义九子初印象在当今人工智能飞速发展的时代&#xff0c;阿里云通义九子宛如一颗璀璨的明星&#xff0c;闪耀在 AI 的浩瀚天空中。作为阿里云推出的一系列强大的人工智能模型&#xff0c;通义九子在自然语言处理、图像生成、智能客服等多个领域展现出了卓越的能力&#xff0c;…

Python网络爬虫之requests库

目录 一.网络爬虫的介绍 1.网络爬虫库 2.robot.txt规则 二.requests库 1.requests库的安装 2.get()函数 3.Response对象 Response的属性 设置编码 返回网页内容 text() content() 三.提交信息到网页 post()函数 四.会话与代理服务器 一.网络爬虫的介绍 1.网络爬虫…

区块链技术详解:从原理到应用

引言 区块链作为一项颠覆性技术&#xff0c;已从加密货币的基石演变为重塑多个行业的创新引擎。本文旨在深入解析其核心原理、关键特性、技术架构、主流应用及未来挑战。一、 区块链核心概念&#xff1a;超越加密货币的分布式账本 本质定义&#xff1a; 区块链是一个去中心化、…

用Finalshell连接服务器后出现文件目录不显示,且刷新报错空指针问题记录

修改SSH配置‌编辑sshd_config‌使用管理员权限编辑/etc/ssh/sshd_config文件&#xff0c;找到Subsystem相关配置。原配置为Subsystem sftp /usr/libexec/openssh/sftp-server使用“i”编辑文件将修改为Subsystem sftp internal-sftp修改完成后使用Esc命令&#xff0c;退出编辑…

C语言:游戏代码分享

小游戏分享 目录 小游戏分享 1.井字棋游戏 2.简单计算器游戏 3.猜单词 4.石头剪刀布游戏 5.猜数字游戏 1.井字棋游戏 「33 棋盘上的思维博弈&#xff01;与好友轮流落子&#xff0c;抢占先机&#xff0c;连成一线即可获胜。简单规则蕴含无限策略&#xff0c;展现你的战术…

深度学习入门-卷积神经网络(CNN)(下)

1-4、 深度学习入门-卷积神经网络&#xff08;CNN&#xff09;&#xff08;上&#xff09;-CSDN博客 5、 卷积神经网络&#xff08;CNN&#xff09;的实现 简单网络的构成是“Convolution - ReLU - Pooling - Affine - ReLU - Affine - Softmax”&#xff1a; 相关代码&#…

Java 大视界 -- Java 大数据在智能交通智能公交站台乘客流量预测与服务优化中的应用(349)

Java 大视界 -- Java 大数据在智能交通智能公交站台乘客流量预测与服务优化中的应用&#xff08;349&#xff09;引言&#xff1a;正文&#xff1a;一、Java 全场景韧性调度系统&#xff08;新增极端天气 车型适配&#xff09;1.1 极端天气&#xff1a;暴雪 / 台风的分钟级响应…

数论内容主要包括哪些

数论&#xff08;Number Theory&#xff09;是数学中研究整数的性质及其相互关系的一个分支&#xff0c;被誉为“数学中的皇后”。它历史悠久&#xff0c;内容丰富&#xff0c;既包含许多初等、直观的问题&#xff0c;也涉及高深、抽象的理论。数论的主要内容包括以下几个方面&…