2014-04-03 4 views
1

Впервые я делал многопоточную работу, и часто я перешел на обратный путь 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 теста отличается от машины к машине и испытания добирается до быстрых тестов для разработчиков.

Я вижу только два решения:

  1. изменяя конструкцию реализации, так что все дело проверяемым без резьбы, но тогда я потеряю определенную логику всей системы, и это вполне определенная работа сделать
  2. изолировать эти тесты, чтобы он не был тестом для разработчиков, а скорее интеграционным тестом.

Любые другие предложения?

Conluution: всегда TDD!

ответ

1

Лучшее долгосрочное решение - 1, но вам не нужно делать это за один раз.

Решение 1 сокращает время цикла разработки, обеспечивает лучшую обратную связь при сбоях и помогает вам проектировать несколько связанных блоков.

Но в реальном мире у вас мало времени и не может быть обнаружено, поэтому вы должны сделать решение 2 и поэтапно извлекать не резьбовой код из потока с использованием тестов, чтобы убедиться, что поведение такое же.

Когда вы получаете удовлетворительное покрытие на основе тестирования, вы можете решить, выполняете ли вы тест интеграции, выполняемый на вашем CI, или нет.

+0

Я деля тесты с помощью 'org.junit.runners.Suite'. Благодаря! – myborobudur

Смежные вопросы