Где запускаются unit тесты, на железе или в тестовом окружении
Что проверяют
Понимаете ли вы, чем юнит-тест отличается от интеграционного и системного, и что из этого следует для инфраструктуры. Следом часто спрашивают, кто пишет юнит-тесты в вашей команде и что тогда проверяется на тестовом стенде.
Как отвечать
Короткий ответ: ни там, ни там в привычном смысле. Юнит-тесты запускаются там, где собирается код: на машине разработчика и на агенте CI при каждом коммите или пулл-реквесте. Стенд с развёрнутым приложением, базой и соседними сервисами им не нужен: тестируемый модуль изолирован, зависимости подменены моками и заглушками. Хороший юнит-тест проходит за миллисекунды и не требует сети.
Дальше покажите, что знаете случаи, где вопрос про железо имеет смысл:
- встроенное ПО: логику обычно тестируют на хост-машине, заменив работу с периферией абстракцией и моками. Часть тестов прогоняют на целевом микроконтроллере или в эмуляторе, потому что компилятор, разрядность и порядок байтов там другие. Проверка с реальным железом в контуре, HIL, это уже интеграционный уровень;
- Android: локальные юнит-тесты из
src/testкрутятся на JVM без устройства, а инструментальные изsrc/androidTestтребуют эмулятор или телефон; - iOS: тесты на XCTest обычно идут в симуляторе, а проверки, завязанные на камеру и сенсоры, требуют реального устройства.
Тестовый стенд нужен для интеграционных, системных и e2e проверок, которыми как раз занимается QA. Хорошо связать это с пирамидой тестирования: юнитов много и они дешёвые, сценариев на стенде мало и они дорогие.
Где спотыкаются
Называют юнит-тестом любую автоматическую проверку, в том числе прогон UI-сценария на стенде. После этого интервьюер сомневается во всей терминологии кандидата.
Путают тестовое окружение с CI. Пайплайн может гонять юнит-тесты без всякого стенда, а может разворачивать стенд для интеграционных проверок, и это разные шаги.
Считают, что юнит-тесты на железе дают «более релевантный результат». Для бизнес-логики это неверно: если её результат зависит от устройства, это баг переносимости, и ловят его отдельным прогоном на целевой платформе.