junit规则_jUnit:规则

junit规则

规则在测试,测试用例或测试套件周围增加了特殊处理。 他们可以对该类中的所有测试执行通用的其他验证,并发运行多个测试实例,在每个测试或测试用例之前设置资源,然后在之后拆除它们。

该规则可以完全控制将要应用到的测试方法,测试用例或测试套件。 完全控制意味着规则决定运行它之前和之后要做什么以及如何处理抛出的异常。

第一章介绍了如何使用规则,第二章介绍了内置规则可以做什么。 第三章介绍了我发现的第三方规则库,最后一章介绍了如何创建新规则。

使用规则

本章说明如何在测试用例中声明和使用规则。 大多数规则可以分别应用于每种测试方法,一次应用于整个测试用例,一次应用于整个测试套件。 为每个测试单独运行的规则称为测试规则,应用于整个测试用例或套件的规则称为类规则。

我们将以临时文件夹规则为例,因此第一个子章节将说明它的作用。 第二小节将其声明为测试规则,第三小节将其声明为类规则。 最后一个子章节显示了如何从测试内部访问该文件夹。

规则示例–临时文件夹

临时文件夹规则创建一个新的空文件夹,运行测试或测试用例,然后删除该文件夹。 您可以指定在哪里创建新文件夹,也可以在系统临时文件目录中创建它。

临时文件夹既可以用作测试规则,也可以用作类规则。

声明测试规则

测试规则(例如,针对每种测试方法分别运行的规则)必须在带有@Rule注释的公共字段中声明。

声明测试规则:

public class SomeTestCase {@Rulepublic TemporaryFolder folder = new TemporaryFolder();
}

上面的folder规则会在每种测试方法之前创建一个新文件夹,然后将其销毁。 所有测试都可以使用该目录,但不能通过该目录共享文件。 由于我们使用的构造函数没有参数,因此该文件夹将在系统临时文件目录中创建。

测试规则在使用@Before注释的方法之前和之后使用@After注释的方法之前进行工作。 因此,他们也将有权访问临时文件夹。

宣布班级规则

类规则(例如,针对整个测试用例或测试套件运行一次的规则)必须在公共静态字段中声明,并使用@ClassRule注释进行注释。

声明测试用例规则:

public class SomeTestCase {@ClassRulepublic static TemporaryFolder folder = new TemporaryFolder();
}

上面的folder规则在运行第一个测试方法之前创建一个新文件夹,并在最后一个测试方法之后销毁它。 所有测试都可以使用该目录,并且可以查看以前运行的测试所创建的文件。

类规则在该类内部的任何内容之前运行。 例如,用@BeforeClass@AfterClass注释的方法也可以访问临时文件夹。 该规则在它们之前和之后运行。

在测试中使用规则

规则是任何其他类,测试可以自由调用其公共方法并使用其公共字段。 这些调用用于将测试特定的配置添加到规则或从中读取数据。

例如,可以使用newFilenewFoldergetRoot方法访问临时文件夹。 前两个在临时文件夹中创建新文件或文件夹,而getRoot方法返回临时文件夹本身。

创建临时文件和文件夹:

@Test
public void test1() {// Create new folder inside temporary directory. Depending on how you // declared the folder rule, the directory will be deleted either // right after this test or when the last test in test case finishes.File file = folder.newFolder("folder");
}@Test
public void test2() {// Create new file inside temporary folder. Depending on how you // declared the folder rule, the file will be deleted either // right after this test or when the last test in test case finishes.File file = folder.newFile("file.png");
}

默认规则

JUnit带有五个直接可用的规则 :临时文件夹,预期的异常,超时,错误收集器和测试名称。 临时文件夹已在上一章中进行了说明,因此我们将仅简要介绍其余四个规则。

预期异常

预期异常将运行测试并捕获其引发的所有异常。 该规则能够检查异常是否包含正确的消息,正确的原因以及是否由正确的行抛出。

