Ответ
В автотестах на Java коллекции — это основной инструмент для работы с данными, ожидаемыми результатами и группами объектов. Вот типичные сценарии использования:
-
Хранение и сравнение наборов данных. Часто нужно сравнить список элементов, полученный из UI или API, с ожидаемым списком.
// Ожидаемые категории товаров List<String> expectedCategories = Arrays.asList("Электроника", "Одежда", "Книги"); // Фактические категории, полученные, например, парсингом страницы List<String> actualCategories = productPage.getCategoryNames(); assertThat(actualCategories).containsExactlyElementsOf(expectedCategories); -
Проверка уникальности. Использую
Setдля проверки, что в выпадающем списке или таблице нет дубликатов.Set<String> uniqueStatuses = new HashSet<>(apiResponse.getOrderStatuses()); assertEquals(apiResponse.getOrderStatuses().size(), uniqueStatuses.size()); // Проверка на дубли -
Работа с тестовыми данными (Data Provider). В TestNG
@DataProviderчасто возвращает коллекцию массивов объектов для параметризации.@DataProvider public Object[][] userCredentials() { return new Object[][] { {"user1", "pass1"}, {"user2", "pass2"} }; } -
Группировка объектов для проверок. Например,
Map<String, List<Product>>для группировки товаров по категориям перед сложной проверкой. -
Имитация очереди (Queue) в нагрузочных тестах или тестах, моделирующих последовательную обработку заявок.
Коллекции из java.util.concurrent (например, ConcurrentHashMap) могут понадобиться при написании многопоточных тестов или утилит для тестирования.
Ответ 18+ 🔞
Слушай, а ведь правда, в автотестах на Java без коллекций — как без рук. Это ж основа основ, инструмент, которым ты всё время долбишь по коду, чтобы проверить, не развалился ли он. Просто представь: ты пишешь тест, а там негде хранить кучу данных, которые нужно сравнить или обработать. Это пиздец, а не разработка.
Вот смотри, как это обычно выглядит на практике, ёпта.
Первое — хранение и сравнение кучи всего. Допустим, ты проверяешь, что на сайте в фильтре отображаются все нужные категории товаров. Ты заранее знаешь, что должно быть: "Электроника", "Одежда", "Книги". Это твой ожидаемый список. А потом ты парсишь страницу и вытаскиваешь фактические названия. И тут начинается магия сравнения. Если списки не совпадают — всё, приехали, где-то косяк.
// Ожидаемые категории товаров
List<String> expectedCategories = Arrays.asList("Электроника", "Одежда", "Книги");
// Фактические категории, полученные, например, парсингом страницы
List<String> actualCategories = productPage.getCategoryNames();
assertThat(actualCategories).containsExactlyElementsOf(expectedCategories);
Вот тут assertThat — твой верный пёс, который либо молча кивает, если всё ок, либо начинает орать, как сука, если списки разные. Удобно, чёрт возьми.
Второе — проверка на дурака, то есть на дубликаты. Бывает же такое: открываешь выпадающий список статусов заказов, а там одно и то же по три раза. Выглядит, как манда с ушами. Чтобы этого не было, юзаешь Set. Он, гад, по определению хранит только уникальные штуки. Закинул в него список, а потом сравнил размер исходного списка и сета. Если размеры равны — дублей нет, можно выдохнуть.
Set<String> uniqueStatuses = new HashSet<>(apiResponse.getOrderStatuses());
assertEquals(apiResponse.getOrderStatuses().size(), uniqueStatuses.size()); // Проверка на дубли
Если размеры разные — значит, где-то в коде сидит мартышлюшка, которая плодит одинаковые статусы.
Третье — тестовые данные, ёбана. Особенно в TestNG. Ты же не будешь для каждого логина и пароля писать отдельный тест? На это жизни не хватит. Вот тут на помощь приходит @DataProvider, который возвращает коллекцию массивов. По сути, табличку с данными. Один тестовый метод прогоняется по всем строчкам этой таблицы. Красота!
@DataProvider
public Object[][] userCredentials() {
return new Object[][] {
{"user1", "pass1"},
{"user2", "pass2"}
};
}
Написал один раз — и гоняй тест с разными данными. Экономия времени — овердохуища.
Четвёртое — группировка перед боем. Иногда данные приходят такой кучей, что в них нихера не разобрать. Например, список товаров со всей хуйнёй: названия, цены, категории. Чтобы проверить что-то сложное (например, среднюю цену по категории), их нужно сначала сгруппировать. Тут в дело вступает Map<String, List<Product>>. Закинул туда товары по категориям — и вот у тебя уже не свалка, а структурированные данные, с которыми можно работать.
Пятое — когда нужно имитировать очередь. Допустим, пишешь нагрузочный тест, где заявки должны обрабатываться строго по очереди, как в какой-нибудь регистратуре. Или тестируешь систему событий. На помощь приходит Queue. Кидаешь в неё задачи, а потом по одной вытаскиваешь и проверяешь, как они обработались. Всё чинно, благородно, без хаоса.
А ещё, чувак, не забывай про коллекции из java.util.concurrent. Это когда твои тесты начинают шагать в несколько потоков. Обычная HashMap в такой ситуации может взять и накрыться медным тазом, потому что её из двух потоков одновременно дернут. А ConcurrentHashMap — хитрая жопа, она к такому готова. Используешь её, когда пишешь многопоточные тесты или какие-нибудь хитрые утилитки для тестирования параллельных процессов.
Короче, коллекции в автотестах — это как отвертка и пассатижи в ящике с инструментами. Без них нихуя не соберёшь и не починишь. Главное — знать, какой инструмент и когда хватать.