Рубрики
Без рубрики

Причины избегать RandomStringUtils для генерации тестовых данных

Какую проблему мы хотим решить? Мы попытаемся решить одну из наихудших практик, используемых на… С пометкой java, тестирование, разработка тестов, учебное пособие.

Какую проблему мы хотим решить?

Мы попытаемся решить одну из наихудших практик, используемых в тестах на любом уровне: фиксированные/жестко закодированные данные.

Я хочу, насколько это возможно, избегать любых предварительных действий вручную, прежде чем я смогу запустить свои тесты, и из-за этого я также стараюсь избегать использования статических файлов (CSV, TXT, XLS, JSON).

Здесь мы увидим распространенное использование разработчиками Java: Randomstringutils и то, как это может быть не лучшим выбором для автоматической генерации данных.

Кстати, я рекомендую автоматическую генерацию данных в тестах с использованием подхода Test Data Factory, и вы можете найти пример здесь, в моем блоге: Test Data Factory: Почему и как использовать .

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

Пример

Мы автоматически сгенерируем данные для объекта Клиента, который соответствует следующим критериям:

int идентификатор Не нулевой
Строка имя Не null и размер от 2 до 50 символов
Строка профессия Не null и размер от 2 до 30 символов
Строка номер счета Не имеет значения null и имеет размер 18 символов
Строка адрес Не null и размер от 2 до 50 символов
Строка номер телефона Не null и размер от 11 до 14 символов
Дата день рождения Не нулевой

Чтобы сократить количество тестов, ключевым моментом является генерация достоверных данных с учетом ограничений. В профессиональной среде мы бы также внедрили тесты для крайних случаев.

Думайте об этих данных клиента как об объекте, используемом на любом уровне тестирования (модуль, интеграция, сервис, пользовательский интерфейс).

Что делает класс RandomStringUtils?

RandomStringUtils – это класс из Apache Commons Lang библиотека, которая генерирует случайные строки на основе различных условий, таких как:

  • длина
  • буквы
  • числа
  • буквенно-цифровой
  • ASCII
  • числовой
  • печатать

Это статический класс, в котором вы можете напрямую генерировать любую строку, так что это очень удобно!

Смотрите Пример ниже, где вы можете сгенерировать другой набор случайных данных.

public class RandomStringUtilsExample {

    public static void main(String[] args) {
        // returns a String with 5 numbers
        // example 82114
        RandomStringUtils.randomNumeric(5);

        // returns an alphanumeric String with length as 30 mixing upper and lower cases
        // example gQ6RB8MiwKOg9O3qnHFo7I3jilHoIy
        RandomStringUtils.randomAlphanumeric(30);
    }
}

Каков результат использования класса RandomStringUtils?

Давайте сначала взглянем на пример кода, реализующий использование Randomstringutils :

  • в строке 7 используется метод RandomStringUtils.randomNumeric() для генерации значения int и, чтобы сделать это возможным, мы разбираем String в Int с помощью Integer.valueOf()
  • в строках с 8 по 12 используется RandomStringUtils.randomAlphanumeric() для генерации буквенно-цифровых данных
  • строка 13 имеет фиксированную дату как сейчас (сегодня), потому что RandomStringUtils генерирует только Струнные
class BasicExampleTest {

    @Test
    @DisplayName("Data validations using RandomStringUtils")
    void randomStringUtils() {
        CustomerData customerData = CustomerData.builder().
                id(Integer.valueOf(RandomStringUtils.randomNumeric(10))).
                name(RandomStringUtils.randomNumeric(50)).
                profession(RandomStringUtils.randomAlphanumeric(30)).
                accountNumber(RandomStringUtils.randomAlphanumeric(18)).
                address(RandomStringUtils.randomAlphanumeric(50)).
                phoneNumber(RandomStringUtils.randomAlphanumeric(14)).
                birthday(new Date()).
                build();
    }
}

Результатом выполнения теста, если мы печатаем или проверяем объект Данные клиента , является:

{
  "id": 1335130963,
  "name": "GGXS19kN6kSuzHwW6T0YjJCxUaIyKKmAaUdQH51gdUAtt1TwqY",
  "profession": "0kk8HSiFgCUVfLzbD3PyR6cn8j0LH3",
  "accountNumber": "PqvekXb9ekRAJi3ypy",
  "address": "90lqP2LHnQMWtmMP8vasO3BR5dsICIL85u5sJ0yjGKWXxCkFsj",
  "phoneNumber": "OpoJ3tOE53woy9",
  "birthday": "Sep 26, 2021, 10:01:10 PM"
}

