Java 测试多线程调度任务

Java 测试多线程调度任务,java,multithreading,scheduled-tasks,Java,Multithreading,Scheduled Tasks,这是我第一次做一些多线程的工作,我经常采用反向TDD的方式:实现任务,然后我开始考虑如何测试整个任务。干得好 嗯,我发现这个解释很有帮助,真的让我大开眼界 但我的线程系统是按计划进行的,它会定期重新启动for和backward初始化。e、 g @Before public void assertCallModelEmpty() { assertThat(CallModel.count()).isEqualTo(0); } @After public void tearDown

这是我第一次做一些多线程的工作,我经常采用反向TDD的方式:实现任务,然后我开始考虑如何测试整个任务。干得好

嗯,我发现这个解释很有帮助,真的让我大开眼界

但我的线程系统是按计划进行的,它会定期重新启动for和backward初始化。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);
}
我尝试让主线程睡眠,以便其他线程可以完成其工作,但问题是,正如在许多其他地方提到的那样,测试的行为在不同的机器之间是不同的,并且测试对快速开发人员测试的时间越来越长

我只看到两种解决方案:

  • 改变实现的设计,使整个事情在没有线程的情况下是可测试的,但这样我将失去整个系统的某种逻辑,这是相当多的工作要做
  • 隔离这些测试,使其不再是开发人员测试,而是集成测试 还有其他建议吗


    结论:一定要做TDD

    最好的长期解决方案是1,但您不需要一次性完成

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

    但在现实世界中,您没有太多的时间,也无法被发现,所以您应该执行解决方案2,并使用测试从线程中增量提取非线程代码,以确保行为相同


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

    我将使用
    org.junit.runners.Suite
    划分测试。谢谢