【单元测试】Junit 4--junit4 内置Rule

1.0 Rules

​ Rules允许非常灵活地添加或重新定义一个测试类中每个测试方法的行为。测试人员可以重复使用或扩展下面提供的Rules之一,或编写自己的Rules。

1.1 TestName

​ TestName Rule使当前的测试名称在测试方法中可用。用于在测试执行过程中获取测试方法名称。在starting()中记录测试方法名,在getMethodName()中返回

例如:

import static org.junit.Assert.*;import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;public class NameRuleTest {@Rulepublic final TestName name = new TestName();@Testpublic void testA() {assertEquals("testA", name.getMethodName());}@Testpublic void testB() {assertEquals("testB", name.getMethodName());}
}

1.2 TemporaryFolder

​ TemporaryFolder Rule允许创建文件和文件夹,这些文件和文件夹在测试方法结束时被删除(无论通过还是失败)。默认情况下,如果资源不能被删除,则不会抛出异常。

import java.io.*;import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;public class HasTempFolder {@Rulepublic TemporaryFolder folder= new TemporaryFolder();@Testpublic void testUsingTempFolder() throws IOException {File createdFile = folder.newFile("myfile.txt");File createdFolder = folder.newFolder("subfolder");// ...}}

TemporaryFolder#newFolder(String… folderNames)可以根据输入的参数创建目录。如果是多级目录,可以递归创建。

TemporaryFolder#newFile()可以创建一个随机名字的临时文件;

TemporaryFolder##newFolder() 可以创建一个随机名字的临时目录。

1.3 ExternalResource

​ ExternalResource是一个规则(如TemporaryFolder)的基类,它在测试前设置了一个外部资源(一个文件、套接字、服务器、数据库连接等),并保证在测试后将其拆除。

可以设置测试前后需要做的事情(比如:文件、socket、服务、数据库的连接与关闭)。

 public static class UsesExternalResource {Server myServer = new Server();@Rulepublic ExternalResource resource = new ExternalResource() {@Overrideprotected void before() throws Throwable {myServer.connect();};@Overrideprotected void after() {myServer.disconnect();};};@Testpublic void testFoo() {new Client().run(myServer);}}

ExternalResource#before会在每个测试之前处理;#after会在每个测试之后处理;

关于ExternalResource与@Before已经@After等标记步骤的执行顺序,我们会在本文后面部分介绍。

1.4 ErrorCollector

ErrorCollector这个Rule,在出现一个错误后,还可以让测试继续进行下去。

他提供三个方法:

  • checkThat(final T value, Matcher matcher)
  • checkSucceeds(Callable callable)
  • addError(Throwable error)

前面两个是用来处理断言的,最后一个是添加错误至错误列表中。

看下面例子:

 package mytest;import static org.hamcrest.CoreMatchers.is;import static org.junit.Assert.assertThat;import java.util.concurrent.Callable;import org.junit.Rule;import org.junit.Test;import org.junit.rules.ErrorCollector;public class JUnitCoreErrorControllerRuleTest {private final int multiplesOf2[] = { 0, 2, 4, 7, 8, 11, 12 };@Rulepublic ErrorCollector errorCollector = new ErrorCollector();/** 下面这个测试,会报告两个failures。这一点和下面的checkSucceeds测试不同*/@Testpublic void testMultiplesOf2() {int multiple = 0;for (int multipleOf2 : multiplesOf2) {// Will count the number of issues in this list// - 3*2 = 6 not 7, 5*2 = 10 not 11 : 2 FailureserrorCollector.checkThat(2 * multiple, is(multipleOf2));multiple++;}}/** 下面代码中有两个断言会失败,但每次运行JUnit框架只会报告一个。这一点和上面的checkThat测试不同,可以对比一下。*/@Testpublic void testCallableMultiples() {errorCollector.checkSucceeds(new Callable<Object>() {public Object call() throws Exception {assertThat(2 * 2, is(5));assertThat(2 * 3, is(6));assertThat(2 * 4, is(8));assertThat(2 * 5, is(9));return null;}});}/** 下面运行时,会报告2个错误*/@Testpublic void testAddingAnError() {assertThat(2 * 2, is(4));errorCollector.addError(new Throwable("Error Collector added an error"));assertThat(2 * 3, is(6));errorCollector.addError(new Throwable("Error Collector added a second error"));}}

运行结果:

 Failed tests: testCallableMultiples(mytest.JUnitCoreErrorControllerRuleTest): Expected: is <5>but: was <4>testMultiplesOf2(mytest.JUnitCoreErrorControllerRuleTest): Expected: is <7>but: was <6>testMultiplesOf2(mytest.JUnitCoreErrorControllerRuleTest): Expected: is <11>but: was <10>Tests in error: testAddingAnError(tangzhi.mytest.JUnitCoreErrorControllerRuleTest): Error Collector added an errortestAddingAnError(tangzhi.mytest.JUnitCoreErrorControllerRuleTest): Error Collector added a second error

从这个例子,可以看出:

  • ErrorCollector#checkThat 会报告测试中的每一个failures
  • ErrorCollector#checkSucceeds 只会检查是否成功,如果不成功,只报告第一个导致不成功的failure
  • ErrorCollector#addError 是添加一个错误(error)。

1.5 Verifier

如果,你想在每个测试之后,甚至是在@After之后,想检查些什么,就可以使用Verifier这个Rule.

看例子:

 private static String sequence;public static class UsesVerifier {@Rulepublic Verifier collector = new Verifier() {@Overrideprotected void verify() {sequence += " verify ";}};@Testpublic void example() {sequence += "test";}@Testpublic void example2() {sequence += "test2";}@Afterpublic void after() {sequence += " after";}}@Testpublic void verifierRunsAfterTest() {sequence = "";assertThat(testResult(UsesVerifier.class), isSuccessful());assertEquals("test after verify test2 after verify ", sequence);}

从上面例子可以看出:Verifier#verify针对每个测试都会运行一次,并且运行在@After步骤之后。

需要说明:如果某测试出现失败(fail),那么这个测试之后就不会做verify,这一点,可以结合下面的例子看出

1.6 TestWatcher

对测试的每个步骤进行监控。

看例子:

 package tangzhi.mytest;import static org.junit.Assert.*;  import static org.hamcrest.CoreMatchers.*;import org.junit.After;import org.junit.Rule;import org.junit.Test;import org.junit.rules.TestRule;import org.junit.rules.TestWatcher;import org.junit.rules.Verifier;import org.junit.runner.Description;import org.junit.runners.model.Statement;public class WatchmanTest {private static String watchedLog;@Rulepublic TestRule watchman = new TestWatcher() {@Overridepublic Statement apply(Statement base, Description description) {Statement s = super.apply(base, description);watchedLog="";System.out.println("watch apply.");return s;}@Overrideprotected void succeeded(Description description) {watchedLog += description.getDisplayName() + " " + "success!";System.out.println("watch succeed:"+watchedLog);}@Overrideprotected void failed(Throwable e, Description description) {watchedLog += description.getDisplayName() + " " + e.getClass().getSimpleName();System.out.println("watch failed:"+watchedLog);}@Overrideprotected void starting(Description description) {super.starting(description);System.out.println("watch starting.");}@Overrideprotected void finished(Description description) {super.finished(description);System.out.println("watch finished.");}};@Rulepublic Verifier collector = new Verifier() {@Overrideprotected void verify() {System.out.println("@Verify:"+watchedLog);}};@Testpublic void fails() {System.out.println("in fails");assertThat("ssss", is("sss"));}@Testpublic void succeeds() {System.out.println("in succeeds");}@Afterpublic void after() {System.out.println("@After");}}

1.7 Timeout

对于添加了TimeoutRule 的测试类,当测试类中的测试方法执行超过TimeoutRule 配置的时间时,测试方法执行就会被标记为失败

public class TimeoutRuleTest {@Rulepublic Timeout globalTimeout = Timeout.seconds(5);@Testpublic void timeout() throws InterruptedException {TimeUnit.SECONDS.sleep(10);}@Testpublic void onTime() throws InterruptedException {TimeUnit.SECONDS.sleep(2);}}

执行上面测试用例,onTime方法执行通过,timeout()方法则抛出TestTimedOutException:

org.junit.runners.model.TestTimedOutException: test timed out after 5 seconds

还有很多Rule就不一一介绍了

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

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

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

相关文章

计算机网络实验实验之VLAN的配置与分析

实验目的 了解什么是带内管理&#xff1b;熟练掌握如何使用telnet方式管理交换机&#xff1b;熟练掌握如何为交换机设置web方式管理&#xff1b;熟练掌握如何进入交换机web管理方式&#xff1b;了解交换机web配置界面&#xff0c;并能进行部分操作。 (6)了解VLAN原理&#xf…

不敢说懂你 - Glide硬核源码剖析

问题 Glide加载流程? Glide整体架构? Glide数据加载的来源? Glide缓存加载的流程? Glide线程切换原理? Glide如何感知Activity? Glide哪种情况会返回应用级的RequestManager? … 带着一些问题去阅读… 使用示例 本篇主要基于glide:4.12.0进行分析。下面是Gli…

PyQt6实战7--文本编辑器

一个简单的文本编辑器 features: 1.open 一个文件夹作为项目 2.save 保存当前窗口的内容 3.退出 4.双击文件可以打开文件内容 5.简单的python高亮 6.双击相同文件&#xff0c;会找到之前打开过的文件 打开一个文件夹 打开项目&#xff0c;双击打开文件 保存 代码&#xf…

CSRF漏洞

文章目录 目录 文章目录 一.什么是CSRF 二.CSRF漏洞工作原理 一.什么是CSRF CSRF&#xff08;Cross-Site Request Forgery&#xff09;漏洞&#xff0c;也被称为跨站请求伪造漏洞&#xff0c;是一种Web应用程序安全漏洞。当受害者在已经登录了某个网站的情况下&#xff0c;访问…

吴恩达机器学习笔记 三十五 异常检测与监督学习

什么时候选择异常检测&#xff1f; 正样本 ( y 1 ) 的数量非常少 负样本 ( y 0 ) 的数量非常多 有很多不同的异常&#xff0c;现有的算法不能从正样本中得知什么是异常&#xff0c;或未来可能出现完全没见过的异常情况。 例如金融欺诈&#xff0c;隔几个月或几年就有新的…

java+idea+mysql采用医疗AI自然语言处理技术的3D智能导诊导系统源码

javaideamysql采用医疗AI自然语言处理技术的3D智能导诊导系统源码 随着人工智能技术的快速发展&#xff0c;语音识别与自然语言理解技术的成熟应用&#xff0c;基于人工智能的智能导诊导医逐渐出现在患者的生活视角中&#xff0c;智能导诊系统应用到医院就医场景中&#xff0c…

jvm-接口调用排查

问题描述 线上碰到个问题&#xff0c;某个接口调用时间特别长&#xff0c;线上调用接口直接报gateway time out 分析处理 1、先关闭该功能 &#xff08;该功能是非核心功能&#xff09; 2、本地起服务连环境排查&#xff0c;发现本地正常。并且线上其他接口正常&#xff0c;…

顺序表复习(C语言版)

数据结构是什么&#xff1f; 数据结构就是为了把数据管理起来&#xff0c;方便我们的增删查改 数据结构是计算机存储、组织数据的方式 数组就是一种最基础的数据结构 顺序表是什么&#xff1f; 顺序表就是数组 Int arr[100] {1,2,3,4,5,x,……} 修改某个数据&#xff1a…

Mac下删除旧版本.net sdk

参照微软官网给的方法,Releases dotnet/cli-lab (github.com) 好像不能直接的解决问题,我做一下补充,希望对需要删除旧版本sdk的小伙伴们有所帮助 1:下载工具包 Releases dotnet/cli-lab (github.com) 2:打开终端,cd切换到该文件的制定目录 3:然后按照提示一步步执行…

java核心类

一,String字符串 1.1,String字符串是引用类型,且不可变 String str1 "Hello";String str2 str1.concat(" World"); // 使用concat方法连接字符串&#xff0c;返回一个新的字符串对象System.out.println(str1); // 输出&#xff1a;Hello&#xff0c;原始…

C语言:复习

文章目录 思维导图数组和指针库函数的模拟实现判断大小端 最近知识学的差不多了&#xff0c;因此开始复习&#xff0c;本篇开始的是对于C语言的复习 思维导图 下面就依据下图&#xff0c;进行内容的整理 数组和指针 这个模块算是C语言中比较大的一个模块了&#xff0c;具体概…

流媒体协议--RTMP

文章目录 RTMP播放基本流程TCP握手过程RTMP握手过程connect连接createStream 创建流play 播放命令deleteStream删除流RTMP数据组成 RTMP(Real Time Messaging Protocol)是一个应用层协议&#xff0c;主要用于在Flash player和服务器之间传输视频、音频、控制命令等内容。 该协议…

【笔试强训_Day06】

文章目录 1.字符串相乘 1.字符串相乘 题目链接 解题思路&#xff1a; 高精度乘法&#xff0c;注意要学会下面这种列式相乘的形式&#x1f34e; 注意细节❗&#xff1a; ① &#x1f34e; 首先把列式相乘的数据都存放到数组中去&#xff0c; 然后再对数组中的数据进行取余进…

C++:运算符重载和“const”成员

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;运算符重载》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 赋值运算符重载1. 运算符重载2.赋值运算符重载第一个点第二个点&…

迅雷下载不了的资源怎么下载?

我想下载Boost库&#xff0c;但是下载不下来 用迅雷下载是一直卡在0k 后来尝试在centos上用wget进行下载&#xff0c;竟然可以 wget https://boostorg.jfrog.io/artifactory/main/release/1.85.0/source/boost_1_85_0.tar.gz

揭开ChatGPT面纱(一):准备工作(搭建开发环境运行OpenAI Demo)

文章目录 序言&#xff1a;探索人工智能的新篇章一、搭建开发环境二、编写并运行demo1.代码2.解析3.执行结果 本博客的gitlab仓库&#xff1a;地址&#xff0c;本博客对应01文件夹。 序言&#xff1a;探索人工智能的新篇章 随着人工智能技术的飞速发展&#xff0c;ChatGPT作为…

2024燃动智火-业务视角的中国企业AI+学习发展报告

来源&#xff1a;新华三 学习型组织的数字化转型是众多企业关注的焦点&#xff0c;数字战略需要人才升级&#xff0c;数字 化学习加速人才培养。AI 技术在学习中的运用&#xff0c;为企业学习型组织的数字化转型插 上了飞翔的翅膀。这份报告解码了AI 时代企业的学习发展&#…

混合现实(MR)开发框架

混合现实&#xff08;MR&#xff09;开发框架为开发者提供了构建MR应用程序所需的基本工具和功能。它们通常包括3D引擎、场景图、输入系统、音频系统、网络功能以及支持同时处理现实世界和虚拟世界信息的功能。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&…

springboot+ssm基于Java的小型企业银行账目管理系统代码Lw

本毕业设计课题要求学生基于软件工程方法&#xff0c;根据课题的需求&#xff0c;给出小型企业银行账目管理系统概要设计、详细设计、数据库的设计以及系统实现和测试&#xff0c;并撰写规范的毕业设计说明书。该系统的主要模块有&#xff1a;系统管理、帐目管理、查询统计、用…

如何使用 ArcGIS Pro 制作边界晕渲效果

在某些出版的地图中&#xff0c;边界有类似于“发光”的晕渲效果&#xff0c;这里为大家介绍一下如何使用ArcGIS Pro 制作这种晕渲效果&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的行政区划数据&#xff0c;除了行政区划数据&#xff0c…