Тесты
Четыре вида тестов, от быстрых к медленным. Все работают в Linux; сквозным тестам нужен экран или Xvfb.
Модульные и интеграционные тесты
npm test # vitest: tests/unit, tests/integration, tests/corpus
npx vitest run tests/unit/wiki.test.ts # один файлtests/unit: по одному модулю: движок команд, кодек workflow, проверка «только чтение», миграции, тексты, уроки, вики.tests/integration: несколько модулей вместе с настоящей базой SQLite: чат, который строит граф, ход, который встречает правку человека, синхронизация с поддельным MCP-сервером (tests/fixtures/mcp).- Вместо настоящей модели отвечает модель с заготовленными ответами (
src/main/testLLMTransport.ts); в сеть ничего не уходит. - Модульный тест считается зависшим через 30 секунд (
testTimeoutвvitest.config.ts). Под большой нагрузкой несколько медленных тестов всё же могут в него упереться; запускайте их отдельно или с--testTimeout=60000. - Пределы времени:
npm testтолько записывает, сколько идёт тест большого каталога, потому что жёсткий предел на занятой машине иногда срабатывает зря.npm run test:perf(PERF_BUDGETS=1) запускает тот же тест с пределами.
npm run test:perf # пределы времени tests/unit/largeCatalog.test.tsПроверка типов и lint
npm run type-check # main, renderer и тесты
npm run type-check:tests # только тесты (tsconfig.tests.json)
npm run lint # ESLint по src, tests, scripts и forge.config.js (eslint.config.mjs)Сквозные тесты
Они запускают собранное приложение в Electron через Playwright. Тест запускает приложение через launchApp() из
tests/e2e/support/app.ts, а не сам: она даёт приложению временный профиль через --user-data-dir (удаляется при
закрытии; NODEWISE_KEEP_PROFILES=1 оставляет его, чтобы посмотреть), поэтому тест никогда не читает и не пишет
профиль того, кто его запускает. Сначала npm run build, иначе тесты проверяют старый код.
NODEWISE_PACKAGED_PROVIDERS=1 заставляет запуск без упаковки предлагать ровно тех помощников, что и установленное
приложение (без проверочного режима TEST); им пользуется npm run shots:public для публичных снимков экрана.
npm run build
xvfb-run -a npx playwright test --trace off --grep-invert "live-local|layout-walk" # всё, кроме обхода
xvfb-run -a npx playwright test tests/e2e/about-help.test.ts --trace off # один файлТесты live-local говорят с настоящим сервером модели на этом компьютере (127.0.0.1:18080) и пропускаются, если
там никто не слушает.
Обход экранов
tests/e2e/layout-walk.test.ts открывает каждый экран при нескольких размерах окна и ищет то, что вылезло из своего
блока, обрезано, ушло за край окна, наехало на соседа или сжато до нечитаемого, и читает каждый текст: нет ли
незаполненной вставки, «undefined» или голого ключа. Ещё он проверяет, что карточка-описание стоит у своей ноды и
шириной с неё при любом масштабе. Запускайте его отдельно: он подолгу держит открытыми меню, а второе окно приложения
закрыло бы их.
xvfb-run -a npx playwright test tests/e2e/layout-walk.test.ts --trace off
LAYOUT_FULL=1 xvfb-run -a npx playwright test tests/e2e/layout-walk.test.ts --trace off # все размеры
LAYOUT_LANG=en … # по-английски (по умолчанию по-русски, тексты длиннее)
LAYOUT_TEXT=wide … # текст шире на 4 %
LAYOUT_DPR=1.5 … # масштаб экрана 150 %
LAYOUT_FONTS=hinted … # шрифты с хинтингом
LAYOUT_SIZES=800x560,1400x860 … # только эти размеры окна
LAYOUT_ONLY=canvas,helper … # только эти части
LAYOUT_OUT=<папка> … # сохранить отчёт и снимкиtests/e2e/layout-audit.test.ts проверяет сам обход на нарочно сломанной и на правильной странице.
tests/e2e/node-size.test.ts рисует каждую ноду каталога и сравнивает её высоту с той, что приложение рассчитало
заранее (по ней ставятся новые ноды).
Набор workflow
tests/corpus/workflowRoundTrip.test.ts открывает каждый workflow ComfyUI в названных папках, сохраняет обратно и
сравнивает, затем правит каждый так, как это делает холст, и проверяет, что в сохранённом файле ровно эта правка:
WORKFLOW_CORPUS=/path/a:/path/b npx vitest run tests/corpusБез WORKFLOW_CORPUS он пропускается.
Вики
tests/unit/wiki.test.ts проверяет, что у каждой страницы есть оба языка, ссылка на другой язык в первой строке и
путь во второй, что каждая относительная ссылка ведёт на файл, что каждое оглавление перечисляет свои страницы и что у
каждого урока есть страница. WIKI_STRICT=1 npx vitest run tests/unit/wiki.test.ts перед выпуском падает ещё и тогда,
когда остался комментарий verify или skeleton (комментарий HTML, который начинается с одного из этих слов и
двоеточия).
Что запускает CI
.github/workflows/ci.ymlна каждый запрос на слияние и каждый пуш в основную ветку: проверка списка изменений,node scripts/public-tree-check.js,npm ci, проверка типов, модульные и интеграционные тесты и сборка; вторая задача собирает приложение и проходит короткий список сквозных сценариев (правка, файлы, приватность, проверка и список уроков) под Xvfb. У него права только на чтение и нет секретов..github/workflows/release.ymlпо тегам, вручную и раз в неделю: сквозные тесты, обходы экранов, четыре пакета и их проверки, проверка обновления, затем выпуск. Выпуск версии