2015-11-15 4 views
1

Есть много вопросов рефакторинга, в которых кто-то уже ответил. Однако я решил задать свой собственный вопрос. У меня возникли проблемы с рефакторингом Thread.sleep (1000), чтобы выполнить обратный отсчет в фрагменте кода ниже. Принимая класс тестирования программного обеспечения, я наткнулся на бумагу: «Действительно ли опасные запахи вредны: эмпирическое исследование», и я хотел узнать больше о области темы. Кто-нибудь может мне помочь, пожалуйста!Как реорганизовать спящую улитку

try (Socket client = new Socket("localhost", connector.getLocalPort())) 
    { 
     OutputStream output = client.getOutputStream(); 
     for (ByteBuffer buffer : lease.getByteBuffers()) 
     { 
      output.write(BufferUtil.toArray(buffer)); 
     } 

     Parser parser = new Parser(byteBufferPool, new  Parser.Listener.Adapter() 
     { 
      @Override 
      public void onHeaders(HeadersFrame frame) 
      { 
       try 
       { 
        // Close the connection just after 
        // receiving the response headers. 
        client.close(); 
        closeLatch.countDown(); 
       } 
       catch (IOException x) 
       { 
        throw new RuntimeIOException(x); 
       } 
      } 
     }, 4096, 8192); 

     parseResponse(client, parser); 

     // We need to give some time to the server to receive and process the TCP FIN. 
     Thread.sleep(1000); 
     Session session = sessionRef.get(); 
     Assert.assertTrue(session.isClosed()); 
     Assert.assertTrue(((HTTP2Session)session).isDisconnected()); 
    } 

ответ

1

Я боюсь, что от ожиданий на любом уровне испытаний не будет никаких побегов. Поскольку вам неизвестно, когда именно будет реагировать на тестируемую систему (а иногда и просто нет). Но вы можете обратиться к Explicit wait, которые используются в тестировании пользовательского интерфейса. Если вы не знакомы с концепцией - Явные ожидания - это умные ожидания, которые ограничены конкретным ответом. Используя явные ожидания, вы в основном говорите своему тесту, что есть максимальное количество времени, чтобы ждать X единиц (предположим, 50 мс) времени, прежде чем он сдастся.

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

UPDATE:

Вот Java example испытательного многопоточного доступа без сна

@Test 
public void  concurrentAccessFromMultipleThreads() throws Exception { 
final Counter counter = new Counter(); 

final CountDownLatch allThreadsComplete = #1 
    new CountDownLatch(threads); #1 

final int callsPerThread = 100; 
final Set values = new HashSet(); 
Runnable runnable = new Runnable() { 
@Override 
public void run() { 
for (int i = 0; i < callsPerThread; i++) { 
    values.add(counter.getAndIncrement()); 
} 
allThreadsComplete.countDown(); #2 
} 
}; 

int threads = 10; 
for (int i = 0; i < threads; i++) { 
new Thread(runnable).start(); 
} 

allThreadsComplete.await(10, TimeUnit.SECONDS); #3 

int expectedNoOfValues = threads * callsPerThread; 
assertEquals(expectedNoOfValues, values.size()); 
    } 
+0

Спасибо за ваш ответ! Кажется, я не был ясно в своем посте. То, что я хочу, - это лучший подход, который заменяет расточительный и ненадежный Thread.sleep. Основное различие заключается в том, что я хочу использовать объекты синхронизации Java из пакета java.util.concurrent, чтобы немедленно проверить поток тестов, когда рабочие потоки завершили свою работу. – Paul

+0

Я обновил последнюю часть своего ответа, это точно ориентировано на поток. Надеюсь, это то, что вам нужно. – ekostadinov

+0

@Paul, пожалуйста, держите свой вопрос в чистоте и удалите комментарий ** спасибо **. На сайте есть четкая политика оценки ответов - * вверх/вниз * и * пометить как принято *. Благодарю. Я буду рад помочь вам, если это вам понадобится. – ekostadinov

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