重复运行JUnit测试而没有循环

最近,我遇到了一个问题,我不得不编写一种方法的测试,该方法需要计算在一定可能性范围内的随机分布值1 。 更准确地说,如果您假设签名看起来像

interface RandomRangeValueCalculator {long calculateRangeValue( long center, long radius );
}

测试可能会验证以下2个

public class RandomRangeValueCalculatorImplTest {@Testpublic void testCalculateRangeValue() {long center = [...];long radius = [...];RangeValueCalculator calculator = [...];long actual = calculator.calculateRangeValue( center, radius );assertTrue( center + radius >= actual );assertTrue( center - radius <= actual );}
}

但是,多次计算相同的中心和半径的范围值将返回不同的结果(至少在大多数情况下)。 因此,从某种意义上来说,解决方案在某种程度上是脆弱的,即实施不善可能会轻易导致间歇性故障。 另一方面,我不想深入到实际破坏值分配的深度。 后者(随机,高斯等)由协作者提供,并且其正确用法已经通过其他测试确认。

在我看来,一种更为实用的解决方案是实际上一次又一次地自动运行上述测试,以使其更加“有意义”。 当然,最简单的方法是将测试的内容放入一个循环中并继续进行下去。

但是从一开始,将断言放在一个循环中并将两个方面混合到一个测试运行中似乎有些不对。 更为重要的是,涵盖的问题域需要进行更多种类的测试。 因此,出于减少冗余的意图,我记得关于JUnit-Rules的帖子,并实现了一个简单的重复规则3 。 有了这个规则,上面的测试可以轻轻地修改为:

public class RandomRangeValueCalculatorImplTest {@Rulepublic RepeatRule repeatRule = new RepeatRule();@Test@Repeat( times = 10000 )public void testCalculateRangeValue() {long center = [...];long radius = [...];RangeValueCalculator calculator = [...];long actual= calculator.calculateRangeValue( center, radius );assertTrue( center + radius >= actual );assertTrue( center - radius <= actual );}
}

我认为很容易理解,在运行测试用例时, testCalculateRangeValue方法将执行10000次。 以下代码片段显示了RepeatRule的实现,这很简单:

public class RepeatRule implements TestRule {@Retention( RetentionPolicy.RUNTIME )@Target( {java.lang.annotation.ElementType.METHOD} )public @interface Repeat {public abstract int times();}private static class RepeatStatement extends Statement {private final int times;private final Statement statement;private RepeatStatement( int times, Statement statement ) {this.times = times;this.statement = statement;}@Overridepublic void evaluate() throws Throwable {for( int i = 0; i < times; i++ ) {statement.evaluate();}}}@Overridepublic Statement apply(Statement statement, Description description ){Statement result = statement;Repeat repeat = description.getAnnotation( Repeat.class );if( repeat != null ) {int times = repeat.times();result = new RepeatStatement( times, statement );}return result;}
}

到目前为止,RepeatRule达到了目的,并且基于上述实现的系统功能正在发挥作用。 尽管如此,有时有人会为树木而错过森林,所以我认为分享此解决方案以了解其他人的想法可能是个好主意。

  1. 实际上,这只是问题领域的一部分,但我认为这是这篇文章的充分动机。 ↩
  2. Formalistically口语:F(N,M)∈{E |e≥nm∧e≤n+ M},对于所有的E,N,米ℕ∈ ↩
  3. 简短的google搜索只想出了Spring可用的类似解决方案,而我的库集中没有。 ↩

参考:来自Code Affine博客的JCG合作伙伴 Frank Appel 反复运行JUnit测试而没有循环 。

翻译自: https://www.javacodegeeks.com/2013/04/running-junit-tests-repeatedly-without-loops.html

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

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

相关文章

以太网数据帧的报尾封装字段是什么_16、90秒快速“读懂”数据包的封装、解封装...

数据转发过程概述数据包在相同网段内或不同网段之间转发所依据的原理基本一致。一、数据帧封装TCP封装(四层)当主机建立了到达目的地的TCP连接后&#xff0c;便开始对应用层数据进行封装。主机A会对待发送的应用数据首先执行加密和压缩等相关操作&#xff0c;之后进行传输层封装…

MVP模式在Android实际项目中的应用和优化

注&#xff1a;本文阅读需要对MVP模式有基本了解。 MVP模式已经出现有很长一段时间了&#xff0c;但是火起来是这两年的事情。 关于MVP的概览&#xff0c;介绍&#xff0c;乃至于教程&#xff0c;Demo&#xff0c;实例&#xff0c;网上都有很多&#xff0c;我也有一篇文章专门收…

将训练集构建成ImageNet模型

以下程序实现将训练集构建为ImageNet模型&#xff0c;训练集图片为56个民族 import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintWriter;public class createTxt {public static void createClassInd(){//56个…

CSS基本知识(慕课网)

1、注释 注解&#xff1a;CSS中注释/*这里是注释的文字*/ HTML中注释<!--这里是注释的文字--> 2、外部式css样式&#xff0c;写在单独的一个文件中 注解&#xff1a; 外部式css样式(也可称为外联式)就是把css代码写一个单独的外部文件中&#xff0c;这个css样式文件以“…

JMS和Spring:有时很重要的小事情

JmsTemplate和DefaultMessageListenerContainer是用于访问JMS兼容MOM的Spring帮助器。 他们的主要目标是在JMS API之上形成一层&#xff0c;并处理诸如事务管理/消息确认之类的基础结构&#xff0c;并隐藏JMS API的某些重复和笨拙的部分&#xff08;保留在那里&#xff1a; JMS…

