有时,能够在单独的线程中运行JUnit测试会很有帮助。 特别是在编写与封装的ThreadLocal或类似对象交互的集成测试时,这可能会派上用场。 单独的线程将隐式确保每次测试运行都未初始化threadlocal的与线程相关的引用。 这篇文章介绍了提供此类功能的JUnit 规则 ,并说明了如何使用它。

首先,请看以下示例。 它描述了一个导致testB间歇性故障的testB 。 原因是结果取决于副作用1导致的所有测试的执行顺序。 更准确地说, Display.getDefault()原则上返回延迟实例化的单例,而Display.getCurrent()是此单例的简单访问器。 结果,如果testBtestA 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单例已绑定到其创建线程(准ThreadLocal5 。 因此,如果在自己的线程中执行,则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要点:

https://gist.github.com/fappel/65982e5ea7a6b2fde5a3

对于现实世界的使用,您还可以查看托管在以下位置的Gonsole项目的PgmResourceBundlePDETest实现:

https://github.com/rherrmann/gonsole 。

  1. 请注意,默认情况下,JUnit以确定性但不可预测的顺序对测试方法进行排序
  2. 还考虑testA可能在另一个测试用例中并且仅在运行大型套件时才会出现问题的可能性
  3. 再说一次,我也不喜欢这种做法,因此,对于更复杂的解决方案,您可以查看一下“简化SWT测试设置的JUnit规则”一文。
  4. 同时,您可能已经认识到,简单的示例测试用例不是很有用,但是我希望足以说明动机。
  5. 这使这样的线程成为SWT中的用户界面线程。 SWT实现通常称为单元线程的单线程UI模型

翻译自: https://www.javacodegeeks.com/2014/07/a-junit-rule-to-run-a-test-in-its-own-thread.html

一个在自己的线程中运行测试的JUnit规则相关推荐

  1. junit测试线程_一个在自己的线程中运行测试的JUnit规则

    junit测试线程 有时,能够在单独的线程中运行JUnit测试会很有帮助. 特别是在编写与封装的ThreadLocal或类似对象进行交互的集成测试时,这可能会派上用场. 单独的线程将隐式确保每次测试运 ...

  2. 【Based Android】Android Sensor感应器介绍(二)线程中刷新UI 创建一个android测力计...

    上一篇文章http://www.cnblogs.com/octobershiner/archive/2011/11/06/2237880.html介绍了sensor的基本知识以及一个使用其中加速度感应 ...

  3. Qt4_在次线程中使用Qt的类

    在次线程中使用Qt的类 当函数可以同时被不同的线程安全地调用时,就称其为"线程安全的"(thread-safe).如果在不同的线程中对某一共享数据同时调用两个线程安全的函数,那么结 ...

  4. Qt对话框的事件循环分析(子线程中不能创建UI窗体分析)

    重要: GUI线程和辅助线程 如前所述,每个程序在启动时都有一个线程.这个线程被称为"主线程"(在Qt应用程序中也称为"GUI线程").Qt GUI必须在这个线 ...

  5. Qt对话框的事件循环分析(子线程中不能创建UI窗体分析2)

    Qt事件机制 QT-UI 后端 重要: GUI线程和辅助线程 如前所述,每个程序在启动时都有一个线程.这个线程被称为"主线程"(在Qt应用程序中也称为"GUI线程&quo ...

  6. VC6升级到VC9,线程中自定义消息的升级方法

    在将VC6的工程升级到VC9时,碰到了一个问题,就是线程中的自定义消息总是提示如下错误: 无法从"LRESULT (__thiscall CAISDataRecvThread::* )(WP ...

  7. c++线程中的几种锁

    这个是在中兴面试中被面试问到的一个题"你知道线程中的自旋锁么?",我当时一脸懵逼,不知道.回来后整理下,在这里对线程中的锁进行一个学习. 线程之间的锁有:互斥锁.条件锁.自旋锁.读 ...

  8. 一个线程中lock用法的经典实例

    1 /* 2 该实例是一个线程中lock用法的经典实例,使得到的balance不会为负数 3 同时初始化十个线程,启动十个,但由于加锁,能够启动调用WithDraw方法的可能只能是其中几个 4 作者: ...

  9. java 如何结束线程_java中,如何安全的结束一个正在运行的线程?

    问题 Java中提供了很多调度线程的方法,上一节介绍了其中一种控制线程的方法:如何等待一个线程结束.那么如果不希望等待线程结束,而是根据问题的需要随时都要中断线程使其结束,这种对线程的控制方法该如何实 ...

最新文章

  1. python怎么读文件名-python读取文件名并改名字的实例
  2. 【新星计划】MATLAB-冒号:符号详解
  3. java教程java自学_15必须阅读Java 8教程
  4. 预祝大家2011农历新年快乐,宏“兔”大展,心想事成~
  5. java的Teacher类_java类的继承 - osc_tauwfamo的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. Firefox关闭最后一个标签页时不关闭Firefox的设置
  7. 由pthread_create引起的段错误
  8. TeamViewer——Ubuntu系统上的安装和卸载
  9. topcoder srm 525 div1
  10. 强化学习(一)---马尔科夫决策过程
  11. mac可装云服务器_转载一篇用苹果电脑mac系统配置阿里云服务器ecs的教程攻略
  12. 基于 SpringBoot + MyBatis-Plus 的公众号管理系统,接私活必备!
  13. 宏与VBA的关系与概念
  14. 一加nfc门禁卡录入_一加7t怎么开启NFC 模拟门禁卡方法介绍
  15. C++关于引用的分析
  16. 获取ALM中步骤数据
  17. Laravel使用Dingo API+JWT实现认证机制 无痛刷新Token
  18. 计算机无法搜索到计算器,我的电脑中的计算器没有了,怎么办?
  19. 2016下半年计算机水平模拟考试系统,2016下半年计算机等级考试试题及答案
  20. 文章标题 Chris and Magic Square

热门文章

  1. 请求和响应向更多内容
  2. 2019蓝桥杯省赛---java---A---4(迷宫)
  3. 向上类型转换VS向下类型转换
  4. mysql切换用户sql语句,MySQL用户管理及SQL语句详解
  5. 转: java多线程-ThreadPoolExecutor的拒绝策略RejectedExecutionHandler
  6. HDU2068(错列排序)
  7. jmc线程转储_查找线程转储中的异常和错误
  8. selenium自动化测试_维持Selenium测试自动化的完美方法
  9. junit4和junit5_JUnit5 TestSuite替代
  10. gradle跟pom_Gradle多项目构建–父pom式结构