Интеграционные тесты
Этот документ содержит информацию о фреймворке интеграционного тестирования, используемом в проекте.
Обзор
Интеграционные тесты предназначены для проверки сквозной функциональности Qwen Code. Они запускают собранный бинарный файл в контролируемой среде и проверяют, что он ведет себя должным образом при взаимодействии с файловой системой.
Тесты находятся в директории integration-tests и запускаются с помощью кастомного test runner’а.
Запуск тестов
Интеграционные тесты не запускаются по умолчанию командой npm run test. Их нужно запускать явно, используя скрипт npm run test:integration:all.
Также интеграционные тесты можно запустить, используя следующий ярлык:
npm run test:e2eЗапуск определенного набора тестов
Чтобы запустить подмножество тестовых файлов, используйте команду npm run <integration test command> <file_name1> ...., где <integration test command> — это либо test:e2e, либо test:integration*, а <file_name> — любой из файлов с расширением .test.js в директории integration-tests/. Например, следующая команда запускает list_directory.test.js и write_file.test.js:
npm run test:e2e list_directory write_fileЗапуск одного теста по названию
Чтобы запустить один тест по его названию, используйте флаг --test-name-pattern:
npm run test:e2e -- --test-name-pattern "reads a file"Запуск всех тестов
Чтобы запустить весь набор интеграционных тестов, выполните следующую команду:
npm run test:integration:allМатрица sandbox
Команда all запустит тесты для no sandboxing, docker и podman.
Каждый отдельный тип можно запустить с помощью следующих команд:
npm run test:integration:sandbox:nonenpm run test:integration:sandbox:dockernpm run test:integration:sandbox:podmanДиагностика
Test runner интеграционных тестов предоставляет несколько опций для диагностики, которые помогут отследить причины падений тестов.
Сохранение вывода тестов
Вы можете сохранить временные файлы, созданные во время выполнения теста, для последующего анализа. Это полезно при отладке проблем с операциями файловой системы.
Чтобы сохранить вывод теста, установите переменную окружения KEEP_OUTPUT в значение true.
KEEP_OUTPUT=true npm run test:integration:sandbox:noneЕсли вывод сохраняется, test runner выведет путь к уникальному каталогу для этого запуска теста.
Подробный вывод
Для более детальной отладки установите переменную окружения VERBOSE в значение true.
VERBOSE=true npm run test:integration:sandbox:noneПри одновременном использовании VERBOSE=true и KEEP_OUTPUT=true в одной команде вывод будет направлен в консоль и также сохранен в лог-файл внутри временной директории теста.
Формат подробного вывода позволяет легко определить источник логов:
--- TEST: <log dir>:<test-name> ---
... вывод от команды qwen ...
--- END TEST: <log dir>:<test-name> ---Линтинг и форматирование
Для обеспечения качества и согласованности кода, файлы интеграционных тестов проверяются линтером в рамках основного процесса сборки. Вы также можете вручную запустить линтер и автоматическое исправление.
Запуск линтера
Чтобы проверить наличие ошибок линтинга, выполните следующую команду:
npm run lintВы можете добавить флаг :fix к команде, чтобы автоматически исправить все возможные ошибки линтинга:
npm run lint:fixСтруктура директорий
Интеграционные тесты создают уникальную директорию для каждого запуска тестов внутри директории .integration-tests. В этой директории создаются поддиректории для каждого тестового файла, а внутри них — поддиректории для каждого отдельного тест-кейса.
Такая структура позволяет легко находить артефакты для конкретного запуска тестов, файла или кейса.
.integration-tests/
└── <run-id>/
└── <test-file-name>.test.js/
└── <test-case-name>/
├── output.log
└── ...other test artifacts...Непрерывная интеграция
Чтобы гарантировать, что интеграционные тесты всегда выполняются, в файле .github/workflows/e2e.yml определен workflow для GitHub Actions. Этот workflow автоматически запускает интеграционные тесты для pull request’ов в ветку main, либо когда pull request добавляется в очередь на слияние.
Workflow запускает тесты в различных средах песочницы, чтобы убедиться, что Qwen Code тестируется в каждой из них:
sandbox:none: Запуск тестов без какой-либо песочницы.sandbox:docker: Запуск тестов в Docker-контейнере.sandbox:podman: Запуск тестов в Podman-контейнере.