Мы могли бы успешно сгенерировать необходимые данные! Ура!

Что делает JavaFaker?

[]JavaFaker]( https://github.com/DiUS/java-faker ) – это библиотека с открытым исходным кодом, основанная на Faker для генерации поддельных данных.

Там есть какая-то бессмысленная генерация данных, таких как Аватар, Друзья и т. Д., Но есть также хороший набор объектов, которые могут генерировать данные в определенных условиях, соответствующих нашим потребностям.

Я приглашаю вас взглянуть на репозиторий GitHub и увидеть различные объекты для генерации данных.

Каков результат использования JavaFaker?

Реализация кода для генерации данных с использованием класса customerData является:

  • в строке 9 используется метод number() для генерации случайного числа
  • в строке 10 используется метод name() для создания полного имени
  • в строке 11 company() используется для создания профессии
  • в строке 12 используется метод finance()/| для создания действительного IBAN для страны Нидерландов в строке 13 используется метод
  • address() для создания полного уличного адреса в строке 14 для генерации номера мобильного телефона используется метод p
  • hone Number() |/ в строке 15 метод date()
  • используется для генерации данных о дне рождения в возрасте от 18 до 90 лет
class BasicExampleTest {

    @Test
    @DisplayName("Data validations using faker library")
    void faker() {
        Faker faker = new Faker();

        CustomerData customerData = CustomerData.builder().
                id((int) faker.number().randomNumber()).
                name(faker.name().name()).
                profession(faker.company().profession()).
                accountNumber(faker.finance().iban("NL")).
                address(faker.address().streetAddress()).
                phoneNumber(faker.phoneNumber().cellPhone()).
                birthday(faker.date().birthday(18, 90)).
                build();
    }
}

Результатом выполнения теста, если мы печатаем или проверяем объект Данные клиента , является:

{
  "id": 520543,
  "name": "Tena Pagac",
  "profession": "photographer",
  "accountNumber": "NL07HUUN1518167413",
  "address": "12672 Romaguera Tunnel",
  "phoneNumber": "(561) 638-5813",
  "birthday": "Mar 5, 1982, 10:29:18 AM"
}

Мы могли бы успешно сгенерировать необходимые данные! Но давайте не будем зацикливаться на различиях.

Сравнение обоих подходов

Есть два аспекта, которые я хотел бы рассмотреть, чтобы выбрать между тем или иным подходом:

  • четкость поиска и устранения неполадок в будущем (анализ журнала)
  • простое создание данных по различным критериям

Мы можем увидеть основные различия, сравнивая результаты данных бок о бок (нажмите на изображение, чтобы развернуть его).:

Разборчивость будущих поисков и устранения неполадок (анализ)

Обычной деятельностью инженера, который пишет код, является устранение неполадок: мы постоянно просматриваем журналы и отлаживаем приложение, чтобы понять текущие и будущие проблемы в коде.

Теперь представьте, что вы смотрите на объект данных клиента, где данные были заполнены с помощью подхода RandomStringUtils: трудно сопоставить имеющиеся у вас данные со списком объектов, которые вы можете получить, или даже взглянуть на данные, используемые внутри файла журнала.

Простое создание данных по различным критериям

Для большинства атрибутов, присутствующих в классе customerData , вы можете использовать RandomStringUtils для генерации различных критериев. Например, вы можете легко задать 51 символ для атрибута name и ожидать неудачной проверки ограничения, используя RandomStringUtils.randomAlphanumeric(51);

Для более специализированных данных, таких как номер телефона и дата, вам нужна соответствующая библиотека, и JavaFaker может генерировать обе данные.

Таким образом, мы можем упростить процесс, приняв одну библиотеку.

Соображения

Конечно, я уделяю больше внимания библиотеке JavaFaker, потому что у нас есть почти все, что нам нужно для генерации данных, но это не исключает возможной необходимости использования класса RandomStringUtils или любого другого класса, размещенного в библиотеке Apache Commons.

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

Примеры

Проект avoid-randomstringutils показывает базовый пример сравнения RandomStringUtils и JavaFaker.

Проект restassured-complete-basic-example имеет класс factory data для генерации всех необходимых данных в различных условиях. Это хороший пример из реального мира.

Оригинал: “https://dev.to/eliasnogueira/reasons-to-avoid-randomstringutils-for-test-data-generation-ope”