Где хранить данные для тестов: логины, пароли, URL
Что проверяют
Понимаете ли вы разницу между настройками окружения и секретами и умеете ли организовать данные так, чтобы тесты запускались на любом стенде и в CI без правки кода. Следом обычно спрашивают, как тесты получают пароль в пайплайне и что делать при параллельном прогоне.
Как отвечать
Разделите данные по типам, у каждого своё место:
- URL и настройки стенда: это не секрет, их держат в репозитории, но отдельно от кода, по файлу на окружение (
config/dev.yaml,config/stage.yaml). Окружение выбирают переменной вродеENVилиBASE_URL. В Playwright этоbaseURLвplaywright.config.ts, в Java профили или системные свойства через-D, в pytest опции командной строки; - логины и пароли: никогда в репозиторий. Локально они лежат в
.env, внесённом в.gitignore, в CI это секреты пайплайна (secrets в GitHub Actions, маскированные переменные GitLab CI) или хранилище вроде HashiCorp Vault. Тест читает их из переменных окружения; - тестовые пользователи: лучше создавать их через API в фикстуре перед тестом и удалять после. Если так нельзя, заведите пул выделенных аккаунтов на каждый стенд, чтобы параллельные потоки не делили одну учётку;
- данные для параметризации: наборы входных значений без секретов в JSON, CSV или YAML рядом с тестами, подключаются через
@pytest.mark.parametrize,@CsvFileSourceв JUnit 5 или@DataProviderв TestNG.
Упомяните и отчёты: пароли не должны попадать в логи, шаги Allure и скриншоты. Сохранённую сессию, например файл storageState в Playwright, тоже не коммитят: там живые куки.
Где спотыкаются
Коммитят пароль, потому что «это же тестовый стенд». Из истории git он никуда не денется даже после удаления, а тестовые пароли часто совпадают с рабочими или открывают доступ к внутренним системам.
Предлагают шифровать пароль в JSON и кладут ключ в тот же репозиторий, или хранят хэш. Хэшем не залогиниться, а шифр с ключом в соседнем файле ничего не защищает.
Гоняют все тесты под одним аккаунтом. При параллельном запуске тесты выкидывают друг друга из сессии и портят общие данные, и прогон падает без видимой причины.