Стек:
System:
OS: macOS High Sierra 10.13.4
CPU: x64 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz
Binaries:
Node: 8.1.4 - ~/.nvm/versions/node/v8.1.4/bin/node
npm: 6.0.0 - ~/.nvm/versions/node/v8.1.4/bin/npm
npmPackages:
jest: ^23.0.1 => 23.0.1
sequelize: ^4.37.10
pg: ^7.4.3
koa: ^2.3.0
babel-jest: ^22.4.3
1.Предисловие
Недавно мы перевели все тесты нашего API с Mocha на Jest.У нас около 90 тестов, половина из которых требует синхронного запуска из-за их использования нашей тестовой базы данных (запуска семян между ними), поэтому мы должны использовать --runInBand.
Я, к сожалению, не могу поделиться своим кодом, поскольку он является приватным.
2.Проблема
Запуск тестов один за другим был в порядке, затем я попытался запустить их все сразу, и все пошло плохо.С --logHeapUsage кажется, что контекстная память не GC, что приводит к куче Javascript из памяти.
Я попытался использовать новую опцию --detectOpenHandles, чтобы увидеть, что может помешать работе GC, новот что получилось:
● PROMISE
at Promise.catch (<anonymous>)
at node_modules/core-js/library/modules/es6.promise.js:244:30
at Object.<anonymous>.module.exports (node_modules/core-js/library/modules/_iter-detect.js:19:5)
at Object.<anonymous> (node_modules/core-js/library/modules/es6.promise.js:243:74)
at Object.<anonymous> (node_modules/core-js/library/fn/promise.js:4:1)
У меня около 6-8 из них, и я понятия не имею, где искать.
Я искал и обнаружил, что это, скорее всего, соединение с базой данных, поэтому я добавил этикак глобальный разрыв:
afterAll(async () => {
await db.close(); // Sequelize instance
server.close(); // Koa server instance used with supertest (when needed)
});
Это не сильно изменилось, память все равно очень быстро растет (30-40 МБ на тест).В конце концов, я несколько раз написал небольшой файл для запуска, чтобы избежать проблем с памятью и склеить отчет о покрытии, но это не идеально.