Многопоточность

Довольно часто есть необходимость запускть тесты в несколько потоков для снижения времени выполнения тестов.

TestNG

public class ConcurrencyTest extends Assert {
  private Map<String, String> data;

  @BeforeClass
  void setUp() throws Exception {
    data = new HashMap<String, String>();
  }

  @AfterClass
  void tearDown() throws Exception {
    data = null;
  }

  @Test(threadPoolSize = 30, invocationCount = 100, invocationTimeOut = 10000)
  public void testMapOperations() throws Exception {
    data.put("1", "111");
    data.put("2", "111");
    data.put("3", "111");
    data.put("4", "111");
    data.put("5", "111");
    data.put("6", "111");
    data.put("7", "111");
    for (Map.Entry<String, String> entry : data.entrySet()) {
      System.out.println(entry);
    }
    data.clear();
  }

  @Test(singleThreaded = true, invocationCount = 100, invocationTimeOut = 10000)
  public void testMapOperationsSafe() throws Exception {
    data.put("1", "111");
    data.put("2", "111");
    data.put("3", "111");
    data.put("4", "111");
    data.put("5", "111");
    data.put("6", "111");
    data.put("7", "111");
    for (Map.Entry<String, String> entry : data.entrySet()) {
      System.out.println(entry);
    }
    data.clear();
  }
}

Свойства:

  • threadPoolSize определяет максимальное количество потоков используемое для тестов;

  • singleThreaded если установлен в true все тесты будут запущены в одном потоке;

  • invocationCount определяет количество запусков теста;

  • invocationTimeOut определяет общее время всех запусков теста, после которого тест считается провалившемся.

Первый тест будет время от времени проваливаться с ConcurrentModificationException, так как будет запускаться из разных потоков, второй — нет, так как все тесты будут запущены последовательно из одного потока.

Еще можно установить параметр parallel у дата провайдера в true, тогда тесты для каждого набора данных будут запущены паралельно, в отдельном потоке:

JUnit В JUnit сконфигурировать параллельный запуск тестов можно с помощью ParallelComputer класса:

Параллельный запуск тестов - это очень полезная опция. Однако чаще всего лучще ее использовать из билд инструмента.

Задание 1. Для TestNG напишите тест с ожидаением внутри 3 сек, сконфигурируйте на запуск 3 раза. Попробуйте запустить его в одном потоке, а затем в 3. Сравните время выполнения.

Задание 2. Сделайте тоже самое для JUnit.

Last updated