Топ-50 вопросов на собеседовании QA Automation в 2026 году
Полный список реальных вопросов с технических интервью в Яндекс, Сбер, VK и других IT-компаниях. Java Core, Collections, HTTP, TestNG, Selenium. С ответами и примерами кода.
Теория тестирования — вопросы на собеседовании
1. Что такое тест-план и что в него входит?
Тест-план — документ, описывающий стратегию тестирования. Включает: цели, объём, подходы, ресурсы, риски, критерии входа/выхода.
2. Чем отличается smoke от sanity тестирования?
Smoke — быстрая проверка основных функций после сборки. Sanity — проверка конкретного исправления или новой функциональности.
3. Что такое регрессионное тестирование?
Проверка того, что новые изменения не сломали существующую функциональность. Один из самых частых вопросов на собеседовании QA.
4. Разница между верификацией и валидацией?
Верификация — делаем ли мы продукт правильно (соответствие требованиям). Валидация — делаем ли мы правильный продукт (соответствие ожиданиям пользователя).
Автоматизация и инструменты — вопросы на интервью
5. Что такое Page Object Model?
Паттерн проектирования, где каждая страница приложения представлена отдельным классом. Методы класса описывают действия на странице. Упрощает поддержку автотестов.
6. Чем отличается $ от $$ в Selenide?
$ возвращает один элемент (SelenideElement) — аналог findElement. $$ возвращает коллекцию элементов (ElementsCollection) — аналог findElements. Selenide автоматически ждёт появления элемента.
7. Что такое явное и неявное ожидание? Как Selenide решает эту проблему?
В Selenium нужно явно писать WebDriverWait. Selenide решает это автоматически — каждое действие ждёт элемент по умолчанию 4 секунды (настраивается через Configuration.timeout).
8. Как работает XPath? Приведи пример.
XPath — язык запросов для навигации по XML/HTML. Пример: //div[@class='button' and text()='Войти'] — найти div с классом button и текстом Войти.
9. Что такое CSS-селектор? Чем отличается от XPath?
CSS-селектор — синтаксис выбора элементов через CSS. Быстрее XPath в большинстве браузеров, но не поддерживает навигацию вверх по дереву.
10. Как тестировать REST API?
Проверять: статус-коды ответов, структуру JSON/XML, заголовки, время ответа, граничные значения, авторизацию, обработку ошибок.
Java-специфичные вопросы на собеседовании QA
11. Что такое аннотации @Test, @BeforeEach, @AfterEach в JUnit 5?
@Test — метод является тестом. @BeforeEach — выполняется перед каждым тестом. @AfterEach — после каждого теста.
12. Что такое параметризованные тесты?
Тесты, которые запускаются с разными наборами данных. В JUnit 5 — @ParameterizedTest с @ValueSource, @CsvSource и другими.
13. Как работает AssertJ?
Библиотека для fluent-assertions. Пример: assertThat(result).isNotNull().isEqualTo(expected).contains(exp).
14. Что такое Allure Report?
Фреймворк для генерации красивых HTML-отчётов о результатах тестирования с шагами, скриншотами и историей запусков.
CI/CD и инфраструктура — вопросы на интервью QA
15. Что такое Jenkins Pipeline?
Скрипт (Jenkinsfile) описывающий шаги сборки и тестирования. Позволяет автоматически запускать тесты при каждом коммите.
16. Зачем нужен Docker в тестировании?
Изолированная среда для запуска тестов. Одинаковое окружение на всех машинах. Selenide + Selenium Grid в Docker для параллельного запуска.
17. Что такое Selenium Grid?
Инструмент для параллельного запуска тестов на нескольких браузерах и машинах одновременно. Selenide работает поверх Selenium Grid без изменений в коде тестов.
Вопросы на понимание процессов QA
18. Как приоритизировать баги?
По двум осям: серьёзность (severity) — насколько сильно баг влияет на функциональность, и приоритет (priority) — насколько срочно нужно исправить.
19. Что делать если тест нестабильный (flaky test)?
Найти причину: явные ожидания вместо неявных, изоляция тестовых данных, проверка зависимостей между тестами, логирование для диагностики.
20. Как организовать тестовые данные?
Фабрики тестовых данных, фикстуры, моки, тестовые базы данных, очистка после каждого теста.
Практические задачи на собеседовании QA Automation
На собеседованиях часто дают написать код прямо на месте:
- ▸Написать автотест для формы логина
- ▸Найти элемент по XPath или CSS-селектору
- ▸Написать параметризованный тест
- ▸Реализовать Page Object для конкретной страницы
Java Core — вопросы на собеседовании QA Automation
21. Что такое for each в Java? Как работает во что преобразуется?
Enhanced for loop (for-each) — синтаксический сахар для итерации по коллекциям и массивам. Компилятор преобразует его в обычный цикл с Iterator для коллекций или индексный цикл для массивов.
1// For-each цикл
2List<String> list = Arrays.asList("A", "B", "C");
3for (String item : list) {
4 System.out.println(item);
5}
6
7// Преобразуется компилятором в:
8Iterator<String> iterator = list.iterator();
9while (iterator.hasNext()) {
10 String item = iterator.next();
11 System.out.println(item);
12}22. Чем обеспечивается уникальность Set?
Уникальность в Set обеспечивается методами equals() и hashCode(). При добавлении элемента Set проверяет: если hashCode() одинаковый И equals() возвращает true, то элемент считается дубликатом и не добавляется.
23. Почему нельзя делать множественное наследование? А реализовывать множество интерфейсов можно?
Множественное наследование классов запрещено из-за проблемы Diamond Problem — неоднозначности при наследовании от двух классов с одинаковыми методами. Интерфейсы можно реализовывать множественно, так как они содержат только абстрактные методы (до Java 8) или default методы с четкими правилами разрешения конфликтов.
24. Вопросы про примитивные и ссылочные типы, когда передается ссылка, когда примитив?
В Java всегда передается значение. Для примитивов передается копия значения, для объектов — копия ссылки на объект. Примитивы: byte, short, int, long, float, double, boolean, char. Все остальное — ссылочные типы.
1// Примитив - передается копия значения
2int x = 5;
3changeInt(x);
4System.out.println(x); // 5 - не изменился
5
6// Объект - передается копия ссылки
7List<String> list = new ArrayList<>();
8changeList(list);
9System.out.println(list.size()); // изменился!25. String pool, как вызвать тот же объект из String Pool?
String Pool — область памяти в heap для хранения строковых литералов. Метод intern() помещает строку в пул или возвращает существующую.
1String s1 = "Hello"; // в String Pool
2String s2 = "Hello"; // та же ссылка из пула
3String s3 = new String("Hello"); // новый объект в heap
4String s4 = s3.intern(); // получить из пула
5
6System.out.println(s1 == s2); // true
7System.out.println(s1 == s3); // false
8System.out.println(s1 == s4); // true26. Вопросы про Heap и Stack? Что и как, где хранится?
Stack — хранит локальные переменные и ссылки на объекты, быстрый доступ, автоматическая очистка. Heap — хранит объекты, медленнее, очищается Garbage Collector. Примитивные локальные переменные в Stack, объекты в Heap.
27. Рассказать про сравнение объектов в Java: == и equals, чем отличаются?
== сравнивает ссылки (адреса в памяти) для объектов и значения для примитивов. equals() сравнивает содержимое объектов и может быть переопределен. Для String, Integer и других wrapper классов equals() сравнивает значения.
28. Как реализовать запись перед каждым тестом запись 'тест начался'?
Используйте аннотацию @BeforeEach в JUnit 5 или @BeforeMethod в TestNG для выполнения кода перед каждым тестом.
1@BeforeEach
2void setUp() {
3 System.out.println("Тест начался");
4 // или logger.info("Test started");
5}29. Как сделать эту запись перед классами? Один раз за весь запуск? Как перед каждым методом?
Используйте разные аннотации JUnit 5 для разных уровней выполнения:
- ▸@BeforeAll — один раз перед всеми тестами в классе (метод должен быть static)
- ▸@BeforeEach — перед каждым тестом
- ▸@AfterEach — после каждого теста
- ▸@AfterAll — один раз после всех тестов в классе (метод должен быть static)
30. Как сделать параметризованные тесты в JUnit/TestNG?
В JUnit 5 используйте @ParameterizedTest с источниками данных. В TestNG используйте @DataProvider.
1// JUnit 5
2@ParameterizedTest
3@ValueSource(strings = {"apple", "banana", "cherry"})
4void testFruits(String fruit) {
5 assertNotNull(fruit);
6}
7
8// TestNG
9@DataProvider
10public Object[][] testData() {
11 return new Object[][]{{"apple"}, {"banana"}};
12}
13
14@Test(dataProvider = "testData")
15void testFruits(String fruit) {
16 assertNotNull(fruit);
17}Stream API — вопросы на собеседовании
31. Stream, как методы есть?
Stream API предоставляет промежуточные операции (filter, map, sorted, distinct, limit) и терминальные операции (collect, forEach, reduce, count, findFirst, anyMatch).
32. Что такое flatMap? peek?
flatMap() разворачивает вложенные структуры — преобразует Stream<Stream<T>> в Stream<T>. peek() позволяет выполнить действие с каждым элементом без изменения потока, полезен для отладки.
1// flatMap - разворачивание
2List<List<String>> nested = Arrays.asList(
3 Arrays.asList("a", "b"),
4 Arrays.asList("c", "d")
5);
6List<String> flat = nested.stream()
7 .flatMap(Collection::stream)
8 .collect(toList()); // [a, b, c, d]
9
10// peek - отладка
11List<String> result = names.stream()
12 .peek(s -> System.out.println("Processing: " + s))
13 .map(String::toUpperCase)
14 .collect(toList());33. Что такое функциональный интерфейс? Могут ли быть в нем методы default и static?
Функциональный интерфейс содержит ровно один абстрактный метод. Может содержать любое количество default и static методов. Аннотация @FunctionalInterface проверяет это условие.
1@FunctionalInterface
2interface MyFunction {
3 String process(String input); // единственный абстрактный метод
4
5 default String processWithPrefix(String input) {
6 return "Prefix: " + process(input);
7 }
8
9 static String staticMethod() {
10 return "Static method";
11 }
12}SQL — вопросы для QA Automation
34. Как стандартные функциональные интерфейсы знаешь?
Основные функциональные интерфейсы в java.util.function: Function<T,R> (преобразование), Predicate<T> (условие), Consumer<T> (потребление), Supplier<T> (поставка), BiFunction, UnaryOperator, BinaryOperator.
35. Чем отличается Union от Join?
UNION объединяет результаты двух SELECT запросов в один результат (вертикальное объединение). JOIN соединяет строки из разных таблиц по условию (горизонтальное объединение).
1-- UNION - объединение результатов
2SELECT name FROM users WHERE age > 25
3UNION
4SELECT name FROM admins WHERE active = true;
5
6-- JOIN - соединение таблиц
7SELECT u.name, o.total
8FROM users u
9JOIN orders o ON u.id = o.user_id;36. Что такое distinct?
DISTINCT удаляет дубликаты из результата запроса, возвращая только уникальные строки.
1-- Без DISTINCT - могут быть дубликаты
2SELECT city FROM users;
3
4-- С DISTINCT - только уникальные города
5SELECT DISTINCT city FROM users;37. Как вывести только повторяющиеся строки?
Используйте GROUP BY с HAVING COUNT(*) > 1 для поиска дубликатов.
1-- Найти повторяющиеся email
2SELECT email, COUNT(*)
3FROM users
4GROUP BY email
5HAVING COUNT(*) > 1;Collections Framework — вопросы на собеседовании
38. В чем разница между ArrayList и LinkedList?
ArrayList основан на массиве — быстрый доступ O(1), медленная вставка O(n). LinkedList основан на двусвязном списке — медленный доступ O(n), быстрая вставка O(1). В 99% случаев используйте ArrayList.
1// ArrayList - быстрый доступ
2List<String> arrayList = new ArrayList<>();
3arrayList.add("A");
4String element = arrayList.get(1); // O(1) - мгновенно!
5
6// LinkedList - быстрая вставка
7List<String> linkedList = new LinkedList<>();
8linkedList.add(1, "B"); // O(1) - быстро!
9String elem = linkedList.get(100); // O(n) - медленно39. В чем разница между HashSet, LinkedHashSet и TreeSet?
HashSet — самый быстрый O(1), неупорядоченный. LinkedHashSet — сохраняет порядок вставки. TreeSet — отсортированный O(log n), не разрешает null.
1// HashSet - случайный порядок
2Set<String> hashSet = new HashSet<>();
3hashSet.add("Banana");
4hashSet.add("Apple");
5// [Cherry, Apple, Banana] - случайный порядок
6
7// TreeSet - отсортированный
8Set<String> treeSet = new TreeSet<>();
9treeSet.add("Banana");
10treeSet.add("Apple");
11// [Apple, Banana] - алфавитный порядок40. Как работает HashMap внутри? Что такое collision?
HashMap хранит данные в массиве корзин. hashCode() определяет корзину, equals() используется при коллизиях. Collision — когда разные ключи попадают в одну корзину. До Java 8 — связный список, с Java 8 — дерево при >8 элементах.
41. Можно ли использовать любой объект как ключ в HashMap?
Технически да, но ключ должен быть immutable и правильно переопределять hashCode() и equals(). Если ключ изменится после добавления в Map, элемент 'потеряется'.
1// Правильный immutable ключ
2public final class ImmutableKey {
3 private final String value;
4
5 public ImmutableKey(String value) {
6 this.value = value;
7 }
8
9 @Override
10 public int hashCode() {
11 return Objects.hash(value);
12 }
13
14 @Override
15 public boolean equals(Object obj) {
16 if (obj instanceof ImmutableKey) {
17 return value.equals(((ImmutableKey) obj).value);
18 }
19 return false;
20 }
21}HTTP и API тестирование — вопросы на интервью
42. Какие основные HTTP методы существуют?
GET — получение данных, POST — создание, PUT — полное обновление, PATCH — частичное обновление, DELETE — удаление, HEAD — получение заголовков, OPTIONS — доступные методы.
43. В чем разница между PUT и PATCH?
PUT — полная замена ресурса (все поля обязательны), PATCH — частичное обновление (только указанные поля). PUT идемпотентен, PATCH может быть неидемпотентным.
1// PUT - полная замена
2given()
3 .body("{\"name\": \"Alice\", \"email\": \"alice@example.com\", \"age\": 26}")
4 .put("/api/users/1");
5
6// PATCH - частичное обновление
7given()
8 .body("{\"age\": 26}")
9 .patch("/api/users/1");44. Что такое идемпотентность HTTP методов?
Идемпотентность — многократное выполнение дает тот же результат. Идемпотентные: GET, PUT, DELETE, HEAD, OPTIONS. Неидемпотентные: POST, PATCH.
45. Какие основные HTTP статус-коды нужно знать?
2xx — успех (200 OK, 201 Created, 204 No Content), 4xx — ошибка клиента (400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found), 5xx — ошибка сервера (500 Internal Server Error).
TestNG и JUnit — вопросы на собеседовании
46. Что такое жизненный цикл теста в TestNG?
Порядок выполнения: @BeforeSuite → @BeforeTest → @BeforeClass → @BeforeMethod → @Test → @AfterMethod → @AfterClass → @AfterTest → @AfterSuite. @BeforeMethod и @AfterMethod выполняются для каждого теста.
47. Что такое DataProvider в TestNG?
DataProvider — механизм параметризации тестов. Позволяет запускать один тест с разными наборами данных. Возвращает Object[][] где каждая строка — отдельный запуск теста.
1@DataProvider(name = "loginData")
2public Object[][] getLoginData() {
3 return new Object[][] {
4 {"user1@example.com", "password123", true},
5 {"invalid@example.com", "wrong", false}
6 };
7}
8
9@Test(dataProvider = "loginData")
10public void testLogin(String email, String password, boolean shouldSucceed) {
11 boolean result = performLogin(email, password);
12 Assert.assertEquals(result, shouldSucceed);
13}48. Как организовать тесты в группы в TestNG?
Используйте атрибут groups в @Test аннотации. Один тест может принадлежать нескольким группам. Запуск: mvn test -Dgroups=smoke или настройка в testng.xml.
1@Test(groups = {"smoke", "critical"})
2public void testLogin() { }
3
4@Test(groups = {"regression"})
5public void testUserProfile() { }
6
7// Запуск только smoke тестов
8// mvn test -Dgroups=smoke49. В чем разница между TestNG и JUnit 5?
TestNG: @BeforeMethod/@AfterMethod, встроенные группы, DataProvider, dependsOnMethods. JUnit 5: @BeforeEach/@AfterEach, @Tag для групп, @ParameterizedTest, более современный и гибкий.
50. Как организовать параллельный запуск тестов?
TestNG: настройка parallel и thread-count в testng.xml. JUnit 5: настройка через junit-platform.properties. Важно: тесты должны быть независимыми, используйте ThreadLocal для WebDriver.
1// TestNG - ThreadLocal для WebDriver
2private static ThreadLocal<WebDriver> driver = new ThreadLocal<>();
3
4@BeforeMethod
5public void setUp() {
6 driver.set(new ChromeDriver());
7}
8
9public static WebDriver getDriver() {
10 return driver.get();
11}Заключение
Эти 50 вопросов покрывают основные темы, которые встречаются на собеседованиях QA Automation в 2026 году. Помните: важно не только знать ответы, но и понимать, когда и как применять эти знания на практике.
Для дополнительной подготовки рекомендуем пройти мок-собеседование с экспертами ThreadQA — это поможет отработать навыки интервью и получить персональную обратную связь.