测试多线程计划任务

时间:2014-04-03 07:20:40

标签: java multithreading scheduled-tasks

我第一次做一些多线程工作,而且我常常采用逆TDD方式:实现任务,之后我开始思考如何测试整个事情。做得好!

嗯,我发现Alex Collins解释很有帮助,这真是令人大开眼界。

但是我的线程系统已经安排好,它会定期重新启动for-andward向初始化。 e.g。

@Before
public void assertCallModelEmpty() {
    assertThat(CallModel.count()).isEqualTo(0);     
}

@After
public void tearDownBackwardsThread() {
    CallServicesFactory.getCallServices().stopCdrBackwardsInit();
}

@Test(timeout = 6000)
public void runWithObserver() throws InterruptedException, UnfinishedCallException, ParseException {
    // given
    CallServices callServices = CallServicesFactory.getCallServices();
    callServices.initFrom(startDate);
    assertThat(CallModel.count()).isEqualTo(1);

    // when 1
    Date start = new DateTime().plusSeconds(1).toDate();
    int intervalInSec = 1;
    int initDaysPerNight = 2;
    callServices.runCdrBackwardsInit(start, initDaysPerNight, intervalInSec);
    Thread.sleep(1500);

    // then 1
    assertThat(CallModel.count()).isEqualTo(2);

    // when 2
    Thread.sleep(1500);

    // then 2
    assertThat(CallModel.count()).isEqualTo(3);

    // when 3
    Thread.sleep(1500);

    // then 3
    assertThat(CallModel.count()).isEqualTo(4);
}

我尝试让主线程处于休眠状态,以便其他线程可以正常工作,但问题,正如许多其他地方所提到的那样,测试的行为因机器不同而且测试时间长了快速开发人员测试

我只看到两个解决方案:

  1. 改变实现的设计,以便整个事情在没有线程的情况下是可测试的,但是我会失去整个系统的某个逻辑,而且还有很多工作要做。
  2. 隔离这些测试,使其不再是开发人员测试,而是集成测试。
  3. 还有其他建议吗?

    结论:总是做TDD!

1 个答案:

答案 0 :(得分:1)

最佳长期解决方案是1,但您不需要一次性完成此操作。

解决方案1缩短开发周期时间,提供更好的故障反馈,并帮助您设计少量耦合单元。

但是在现实世界中,你没有太多时间而且无法发现,所以你应该做解决方案2并逐步从线程中使用测试提取非线程代码,以确保行为是相同的。

当您对单元测试覆盖率感到满意时,您可以决定是否保留在CI上运行的集成测试。