По мотивам поста Темы. Поделюсь своим опытом.
Когда стоит и не стоит использовать рандом в автотестах
Для начала когда стоит.
- Когда тестовые данные отображают какой-то класс эквивалентности.
Например, допустим нам нужно проверить валидацию тестового поля на длину входящей строки. Здесь, можно использовать рандом и написать для граничного значения:
getRandomString(MAX_LENGTH);
Для строки длиной больше максимально допустимой:
getRandomString(MAX_LENGTH + 1);
Здесь
MAX_LENGTH
- максимальная допустимая длина строки. В этом случае мы в кейс закладываем больше логики, что делает его более понятным. При этом автотест будет намного наглядней, чем если бы мы не использовали рандом, а захаркодили определенную строку. - Когда рандомные значения никак не влияют на тестовую логику. При формировании тестовых данных, нам порой не важно какими они будут, а важно только их наличие. В этом случае их можно также рандомить.
В остальных случаях лучше избегать рандома. Также следуют избегать рандома для слишком сложных структур данных и объектов, для которых при использовании есть множества ограничений. Не стоит использовать рандом и для формирования уникальных сущностей: для них подойдет системное время (как писал Тема).
Почему рандом это хорошо
Правильное использование рандома в тесте помогает сделать код более наглядным и заодно избавиться от магических значений в коде.
Почему рандом это плохо
Неправильное использование рандома ведет к ошибкам, которые очень тяжело отловить. Также неправильно использование при формировании тестовых данных может негативно сказываться на покрытии.
Полезные библиотеки
- Apache Commons Lang тут обратить внимание на классы
RandomStringUtils.java
иRandomUtils.java
- Random Beans для рандомных объектов на основе java бинов
- wordnet-random-name(Human-friendly Random Name Generator) полезная библиотека, которая позволяет получать рандомные строки в читаемом виде.