我第一次做一些多线程工作,而且我常常采用逆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);
}
我尝试让主线程处于休眠状态,以便其他线程可以正常工作,但问题,正如许多其他地方所提到的那样,测试的行为因机器不同而且测试时间长了快速开发人员测试
我只看到两个解决方案:
还有其他建议吗?
结论:总是做TDD!
答案 0 :(得分:1)
最佳长期解决方案是1,但您不需要一次性完成此操作。
解决方案1缩短开发周期时间,提供更好的故障反馈,并帮助您设计少量耦合单元。
但是在现实世界中,你没有太多时间而且无法发现,所以你应该做解决方案2并逐步从线程中使用测试提取非线程代码,以确保行为是相同的。
当您对单元测试覆盖率感到满意时,您可以决定是否保留在CI上运行的集成测试。