junit测试线程_一个在自己的线程中运行测试的JUnit规则
junit测试线程
有时,能够在单独的线程中运行JUnit测试会很有帮助。 特别是在编写与封装的ThreadLocal
或类似对象进行交互的集成测试时,这可能会派上用场。 单独的线程将隐式确保每次测试运行都未初始化threadlocal的与线程相关的引用。 这篇文章介绍了提供此类功能的JUnit 规则 ,并说明了如何使用它。
首先,请看以下示例。 它描述了一个导致testB
间歇性故障的testB
。 原因是结果取决于副作用1导致的所有测试的执行顺序。 更精确地说, Display.getDefault()
原则上返回延迟实例化的单例,而Display.getCurrent()
是此单例的简单访问器。 结果,如果testB
在testA
2之后运行,则它失败。
public class FooTest {@Testpublic void testA() {Display actual = Display.getDefault();assertThat( actual ).isNotNull();}@Testpublic void testB() {Display actual = Display.getCurrent();assertThat( actual ).isNull();}
}
为了避免出现幕后魔术,这种魔术会使代码难以理解,我们可以确保在实际测试执行之前就放置了现有的显示器3 。
@Beforepublic void setUp() {if( Display.getCurrent() != null ) {Display.getCurrent().dispose();}}
不幸的是,这种方法不能在运行PDE测试的集成测试套件中使用。 PDE运行时将创建一个Display
实例,其生存期跨越所有测试运行。 因此,显示处置将不是一个选择,并且testB
在PDE测试套件执行期间testB
会失败4 。
此时,请务必记住, Display
单例已绑定到其创建线程(准ThreadLocal
) 5 。 因此,如果在自己的线程中执行,则testB
应该运行可靠。
但是,线程处理通常充其量是比较麻烦的,并且会造成很多混乱,从而降低了测试方法的可读性。 这给了我创建一个TestRule实现的想法,该实现封装了线程处理并保持测试代码干净:
public class FooTest {@Rulepublic RunInThreadRule runInThread = new RunInThreadRule();@Testpublic void testA() {Display actual = Display.getDefault();assertThat( actual ).isNotNull();}@Test@RunInThreadpublic void testB() {Display actual = Display.getCurrent();assertThat( actual ).isNull();}
}
RunInThreadRule
类允许在其自己的线程中运行单个测试方法。 它负责守护程序线程的创建,测试执行,等待线程终止以及将测试结果转发到主线程。 为了将测试标记为在单独的线程中运行,测试方法必须使用@RunInThread
注释,如上所示。
这样, testB
现在就独立于测试的执行顺序,并且成功可靠。 但是请注意不要过度使用RunInThreadRule
。 尽管@RunInThread
批注表示测试在单独的线程中运行,但未解释原因。 这可能很容易混淆这种测试的真实范围。 因此,我通常仅将此作为万不得已的解决方案。 例如,当第三方库依赖于无法通过API功能清除或重置的封装ThreadLocal
,这可能是合理的。
对于那些想了解RunInThreadRule
实现的人,我创建了一个GitHub gist:
https://gist.github.com/fappel/65982e5ea7a6b2fde5a3
对于现实世界的使用,您还可以查看托管在以下位置的Gonsole项目的PgmResourceBundlePDETest
实现:
https://github.com/rherrmann/gonsole 。
- 请注意,默认情况下,JUnit以确定性但不可预测的顺序对测试方法进行排序
- 还考虑
testA
可能在另一个测试用例中并且仅在运行大型套件时才会出现问题的可能性 - 再说一次,我也不喜欢这种做法,因此,对于更复杂的解决方案,您可以查看一下“简化SWT测试设置的JUnit规则”一文。
- 同时,您可能已经认识到,简单的示例测试用例不是很有用,但我希望足以说明动机。
- 这使这样的线程成为SWT中的用户界面线程。 SWT实现通常称为单元线程的单线程UI模型
翻译自: https://www.javacodegeeks.com/2014/07/a-junit-rule-to-run-a-test-in-its-own-thread.html
junit测试线程
junit测试线程_一个在自己的线程中运行测试的JUnit规则相关推荐
- 一个在自己的线程中运行测试的JUnit规则
有时,能够在单独的线程中运行JUnit测试会很有帮助. 特别是在编写与封装的ThreadLocal或类似对象交互的集成测试时,这可能会派上用场. 单独的线程将隐式确保每次测试运行都未初始化thread ...
- java多线程为啥一直用的一个线程_一个Java多线程的问题,颠覆了我多年的认知!...
作者 | ithuangqing 来源 | 编码之外(ID:ithuangqing) 碰见个奇怪的多线程问题 小白们也不用怕,今天的文章你们都能看得懂,最近的学习中,碰到这样的一个问题: Java创建 ...
- junit 测试 异常_使用JUnit规则测试预期的异常
junit 测试 异常 这篇文章展示了如何使用JUnit测试预期的异常. 让我们从我们要测试的以下类开始: public class Person {private final String name ...
- java线程的创建线程_多线程(Thread、线程创建、线程池)
第1章 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序, ...
- weblogic最大线程_处理Weblogic卡住的线程
weblogic最大线程 定义或什么是缠线? 如果线程 在设定 的时间 内连续工作(非空闲),则WebLogic Server会将其诊断为阻塞 . 您可以通过更改在诊断出线程被阻塞之前的时间长度( ...
- 关于junit测试类启动慢报错:failed to resolve org.junit.platform
今天解决一个报错,是在启动测试模块时出的问题.因为公司电脑不能联网,解决这个问题非常麻烦. 解决方案: 添加依赖,之前添加这个依赖一直不行,后来发现是版本的原因,如果不给版本号,在我这边添加这个依赖是 ...
- 线程池默认多少个线程_我需要多少个线程?
线程池默认多少个线程 这取决于您的应用程序. 但是,对于那些希望对如何从生产站点购买的所有昂贵内核中挤出大量资金的人,请多多包涵,我将阐明围绕多线程 Java应用程序的奥秘. 内容针对最典型的Java ...
- task.run 强制结束线程_图文介绍进程和线程的区别
点击蓝色"最码农"关注我哟 加个"星标",每天下午18:03,一起学技术 进程和线程的概念 先了解一下操作系统的一些相关概念,大部分操作系统(如Windows. ...
- java 异常处理线程_转:Java子线程中的异常处理(通用)
在普通的单线程程序中,捕获异常只需要通过try ... catch ... finally ...代码块就可以了.那么,在并发情况下,比如在父线程中启动了子线程,如何正确捕获子线程中的异常,从而进行相 ...
最新文章
- JS进阶篇--JS数组reduce()方法详解及高级技巧
- 基于 HTML5 的工业互联网云平台监控机房 U 位
- c - 字符串的拼接.
- 高等数学上-赵立军-北京大学出版社-题解-练习2.6
- php面试题2018mysql_PHP程序员必会的MySQL面试题
- java break和return的区别_【java】break,continue和return区别
- lm723大电流可调电源电路图_高稳定大电流直流可调稳压电路
- 接口传值实例DatePickerDialog
- 冒泡排序之Java实现
- 天刀 服务器状态,12月11日服务器例行维护公告(已完成)
- 如何对关键词密度设置
- 安卓开发自学教程,Android研发岗必问30+道高级面试题
- ssm南工二手书交易平台 毕业设计-附源码172334
- 如何离线安装所有依赖包
- 带孩子们做环球旅行的读后感_适合夏天制作的简单小手工,带着孩子们做起来!...
- python 微信发送图片给好友_Python给指定微信好友自动发送信息和图片
- Autodesk Revit
- 【无标题】软件工程头歌
- Final Cut Pro导出视频「下」
- 骨传导耳机是怎么传声的、骨传导耳机的优点是什么
热门文章
- jzoj6293-迷宫【ddp,线段树,矩阵乘法】
- java过滤html标签获取纯文本信息
- 类、变量、块、构造器、继承初始化顺序,终极解答
- JavaFX之TableView的SelectionMode
- laravel部署到服务器显示Permission denied
- 【LSB】图片隐写文档大纲
- bootstrap组件
- EasyExcel中输出为时间格式
- 方舟非主机服务器无限距离,方舟非专业服务器距离限制怎么解除 | 手游网游页游攻略大全...
- html5圆形旋转菜单js,jquery 圆形旋转图片滚动切换效果