Как писать тесты на время выполнения многопоточного кода [закрыто]
У меня есть многопоточный код, который обрабатывает список заданий с ExecutorService и некоторыми потоками внутри. Я хочу написать тестовый пример, который гарантирует, что это займет меньше определенного времени. Проблема в том, что этот код работает полностью асинхронно, поэтому просто выполняю end-старт не принесет никакой пользы.
Как я могу подойти к этой проблеме?
2 ответа
Это может помочь.
import org.junit.Assert;
import org.junit.Test;
import java.util.concurrent.*;
public class MultiThreadedTest {
private final ExecutorService executor = Executors.newFixedThreadPool(10);
private Callable<Boolean> getCallable(Long sleepMillis) {
return () -> {
try {
Thread.sleep(sleepMillis);
} catch (InterruptedException e) {
e.printStackTrace();
}
return true;
};
}
@Test
public void pass() throws InterruptedException, ExecutionException, TimeoutException {
Future<Boolean> future = executor.submit(getCallable(1000L));
Assert.assertTrue(future.get(2000, TimeUnit.MILLISECONDS));
}
@Test
public void fail() throws InterruptedException, ExecutionException, TimeoutException {
Future<Boolean> future = executor.submit(getCallable(3000L));
Assert.assertTrue(future.get(2000, TimeUnit.MILLISECONDS));
}
@Test
public void failCheck() {
Assert.assertThrows(TimeoutException.class, () -> {
Future<Boolean> future = executor.submit(getCallable(3000L));
Assert.assertTrue(future.get(2000, TimeUnit.MILLISECONDS));
});
}
}
Если ваш код работает асинхронно, ваш тестер тоже должен быть асинхронным. Можете ли вы каким-либо образом проверить, завершены ли работы? Если это так, тестер должен запускать и периодически проверять статус заданий (например, каждую минуту), но это не должно продолжаться в течение заранее определенного тайм-аута - в случае зависания любого из асинхронных заданий.