预期的异常具有私有构造函数,必须使用静态none方法进行初始化。 每个异常引发测试都必须配置预期的异常参数,然后调用规则的expect方法。 该规则在以下情况下失败:

  • 测试在expect方法调用之前引发任何异常,
  • expect方法调用之后,测试不会引发异常,
  • 引发的异常没有正确的消息,类或原因。

最后一条测试行引发异常。 在导致异常之前立即配置了预期的异常规则:

@Rule
public ExpectedException thrown= ExpectedException.none();@Test
public void testException() {// Any exception thrown here causes failuredoTheStuff();// From now on, the rule expects NullPointerException exception// to be thrown. If the test finishes without exception or if it // throws wrong one, the rule will fail.thrown.expect(NullPointerException.class);// We well check also messagethrown.expectMessage("Expected Message.");// this line is supposed to throw exceptiontheCodeThatThrowsTheException();
}

奖励:预期的消息方法也接受hamcrest匹配器参数。 这样,您就可以测试消息前缀后缀是否与某些正则表达式匹配。

超时

超时规则可以同时用作测试规则和类规则。 如果将其声明为测试规则,则它将相同的超时限制应用于该类中的每个测试。 如果将其声明为类规则,则它将超时限制应用于整个测试用例或测试套件。

错误收集器

通过错误收集器,您可以在测试内部运行多个检查,然后在测试结束后立即报告所有失败。

期望值与实际值的断言使用规则公开的checkThat方法进行评估。 它接受hamcrest匹配器作为参数,因此可以用来检查任何内容。

可以使用addError(Throwable error)方法直接报告意外异常。 或者,如果有要运行的Callable实例,则可以通过checkSucceeds方法调用它, checkSucceeds方法将所有抛出的异常添加到错误列表中。

测试名称

测试名称规则在测试内部公开测试名称。 当您需要创建自定义错误报告时,它可能会很有用。

第三方规则库

规则与测试类分离,因此很容易编写通用规则库并在项目之间共享它们。 本章介绍了三个这样的库。

系统规则是用于测试使用java.lang.System的代码的规则集合。 它有充分的文档证明,可在maven中使用,并根据Common Public License 1.0(与jUnit相同)发布。 系统规则使您可以轻松:

  • 测试System.errSystem.out内容,
  • 模拟System.in输入,
  • 配置系统属性并将其值还原回
  • 测试System.exit()调用–是否被调用以及返回的值是什么,
  • 自定义Java SecurityManager并将其还原。

一个大集的有用的规则是可以在GitHub上aisrael帐户。 它的文档有所限制,但是您可以随时查看代码 。 所有规则均根据MIT许可发布:

  • 启动和停止内存中的derby数据库 ,
  • 启动和停止默认的Java HttpServer ,
  • 启动和停止Jetty服务器,
  • 运行存根jndi ,
  • 对dbUnit测试的一些支持。

github上另一套未公开的规则。 我不会在这里列出它们,因为它们的名称是不言自明的,并且它们没有指定的许可证。 查看规则目录以查看其列表。

自订规则

本章介绍如何创建新规则。 可以通过实现TestRule接口或扩展TestRule提供的两个便捷类ExternalResourceVerifier之一来从头实现它们。

我们将从头开始创建一个新规则,然后使用ExternalResource类重写它。

新规则

新规则可确保在每个测试完成工作后,正确删除由测试创建的所有文件。 测试本身仅具有一项责任:使用规则公开的ensureRemoval(file)方法报告所有新文件。

如何声明和使用DeleteFilesRule规则:

@Rule
public DeleteFilesRule toDelete = new DeleteFilesRule();@Test
public void example() throws IOException {// output.css will be deleted whether the test passes, fails or throws an exceptiontoDelete.ensureRemoval("output.css");// the compiler is configured to create output.css filecompileFile("input.less");checkCorrectess("output.css");
}

从头开始

每个规则(包括类规则)必须实现@TestRule接口。 该接口只有一种方法:

