Впервые я делал многопоточную работу, и часто я перешел на обратный путь TDD: реализовал задачу, а потом начал думать, как тестировать все это. Отлично сработано!Тестирование многопоточных заданий по расписанию
Ну, я нашел Alex Collins объяснение полезно, и это был настоящий открывалка для глаз.
Но моя система потоковой передачи запланирована, и она периодически перезапускает инициализацию for и backward. например
@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);
}
Я попытался с Leting главный сон нить так другой поток может выполнять свою работу, но проблема, как уже упоминалось во многих других местах, в том, что behavoir теста отличается от машины к машине и испытания добирается до быстрых тестов для разработчиков.
Я вижу только два решения:
- изменяя конструкцию реализации, так что все дело проверяемым без резьбы, но тогда я потеряю определенную логику всей системы, и это вполне определенная работа сделать
- изолировать эти тесты, чтобы он не был тестом для разработчиков, а скорее интеграционным тестом.
Любые другие предложения?
Conluution: всегда TDD!
Я деля тесты с помощью 'org.junit.runners.Suite'. Благодаря! – myborobudur