Java 测试多线程调度任务
这是我第一次做一些多线程的工作,我经常采用反向TDD的方式:实现任务,然后我开始考虑如何测试整个任务。干得好 嗯,我发现这个解释很有帮助,真的让我大开眼界 但我的线程系统是按计划进行的,它会定期重新启动for和backward初始化。e、 gJava 测试多线程调度任务,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
@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
划分测试。谢谢