public interface TestRule {Statement apply(Statement base, Description description);
}

我们的工作是获取base参数中提供的语句,然后将其转换为另一个语句。 该语句表示一组要运行的动作,例如测试,测试用例或测试套件。 它可能已经被其他声明的规则修改,并且包括在测试或类方法之前和之后。

第二个description参数描述输入语句。 它可以告诉测试类名称,测试名称,放置在其上的注释,它知道我们是在处理测试还是在测试套件等。我们将不需要它。

我们需要创建一个新的语句,它将执行三件事:

  • 清空要删除的文件列表。
  • 运行底层测试,测试案例或测试套件由所表示的base参数。
  • 删除先前运行的语句中测试报告的所有文件。

该语句是具有一个抽象方法的类:

public abstract class Statement {public abstract void evaluate() throws Throwable;
}

由于基础语句可能引发异常,因此删除所有文件的代码必须在finally块中运行:

public class DeleteFilesRule implements TestRule  {public Statement apply(final Statement base, final Description description) {return new Statement() {@Overridepublic void evaluate() throws Throwable {emptyFilesList(); // clean the list of filestry {base.evaluate(); // run underlying statement} finally {removeAll(); // delete all new files}}};}
}

引用的方法emptyFilesListremoveAll都在new语句外部,直接在DeleteFilesRule类内部声明:

public class DeleteFilesRule implements TestRule  {private List<File> toDelete;private void emptyFilesList() {toDelete = new ArrayList<File>();}private void removeAll() {for (File file : toDelete) {if (file.exists())file.delete();}}/* ... the apply method ... */
}

我们需要的最后一件事是能够添加要删除的文件的公共方法:

public void ensureRemoval(String... filenames) {for (String filename : filenames) {toDelete.add(new File(filename));}
}

全班

public class DeleteFilesRule implements TestRule  {private List<File> toDelete;public void ensureRemoval(String... filenames) {for (String filename : filenames) {toDelete.add(new File(filename));}}private void emptyFilesList() {toDelete = new ArrayList<File>();}private void removeAll() {for (File file : toDelete) {if (file.exists())file.delete();}}public Statement apply(final Statement base, final Description description) {return new Statement() {@Overridepublic void evaluate() throws Throwable {emptyFilesList(); // clean the list of filestry {base.evaluate(); // run underlying statement} finally {removeAll(); // delete all new files}}};}
}

扩展内置类

JUnit包含两个便捷类ExternalResourceVerifier旨在进一步简化上述过程。

外部资源

当您需要围绕基础测试语句进行某种预处理和后处理时, ExternalResource帮助。 如果需要预处理,请覆盖before方法。 如果需要后处理,请覆盖after方法。 的
从finally块调用after ,无论如何它将运行。

我们的DeleteFilesRule可以这样重写:

public class DeleteFilesRule2 extends ExternalResource  {/* ... list, ensureRemoval and removeAll methods ... */@Overrideprotected void before() throws Throwable {toDelete = new ArrayList<File>();}@Overrideprotected void after() {removeAll();}}

验证者

Verifier者只有一种verify要覆盖的方法。 只有在包装测试未引发异常后,该方法才会运行。 顾名思义,如果您想在测试后进行其他检查,则验证程序是不错的选择。

有关jUnit的更多信息

关于jUnit 4功能的上一篇文章:

  • jUnit:动态测试生成

翻译自: https://www.javacodegeeks.com/2014/09/junit-rules-2.html

junit规则

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

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

相关文章

mysql中创建唯一索引的关键字_mysql中唯一索引的关键字是什么

mysql中唯一索引的关键字是unique index。创建唯一索引可以避免数据出现重复。唯一索引可以有多个&#xff0c;但索引列的值必须唯一&#xff0c;索引列的值允许有空值。创建唯一索引可以使用关键字UNIQUE随表一同创建。mysql中唯一索引的关键字是unique index。(推荐教程&…

奇迹觉醒qq服务器比微信少,十年内最大的奇迹!功能比QQ还少的微信为什么能成功?...

今天&#xff0c;微信迎来了自己2021年的第一次「翻车」——2021年1月18日下午2点前后&#xff0c;「由于系统抖动原因」部分微信用户无法及时收取微信消息。截止下午3点19分&#xff0c;故障已被修复。其实微信曾面临过几次信息服务中断的事故&#xff1a;2013年&#xff0c;微…

从fork-join /线程池调用的Singelton bean中的访问spring请求范围缓存

问题&#xff1a; 启用了Spring且将范围设置为Request的缓存需要由不在请求范围内的singleton bean访问。 解&#xff1a; Spring使您能够创建缓存&#xff0c;该缓存为请求范围保留数据。 例如 import org.springframework.cache.concurrent.ConcurrentMapCache; import org…

linux终止mysql进程_Ubuntu Linux下定时监测MySQL进程终止时自动重启的方法

前言最近发现MySQL服务隔三差五就会挂掉&#xff0c;导致我的网站和爬虫都无法正常运作。自己的网站是基于MySQL&#xff0c;在做爬虫存取一些资料的时候也是基于MySQL&#xff0c;数据量一大了&#xff0c;MySQL它就有点受不了了&#xff0c;时不时会崩掉&#xff0c;虽然我自…

系统错误null是什么意思_为什么NULL是错误的?

系统错误null是什么意思Java中NULL用法的简单示例&#xff1a; public Employee getByName(String name) {int id database.find(name);if (id 0) {return null;}return new Employee(id); }这种方法有什么问题&#xff1f; 它可能返回NULL而不是对象-这是错误的。 在面向对…

mysql数据库版本不同_mysql数据库版本不同所引起的问题

1.sql_mode不同所引起的问题mysql5.7 ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column lhh.lhh.id which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode…

线性搜索或顺序搜索算法在Java中如何工作? 示例教程

大家好&#xff0c;我之前谈到了二进制搜索算法的工作原理&#xff0c;并分享了在Java中实现二进制搜索的代码。 在那篇文章中&#xff0c;有人问我是否还存在其他搜索算法&#xff1f; 如果数组中的元素未排序&#xff0c;又如何使用二进制搜索算法&#xff0c;该如何搜索呢&a…

junit规则_JUnit规则

junit规则介绍 在本文中&#xff0c;我想展示一个示例&#xff0c;说明如何使用JUnit Rule简化测试。 最近&#xff0c;我继承了一个相当复杂的系统&#xff0c;并未对所有内容进行测试。 甚至经过测试的代码也很复杂。 通常&#xff0c;我看到缺乏测试隔离。 &#xff08;我将…

mysql server 5.0安装教程_MySQL Server 5.0安装教程

运行MySQL Server 5.0安装程序“setup.exe”&#xff0c;出现如下界面&#xff1a;安装向导启动&#xff0c;按“Next”继续&#xff1a;选择安装类型&#xff0c;为了方便熟悉安装过程&#xff0c;我们选择“Custom”。按“Next”继续&#xff1a;在“Developer Components”上…

Kubernetes集群上的Apache Ignite和Spring第2部分:Kubernetes部署

以前&#xff0c;我们已经成功创建了第一个由Apache Ignite支持的Spring boot Application。 在此博客上&#xff0c;我们将重点介绍Kubernetes方面需要做的事情&#xff0c;以便能够启动我们的应用程序。 如先前博客所述&#xff0c;我们需要制定我们的Kubernetes RBAC策略。…

centos6.5 安装多个mysql_在centos6,5(64位)系统安装多实例mysql5.6

首先你安装个单实例的mysql试一试一 检查你电脑之前是否装了mysqlrpm -qa | grep mysql这条命令只是查看你系统是否使用过yum或者rpm包安装mysql&#xff0c;对用源码包安装的mysql是查不到的&#xff0c;所以基本用不到二 安装编译所需的包yum -y install make gcc-c cmake bi…

hibernate jpa_JPAHibernate替代方案。 如果JPA或Hibernate对于我的项目而言不够好,该怎么办?...

hibernate jpa你好&#xff01;你好吗&#xff1f; 今天我们将讨论不建议使用JPA / Hibernate的情况。 在JPA领域之外&#xff0c;我们还有哪些选择&#xff1f; 我们将谈论的是&#xff1a; JPA /Hibernate问题 解决一些JPA /Hibernate问题的方法 选择此处描述的框架的标准…

mysql中常见查询表_MySQL中常见查询

1 --1、查询“001”课程比“002”课程成绩高的所有学生的学号&#xff1b;2 SELECT a.s FROM sc a,sc b WHERE a.sb.s AND a.c1 AND b.c2 AND a.score >b.score;3 --2、查询平均成绩大于60分的同学的学号和平均成绩&#xff1b;4 SELECT student.s,avg(score) FROM student,…

约束流–没有Drools规则语言的现代Java约束

传统上&#xff0c;要使用OptaPlanner进行扩展&#xff0c;您必须学习DRL。 不再。 借助受Java 8 Streams和SQL启发的新Constraints Streams API&#xff0c;您现在可以用Java &#xff08;或Kotlin或Scala&#xff09; 编写约束&#xff0c;并且仍然可以从增量计算中受益。 在…

mysql数据库杀掉堵塞_Mysql解决USE DB堵塞详解

遇到故障&#xff0c;我们往往想的是如何解决这个故障&#xff0c;而不是从故障的根本去思考出现这个故障的原因&#xff1f;这样的结果&#xff0c;只能使我们得到了鱼&#xff0c;失去了渔。今天&#xff0c;我们就来分享一个由USE DB堵塞故障引发的思考案例。故障描述今天一…

java拦截器项目应用_使用拦截器分析Java EE应用程序的性能下降/提高

java拦截器项目应用在开发具有某些性能要求的Java EE应用程序时&#xff0c;必须在每个发行版之前验证是否满足这些要求。 您可能会想到&#xff0c;哈德森的一项工作每天晚上在某些特定的硬件平台上执行一系列测试测量。 您可以检查已实现的时间并将它们与给定的要求进行比较…

iis web.config 配置 经典模式_django部署在iis下,webconfig错误

django部署在iis下&#xff0c;webconfig错误错误原因&#xff1a;iis7以后&#xff0c;web.config管理机制更安全了默认情况下&#xff0c;会锁住配置项&#xff0c;不许修改怎么办&#xff1f;如何求解以上问题呢&#xff1f;D:django_websiteshello>%windir%C:Windows 不…

如何在Java中验证电话号码(正则表达式+ Google libphonenumber)

关于如何在不同国家&#xff08;例如美国&#xff0c;美国&#xff09;使用Java验证电话号码的快速指南。 带有正则表达式和Google libphonenumber API的示例程序。 1.简介 在本教程中&#xff0c;我们将学习如何在java中验证电话号码 。 这主要是为了验证美国和印度的国家/地…

mysql该账户已存在_mysql 查看函数的所属用户和已存在的函数

复现方式&#xff1a;Delete FROM user Where Usertest and Host%;flush privileges;修复流程&#xff1a;1.用root用户删除两个函数&#xff0c;语句分别为DROP FUNCTION IF EXISTS currval;DROP FUNCTION IF EXISTS nextval;2.然后用程序用户(sharding_slave)创建函数&#x…

joo工作流_不要错过使用jOOλ或jOOQ编写Java 8 SQL单行代码的机会

joo工作流越来越多的人通过为他们的业务采用功能性编程来赶上我们平台的最新更新。 在Data Geekery &#xff0c;我们将Java 8用于jOOQ集成测试&#xff0c;因为将新的Streams API与lambda表达式一起使用使生成临时测试数据变得非常容易。 但是&#xff0c; 我们并不认为JDK提…