python 音速_webpack多页应用架构系列(十一):预打包Dll,实现webpack音速编译

前言上文说到我们利用webpack来打包一个可配置的bootstrap&#xff0c;但文末留下一个问题&#xff1a;由于bootstrap十分庞大&#xff0c;因此每次编译都要耗费大部分的时间在打包bootstrap这一块&#xff0c;而换来的仅仅是配置的便利&#xff0c;十分不划算。我也并非是故意…

whereis 命令

可以用来查看命令的路径&#xff0c;安装在哪里 whereis命令是定位可执行文件、源代码文件、帮助文件在文件系统中的位置 [rootsalt-server-192 a]# whereis mysql mysql: /usr/bin/mysql /usr/lib64/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz 转载于:https://ww…

css实现3D立方体旋转特效

先来看运行后出来的效果 它是在不停运行的一个立方体 先来看html部分的代码 <div class"rect-wrap"> <!--舞台元素&#xff0c;设置perspective&#xff0c;让其子元素获得透视效果。--><div class"container"> <!-- 容器&#…

Eclipse中的Tomcat:6个流行的“如何”问题

学习新技术总是一个艰难的过程。 当您尝试学习将要相互交互的两种技术时&#xff0c;此过程将变得更加困难。 Tomcat和Eclipse是Java EE开发中最流行的先决条件。 因此&#xff0c;要成为一名专业的开发人员&#xff0c;您需要知道如何使用此对执行最需要的操作以及如何进行一些…

adc分辨率和精度的区别_科普 | 传感器的灵敏度、分辨率和精度三者之间有何区别?...

传感器作为一种检测装置&#xff0c;具有微型化、数字化、智能化、多功能化、系统化、网络化的特点。在现代工业生产尤其是自动化生产过程中&#xff0c;需要各种传感器来监视和控制生产过程中的各个参数&#xff0c;使设备工作在正常状态或最佳状态&#xff0c;并使产品达到最…

Node08 - 配置模板引擎 -(route)

1、配置模板引擎 &#xff08;01&#xff09;、输出什么东西        //view engine&#xff1a;视图模板引擎(以何种方式呈现给用户) > 指定输出html           server.set(view engine, html); &#xff08;02&#xff09;、模板文件放在哪 //views: 指定好…

for循环与foreach的区别

for循环与foreach的区别 foreach 依赖 IEnumerable. 第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a, 以后每次再执行 var a in GetList() 的时候 调用 MoveNext.直到循环结束. 期间GetList()方法只执行一次. 1 2 3 4 5 6 7 8 9 10 11 12 13 fo…

SVN 定时 更新代码 Demo

1. 涉及技术&#xff1a;Winservice: 用system身份后台跑&#xff1b; Quartz&#xff1a;定时任务&#xff1b; SVN 2. 思路&#xff1a;Quartz定时调用cmd 程序,执行SVN update 命令,整个程序寄宿在Winservice3. 步骤&#xff1a;1&#xff09;service 用local system账户安…

如何在Jackson中使用PropertyNamingStrategy

Jackson api被广泛用于将json转换为Object并将Object转换为JSON。因此&#xff0c;如果您有json字符串并想在java对象中进行转换&#xff0c;请创建与json中的字段相同的bean的字段名。 Jackson在将json字段映射到java对象字段时遵循标准的bean约定&#xff0c;但是如果您有一个…

现代软件工程--阅读笔记

团队对个人的期望 &#xff08;1&#xff09;交流&#xff1a;能有效的和其他队员交流&#xff0c;从大的技术方向&#xff0c;到看似微小的问题。 &#xff08;2&#xff09;说到做到&#xff1a;“按时交付” &#xff08;3&#xff09;接受团队赋予的角色并按角色要求工作:团…

Linux上的HotSpot GC线程CPU占用空间

以下问题将测试您对Linux操作系统上运行的Java应用程序的垃圾回收和高CPU故障排除的知识。 当调查过多的GC和/或CPU利用率时&#xff0c;此故障排除技术尤其重要。 它将假定您没有访问高级监视工具的能力&#xff0c;例如Compuware dynaTrace甚至JVisualVM。 将来会介绍使用此类…

tornado-简介和原理

tornado-设计初衷 1. 追求小而精 2. epoll IO多路复用和协程 3. 支持WebSocket 4. 单线程程序(GIL限制&#xff0c;本身某种意义上不启动多进程就是单线程程序) # Python GIL介绍详情 tronado应用场景 1. 大量的http请求连接(大量的用户请求&#xff0c;要求并发性和高性能) tr…

mysql5.6.13_MySQL-5.6.13解压版(zip版)安装配置教程

1、将mysql-5.6.13-winx64.zip 解压到D:\mysql-5.6.13\目录。2、清理里面的调试文件打开这个目录&#xff0c;发现里面的文件夹和文件跟一个安装好后的MySQL基本没有区别。可能你会很郁闷&#xff0c;这个MySQL5.6.13居然有1.04GB&#xff0c;呵呵&#xff0c;仔细一看你就会发…

前端学习笔记--HTTP缓存

原文地址&#xff1a;https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hlzh-cn 缓存并重用之前获取的资源的能力是性能优化的一个关键方面。 每个浏览器都自带了 HTTP 缓存实现功能&#xff0c;只需要确保每个服务…

socket programming

进行 socket programming开始要做的工作&#xff1a; On Linux: 以下是client代码&#xff0c;使用TCP&#xff0c;注意网络字节序&#xff1a; 1 #include <sys/socket.h> 2 #include <netinet/in.h> 3 #include <arpa/inet.h> 4 int main() 5 { 6 …