junit白盒测试 案例_JUnit通过失败测试案例

junit白盒测试 案例

为什么要建立一种预期测试失败的机制?

有一段时间,人们会希望并期望JUnit @Test案例失败。 尽管这种情况很少见,但确实发生了。 我需要检测JUnit测试何时失败,然后(如果期望的话)通过而不是失败。 具体情况是我正在测试一段代码,该代码可能会在对象调用内引发Assert错误。 该代码被编写为对流行的新Fest Assertions框架的增强,因此,为了测试功能,人们希望测试用例会故意失败。

一个办法

一种可能的解决方案是将JUnit @Rule提供的功能与注释形式的自定义标记一起使用。

为什么要使用@Rule?

@Rule对象为测试类和每个测试用例提供了类似于AOP的接口。 在运行每个测试用例之前,将重置规则,并且它们以@Around AspectJ建议的方式公开测试用例的工作方式。

必需的代码元素

  • @Rule对象检查每个@Test用例的状态
  • @ExpectedFailure自定义标记注释
  • 测试用例证明代码有效!
  • 如果带注释的测试用例没有失败,则抛出可选的特定异常

注意:工作代码在我的github页面上可用,并且已添加到Maven Central中。 随意分叉项目并提交拉取请求 Maven用法

<dependency><groupId>com.clickconcepts.junit</groupId><artifactId>expected-failure</artifactId><version>0.0.9</version>
</dependency>

用法示例

在此示例中,“ exception”对象是Fest断言增强的ExpectedException(请查看我的下一篇文章以展示此功能)。 预期的异常将产生断言,并且为了测试这些断言,必须将测试用例标记为@ExpectedFailure

