Какие переменные предпочтительнее использовать в автотестах?
Что проверяют
Вопрос не про типы данных, а про то, где в автотестах живут данные и конфигурация и как это влияет на стабильность и параллельный запуск. Следом часто спрашивают, где вы храните пароли тестовых пользователей и адрес стенда.
Как отвечать
Разложите переменные по назначению:
- конфигурация окружения: адрес стенда, таймауты, учётные данные. Берутся из переменных окружения или конфига под окружение (
.env,application-test.yml), секреты лежат в хранилище секретов CI, а не в репозитории; - константы: неизменяемые значения, общие для набора тестов, например тексты ошибок. Именуются в верхнем регистре, в Java это
static final; - локальные переменные теста: всё, что относится к одному сценарию. Тест должен читаться сверху вниз без прыжков по файлам;
- фикстуры: подготовка данных и ресурсов через
@pytest.fixtureс нужнымscopeили@BeforeEachв JUnit 5. Состояние создаётся заново и убирается после теста; - параметры:
@pytest.mark.parametrizeили@ParameterizedTestс@CsvSource, когда один сценарий гоняется на наборе данных; - сгенерированные данные: уникальные логины и почты через
uuidили Faker, чтобы тесты не конфликтовали между собой.
Отдельно скажите про локаторы: они живут полями в Page Object, а не строками внутри теста. И про актуальный Selenium 4: методы вида find_element_by_id из него удалены, пишется driver.find_element(By.ID, "login").
Главный принцип: чем меньше изменяемого общего состояния, тем проще запускать тесты параллельно через pytest-xdist или параллельный режим JUnit 5.
Где спотыкаются
Передают данные между тестами через глобальные переменные: один тест создаёт заказ, другой его проверяет. Такие тесты зависят от порядка и падают при параллельном запуске или при перезапуске одного теста.
Хардкодят адрес стенда и пароли прямо в коде. Переключиться на другое окружение без правки кода нельзя, а секрет навсегда остаётся в истории git.
Используют одного тестового пользователя на все потоки. Один тест меняет ему настройки, другой в это время проверяет старые, и появляются «плавающие» падения без видимой причины.