Карма/Жасмин выбегает без тестов
Я пытаюсь запустить Karma/Jasmine из Grunt в проекте, созданном с помощью
http://newtriks.com/2013/12/31/automating-react-with-yeoman-and-grunt/
Karma запускает PhantomJS (или Chrome), и, в зависимости от singleRun, он либо выходит из строя, либо просто сидит там и ничего не делает. Я попытался изменить captureTimeout
и browserNoActivityTimeout
на основе чтения решений от людей с аналогичными проблемами, но, похоже, это не работает.
Мои соответствующие версии pacakge и т.д.:
- NodeJS: 0.10.25
- Карма: 0.12.16
- Webpack: 1.1.11
- webpack-dev-server: 1.4.1
- карма-жасмин: 0.1.5
- Linux: Ubuntu 14.04
Я нашел кого-то с той же проблемой в OS X:
Я пробовал обновлять все мои зависимости dev до последних версий, но проблема все еще остается.
Мой консольный вывод ниже. Линии webpack, ссылающиеся на пакет, теперь VALID/INVALID беспокоятся, но я не могу найти никакой информации о том, что они означают. Здесь мой консольный вывод:
Running "karma:unit" (karma) task
DEBUG [config]: autoWatch set to false, because of singleRun
DEBUG [plugin]: Loading karma-* from /home/ed/workspace/wwb-app/node_modules
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-chrome-launcher.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-coffee-preprocessor.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-firefox-launcher.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-html2js-preprocessor.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-jasmine.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-phantomjs-launcher.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-requirejs.
DEBUG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-script-launcher.
DEBG [plugin]: Loading plugin /home/ed/workspace/wwb-app/node_modules/karma-webpack-plugin.
INFO [karma]: Karma v0.12.16 server started at http://localhost:8080/
INFO [launcher]: Starting browser PhantomJS
DEBUG [temp-dir]: Creating temp dir at /tmp/karma-98204612
DEBUG [launcher]: /home/ed/workspace/wwb-app/node_modules/karma-phantomjs-launcher/node_modules/phantomjs/lib/phantom/bin/phantomjs /tmp/karma-98204612/capture.js
Hash: 89285186567c1bc5bb7f
Version: webpack 1.1.11
Time: 2ms
Asset Size Chunks Chunk Names
webpack: bundle is now VALID.
webpack: bundle is now INVALID.
DEBUG [web-server]: serving: /home/ed/workspace/wwb-app/node_modules/karma/static/client.html
DEBUG [web-server]: serving: /home/ed/workspace/wwb-app/node_modules/karma/static/karma.js
DEBUG [web-server]: upgrade /socket.io/1/websocket/CjC8pnQq5It2z_kWYB98
DEBUG [karma]: A browser has connected on socket CjC8pnQq5It2z_kWYB98
INFO [PhantomJS 1.9.7 (Linux)]: Connected on socket CjC8pnQq5It2z_kWYB98 with id 98204612
DEBUG [launcher]: PhantomJS (id 98204612) captured in 1.704 secs
WARN [PhantomJS 1.9.7 (Linux)]: Disconnected (1 times), because no message in 30000 ms.
DEBUG [karma]: Run complete, exitting.
DEBUG [launcher]: Disconnecting all browsers
DEBUG [launcher]: Process PhantomJS exited with code 0
DEBUG [temp-dir]: Cleaning temp dir /tmp/karma-98204612
Warning: Task "karma:unit" failed. Use --force to continue.
Aborted due to warnings.
Здесь мой файл karma.conf.js
:
'use strict';
module.exports = function (config) {
config.set({
basePath: '',
frameworks: ['jasmine'],
files: [
'test/helpers/**/*.js',
'test/spec/components/**/*.js'
],
preprocessors: {
'test/spec/components/**/*.js': ['webpack']
},
webpack: {
cache: true,
module: {
loaders: [{
test: /\.css$/,
loader: 'style!css'
}, {
test: /\.gif/,
loader: 'url-loader?limit=10000&minetype=image/gif'
}, {
test: /\.jpg/,
loader: 'url-loader?limit=10000&minetype=image/jpg'
}, {
test: /\.png/,
loader: 'url-loader?limit=10000&minetype=image/png'
}, {
test: /\.js$/,
loader: 'jsx-loader'
}]
}
},
webpackServer: {
stats: {
colors: true
}
},
exclude: [],
port: 8080,
logLevel: config.LOG_DEBUG,
colors: true,
autoWatch: true,
// Start these browsers, currently available:
// - Chrome
// - ChromeCanary
// - Firefox
// - Opera
// - Safari (only Mac)
// - PhantomJS
// - IE (only Windows)
browsers: ['PhantomJS'],
reporters: ['progress'],
captureTimeout: 60000,
browserNoActivityTimeout: 60000,
singleRun: true
});
};
Ответы
Ответ 1
У меня была та же проблема. Из связанного проблемы GitHub я узнал, что вы можете продлить время бездействия.
Задайте этот параметр конфигурации Karma в файле настроек gruntfile или karma:
browserNoActivityTimeout: 100000
Я установил его на 100 секунд, и мои тесты прошли успешно. Я не знаю, что вызывает задержку.
Ответ 2
Я изменил конфигурацию Karma,
captureTimeout: 60000, // it was already there
browserDisconnectTimeout : 10000,
browserDisconnectTolerance : 1,
browserNoActivityTimeout : 60000,//by default 10000
Также у меня есть 200-300 тестов, PhantomJS 1.9.8
и для Phantom требуется только около 100 мб памяти,
С ворчанием и кармой
Все они использовали около 300 мб памяти.
Ответ 3
Мы столкнулись с аналогичной проблемой на наших серверах сборки.
Увеличение браузераNoActivityTimeout сработало до определенной точки. Мы повысили его до 60000 мс, но проблема с отключением phantomJS вернулась с увеличением количества модульных тестов.
В итоге мы отслеживали проблему до ОЗУ, доступного для phantomJS. У нас было 1100 модульных тестов, для выполнения которых потребовалось бы ~ 1m30s, но phantomJS не смог бы отключиться в течение таймаута 60000 мс.
Сборка памяти node VM увеличена с 2 ГБ до 4 ГБ, а затем 1100 единиц тестирования заняла ~ 45 секунд, а phantomJS отключится от ~ 5 секунд. Огромное улучшение.
Есть два урока:
1. PhantomJS голоден в памяти, поэтому убедитесь, что у него достаточно оперативной памяти для выполнения своей задачи
2. Профилируйте свой код, чтобы узнать, где вы можете быть более эффективным с использованием памяти.
Ответ 4
Другим вероятным объяснением является необходимость в том, чтобы RequireJS мешал. Я получаю эту точную ошибку, если добавлю "requirejs" к karma.conf.js в массив config.frameworks.
Кажется, это переопределяет функцию native require и не позволяет выполнить тесты. В моем случае срабатывал блок описания, но ни один из них не был.
Ответ 5
В моем случае я не включил следующий код в файл test.js:
requirejs.config({
callback: window.__karma__.start
});
describe('tests', function() {
...
После включения этой конфигурации тесты начали работать. Надеюсь, это избавит кого-то еще от стресса!
Ответ 6
Извлеките 'require' из файла конфигурации кармы, просто используйте фреймворки: ['jasmine'].
Ответ 7
Убедитесь, что localhost
правильно указывает на 127.0.0.1
, а не недостижимый IP, это может произойти в средах разработчиков, например, с использованием виртуальных машин.
Ответ 8
Я решил это для своей собственной среды. У меня было множество пакетов nodejs, установленных во всем мире. Я не делал регрессии, чтобы выяснить, какой именно пакет вызвал эту проблему, но я сильно подозреваю, что карма, установленная во всем мире, была причиной.
Если у вас есть эта проблема, попробуйте
sudo npm -g remove karma
и если это не сработает, я удалю все глобальные пакеты node (за исключением действительно глобальных пакетов, таких как yeoman, grunt-cli, например). А затем установите локально для своего проекта.
Я также заметил, что когда вы запускаете sudo npm -i
в OS X, он меняет владельца ~/.npm на root, а последующие команды npm -i
терпят неудачу с ошибкой EACCESS.
Ответ 9
Это может быть не так для OP здесь, но если код, который вы тестируете, попадает в бесконечный цикл, это приведет к отключению таймаута точно так же.