public class ExceptionAssertTest {@Rulepublic ExpectedException exception = ExpectedException.none();@Rulepublic ExpectedTestFailureWatcher watcher = ExpectedTestFailureWatcher.instance();@Test@ExpectedFailure('The matcher should fail becasue exception is not a SimpleException')public void assertSimpleExceptionAssert_exceptionIsOfType() {// expected exception will be of type 'SimpleException'exception.instanceOf(SimpleException.class);// throw something other than SimpleException...expect failurethrow new RuntimeException('this is an exception');}
}

解决方案的实施

提醒一下,最新代码可在我的github页面上找到 。

@规则代码(ExpectedTestFailureWatcher.java)

import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
// YEAH Guava!!
import static com.google.common.base.Strings.isNullOrEmpty;public class ExpectedTestFailureWatcher implements TestRule {/*** Static factory to an instance of this watcher** @return New instance of this watcher*/public static ExpectedTestFailureWatcher instance() {return new ExpectedTestFailureWatcher();}@Overridepublic Statement apply(final Statement base, final Description description) {return new Statement() {@Overridepublic void evaluate() throws Throwable {boolean expectedToFail = description.getAnnotation(ExpectedFailure.class) != null;boolean failed = false;try {// allow test case to executebase.evaluate();} catch (Throwable exception) {failed = true;if (!expectedToFail) {throw exception; // did not expect to fail and failed...fail}}// placed outside of catchif (expectedToFail && !failed) {throw new ExpectedTestFailureException(getUnFulfilledFailedMessage(description));}}/*** Extracts detailed message about why test failed* @param description* @return*/private String getUnFulfilledFailedMessage(Description description) {String reason = null;if (description.getAnnotation(ExpectedFailure.class) != null) {reason = description.getAnnotation(ExpectedFailure.class).reason();}if (isNullOrEmpty(reason)) {reason = 'Should have failed but didn't';}return reason;}};}
}


@ExpectedFailure定制注释(ExpectedFailure.java)

import java.lang.annotation.*;/*** Initially this is just a marker annotation to be used by a JUnit4 Test case in conjunction* with ExpectedTestFailure @Rule to indicate that a test is supposed to be failing*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value = ElementType.METHOD)
public @interface ExpectedFailure {// TODO: enhance by adding specific information about what type of failure expected//ClassassertType() default Throwable.class;/*** Text based reason for marking test as ExpectedFailure* @return String*/String reason() default '';
}

自定义异常(可选,您可以轻松地抛出RuntimeException或现有的自定义异常)

public class ExpectedTestFailureException extends Throwable {public ExpectedTestFailureException(String message) {super(message);}
}

一个人不能利用预期的故障标记能力吗?

强大的功能伴随着巨大的责任 ,建议您如果不完全了解测试失败的原因,请勿将测试标记为@ExpectedFailure。 建议谨慎执行此测试方法。 请勿使用@ExpectedFailure注释替代@Ignore

未来可能的增强可能包括指定在测试用例执行期间确定的特定断言或特定消息的方法。

已知的问题

在此当前状态下,@ ExpectedFailure批注可以掩盖其他声明,并且在以后的增强功能到位之前,建议您明智地使用此方法。

参考:在Mike的站点博客上,允许JUnit测试通过我们的JCG合作伙伴 Mike的失败测试案例 。


翻译自: https://www.javacodegeeks.com/2012/09/junit-pass-test-case-on-failures.html

junit白盒测试 案例

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

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

相关文章

局域网共享问题全方位解决

声明&#xff1a;这不是共享组建教程&#xff0c;而是问题解决。如果你对共享一直搞不清&#xff0c;那么你可以花一至几小时的时间来看这篇文章&#xff0c;我相信以后共享问题你基本上都能解决。 看过了很多人写共享教程&#xff0c;看过了更多人写共享问题解决。可是&#x…

Oracle SQL中实现indexOf和lastIndexOf功能

Oracle SQL中实现indexOf和lastIndexOf功能 https://www.2cto.com/database/201305/210470.html转载于:https://www.cnblogs.com/diyunpeng/p/9884387.html

Linux静态库和动态库学习总结

一、废话 之前由于工作需要&#xff0c;要封装一个Linux加密解密转换的动态库&#xff0c;这个之前只做过Windows下面的&#xff0c;Linux下面还真没有做过&#xff0c;之后做了整一个晚上才算做好&#xff0c;不过其中也学到了不少东西&#xff0c;包括Linux下的动态库和静态库…

Java Date Nuances的痛苦提醒

这些天&#xff0c;我不再需要使用java.util.Date了&#xff0c;但是最近选择这样做&#xff0c;这让我想起了使用与Java Date关联的API的痛苦 。 在这篇文章中&#xff0c;我看了弃用的参数化Date构造函数的一些令人惊讶的API期望&#xff0c;该构造函数接受六个整数 。 在20…

python 与别的程序通信_《Python》进程之间的通信(IPC)、进程之间的数据共享、进程池...

一、进程间通信---队列和管道&#xff08;multiprocess.Queue、multiprocess.Pipe&#xff09; 进程间通信&#xff1a;IPC&#xff08;inter-Process Communication&#xff09; 1、队列 概念介绍&#xff1a; 创建共享的进程队列&#xff0c;Queue是多进程的安全的队列&#…

Matlab里evalin和assignin的用法

原文地址&#xff1a;Matlab里evalin和assignin的用法作者&#xff1a;了凡春秋assignin与evalin MATLAB通常的基本工作空间是base空间。MATLAB在程序运行过程中&#xff0c;将为每个函数分配它自己的函数工作空间&#xff08;从基本空间中分割出的一块&#xff0c; 以函数…

判断一个程序员水平高低的标准?

a.结果导向 胜者为王&#xff0c;败者为寇。也可以理解为做过什么NB的项目&#xff0c;带来了多少价值。b.竞赛比武 在同一平台下&#xff0c;大家八仙过海各显神通。c.广度和深度 在平时工作或交谈中&#xff0c;逼格最高者被大家膜拜。d.熟练度 …

git编辑器选哪个_[Git]Git创建和修改代码库

有了上一篇的简易Git使用指南&#xff0c;接下来我们就可以创建自己的代码库了创建代码库1.把文件夹变成git文件夹git init 这样子就这里面的内容就可以git了2.把要git的文件放入暂存区 git有三个空间: Working Directory工作区&#xff0c;Staging Area暂存区&#xff0c;Repo…

Q 语言初学者系列:(1)开门篇

声明&#xff1a;本系列文章全部参考自官方教程&#xff0c;由于缺乏中文资料而且本人E文实在太菜&#xff0c;对于E文较好的朋友可以直接通过下面的链接访问官方网站提供的教程&#xff0c; 欢迎大家一起学习讨论。 hhttps://code.kx.com/trac/wiki/QforMortals2/contents 用户…

Java 将数据写入磁盘并读取磁盘上的文件

package test; import java.io.BufferedReader;import java.io.FileReader;import java.io.FileWriter;import java.util.ArrayList;import java.util.List; public class test { public static void main(String[] args) { //创建集合 List<String> listnew ArrayList&l…

simulink怎么生成vxworks的执行程序_Matlab/Simulink基础了解(五):基础Simulink模型搭建及Embedded基础使用...

为了方便大家阅读&#xff0c;从这章开始在章节名中添加该章节要讲的主要的东西。本章给大家讲一个最简单的Simulink模型&#xff1a;在处理应用逻辑时常常会判断车速信号来得到车是否静止&#xff0c;如果车已经跑起来了&#xff0c;很多功能都会被禁用&#xff0c;比如诊断&a…

Q 语言初学者系列:(2)基本数据类型

明&#xff1a;本系列文章全部参考自官方教程&#xff0c;由于缺乏中文资料而且本人E文实在太菜&#xff0c;对于E文较好的朋友可以直接通过下面的链接访问官方网站提供的教程&#xff0c; 欢迎大家一起学习讨论。 hhttps://code.kx.com/trac/wiki/QforMortals2/contents 用户名…

Megacli恢复RAID0磁盘数据

今天干了一件蠢事&#xff0c;距离删库跑路&#xff0c;只差一步。把一块RAID0的磁盘给拔掉了,拔掉之后发现这是一块数据盘&#xff0c;幸好这个数据库是一台备库。赶紧动手恢复&#xff0c;以下是恢复的过程。 首先把拔下来的盘插回去&#xff0c;通过Megacli查看状态是这样的…

内核堆栈 用户堆栈_堆栈痕迹从何而来?

内核堆栈 用户堆栈我相信&#xff0c;阅读和理解堆栈跟踪是每个程序员都必须具备的一项基本技能&#xff0c;以便有效地解决每种JVM语言的问题&#xff08;另请参阅&#xff1a; 过滤日志中无关的堆栈跟踪行和首先记录引起根的异常 &#xff09;。 那么我们可以从一个小测验开始…

Java中使用log4j记录日志

在项目开发中&#xff0c;记录错误日志是一个很有必要功能。一是方便调试&#xff1b;二是便于发现系统运行过程中的错误&#xff1b;三是存储业务数据&#xff0c;便于后期分析&#xff1b; 在java中&#xff0c;记录日志&#xff0c;有很多种方式。 比如&#xff0c;自己实…

python如何输出两列数据_如何用python将一列数据分为两列?

引用来自“Ashkandi”的评论[{date: c[:10], time: c[11:]} for c in Col] 引用来自“vx2008”的评论 谢谢回复&#xff0c;这行代码执行完了以后&#xff0c;日期和时间都村到哪里了呢&#xff1f; 我是了一下&#xff0c;调用date&#xff0c;提示没有定义date&#xff0c;请…

Q 语言初学者系列:(3)Lists 初级

声明&#xff1a;本系列文章全部参考自官方教程&#xff0c;由于缺乏中文资料而且本人E文实在太菜&#xff0c;对于E文较好的朋友可以直接通过下面的链接访问官方网站提供的教程&#xff0c; 欢迎大家一起学习讨论。 hhttps://code.kx.com/trac/wiki/QforMortals2/contents 用户…

数据库图书管理建表与修改表

根据调研选定实体及相应属性画出E-R图 ​ 2、将E-R模型转换为对应关系模型&#xff0c;并指出主码和外码 图书book&#xff08;书号&#xff0c;类别&#xff0c;出版社&#xff0c;作者&#xff0c;书名&#xff0c;定价&#xff0c;备注&#xff09;&#xff1b; 读者reade…

如何指南:Apache Drill入门

Apache Drill是一种引擎&#xff0c;可以连接到许多不同的数据源&#xff0c;并为它们提供SQL接口。 它不仅是想跳入任何复杂事物的SQL接口&#xff0c;而且是一个功能强大的接口&#xff0c; 其中包括对许多内置函数和窗口函数的支持。 尽管它可以连接到您仍然可以使用SQL查询…

python3编程入门_在类Unix系统上开始Python3编程入门

>>> s Hello >>> x len(s) >>> print("The length of %s is %d" % (s,x)) The length of Hello is 5 看看《Python基础编程》中对格式化输出的总结&#xff1a; (1). %字符&#xff1a;标记转换说明符的开始 (2). 转换标志&#xff1a;-…