Знаете ли циклы и условия в программировании
Что проверяют
Для тестировщика это вопрос-фильтр: сможете ли вы читать и писать код автотестов и понимать логику приложения, чтобы строить тест-кейсы. Следом обычно дают короткую задачу (найти дубли в списке, пройти по ответу API) или спрашивают, как условия в коде связаны с покрытием ветвей.
Как отвечать
Покажите базу на языке своих автотестов, чаще это Python, Java или JavaScript:
- условия:
if/elif/elseв Python,if/else if/elseв Java и JS,switchв Java и JS,matchв Python 3.10+, тернарный оператор. Логические операторы ленивые: вa and bправая часть не вычисляется, еслиaложно; - циклы:
for,while,do-while(есть в Java и JS, в Python нет). В Go цикл один,for, он же заменяетwhile; - перебор коллекций:
for item in itemsв Python,for (const x of arr)в JS,for (T x : list)в Java. В JSfor...inперебирает ключи, а не значения; - управление:
break,continue, в Python ещёelseу цикла, который выполняется, если не былоbreak.
Главное для QA, связь с тестированием. Каждое условие в коде это минимум две ветки, которые нужно проверить, а условие if age >= 18 подсказывает граничные значения 17, 18 и 19. Цикл проверяют на нуле, одной и многих итерациях. В самих тестах вместо цикла по данным лучше параметризация: @pytest.mark.parametrize или @ParameterizedTest в JUnit 5. Тогда каждое значение становится отдельным тестом со своей строкой в отчёте.
Где спотыкаются
Пишут в автотесте цикл с проверками внутри. Первый упавший assert обрывает остальные случаи, и по отчёту непонятно, сколько данных сломано.
Ошибаются на границах: range(5) это числа от 0 до 4, а for (let i = 0; i <= arr.length; i++) выходит за конец массива. Такие ошибки «на единицу» тестировщик должен замечать и в чужом коде.
Удаляют элементы из списка прямо в цикле по нему. В Python это молча пропускает соседние элементы, а в Java с ArrayList обычно заканчивается ConcurrentModificationException.