В определенных случаях может нам нужно выполнить тест N раз чтобы обеспечить его правильную работу.

Для этого у нас есть несколько формул. Во-первых, давайте рассмотрим следующий сценарий:

  • Мы хотим протестировать метод, который генерирует случайное число из N цифр. Значение N передается в качестве параметра этому методу.
  • Мы создаем тестовый класс jUnit, в котором мы объявляем количество повторений или итераций, которые мы хотим выполнить для определенного теста.
private static final int NUMBER_REPETITIONS = 1_000_000;
Войти в полноэкранный режим

Выйти из полноэкранного режима

  • Мы создаем тесты для проверки функциональности метода. В этом примере я создал тест, используя аннотацию jUnit. @RepeatedTest и еще один простой тест, в котором мы выполняем всю логику внутри цикла do-while.

Тест А: используя аннотацию @RepeatedTest.

import org.junit.jupiter.api.RepeatedTest;

@RepeatedTest(value = NUMBER_REPETITIONS)
void random_number_with_four_digits() {

    var low = 1000;
    var high = 9999;
    var numOfDigits = 4;
    var actual = RandomUtil.generateNumber(numOfDigits);
    assertTrue(high >= actual, "Error, random is too high");
    assertTrue(low <= actual, "Error, actual is too low");
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

Тест Б: использование цикла do-while.

@Test
void random_numbers_generator() {

    int iterationCount = 1;
    do {
        var low = 1000;
        var high = 9999;
        var numOfDigits = 4;
        var actual = RandomUtil.generateNumber(numOfDigits);
        assertTrue(high >= actual, "Error, random is too high");
        assertTrue(low <= actual, "Error, actual is too low");
        iterationCount++;
    } while (iterationCount <= NUMBER_REPETITIONS);
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

Как мы можем видеть оба теста говорят одно и то жечто метод генератора случайных чисел будет возвращать значение между низким и высоким.
В обоих случаях тест будет выполнен столько раз, сколько мы укажем в константе NUMBER_REPETITIONS.

Когда у нас есть этот сценарий, мы можем выполнять различные тесты изменение значения low, high, numOfDigits у NUMBER_REPETITIONS.

На этот раз я хотел вычислить разница во времени выполнения каждого типа теста, и это тесты, которые я провел:

Количество итерацийТест А (@RepeatedTest)Тест B (делай пока)
1_000130 мс13 мс
100_0002600 мс20 мс
1_000_000неопределенный55 мс

В этом примере тесты выполняются использование цикла do-while было примерно на 90% быстрее чем те, которые выполняются путем аннотирования @RepeatedTestпомимо того, что для случая 1_000_000 итераций мне не удалось получить окончательный результат, так как приложение зависло.