Блок-тесты карма-бегун/профилирование жасмина
Для модульных тестов мы используем grunt/karma-runner/jasmine/phantom.js. Поскольку мы пытаемся осветить любую новую функциональность, ряд модульных тестов быстро растет. И, к сожалению, время для тестов также увеличивается.
Теперь это не критично и занимает 10 секунд для 1000 тестов, но все хуже и хуже.
И вопросы:
-
Я знаю, что некоторые тесты плохо написаны (много времени), но какой я должен оптимизировать? Существует ли некоторый профилировщик кармы/жасмина, который измеряет выполнение времени для каждого теста?
-
Могу ли я начать больше потоков/процессов с карма-бегом, потому что CPU используется только для 5% -10%? Модульные тесты действительно независимы.
-
Каждый раз, когда я сохраняю файл, карма: часы запускают все тесты, может существовать некоторый параметр для карма-бегуна, который повторно запускает только тесты для текущей папки (мы используем правило: unit tests file.spec.js хранится в той же папке, что и исходный файл .js)?
Спасибо,
update1: Кто-то предлагает мне использовать iit/ddescribe for jasmine (то же самое, что и для мокко), и это отличный вариант для разработки/отладки, но может быть существуют другие способы?
Я размещаю вопрос на форуме карма-пользователя здесь.
Ответы
Ответ 1
Поиск медленных тестов
-
reportSlowerThan
(точки или репортёр прогресса сообщают обо всех тестах, которые медленнее заданного числа в мс),
-
вы можете перейти в браузер и профилировать свои тесты таким же образом, как и с помощью приложения (например, плагины) в Chrome - это замечательно).
Быстрое выполнение тестов
-
параллелизм:
Мы работаем над этим. Вы сможете распараллелить тесты в нескольких браузерах. Конечно, эти браузеры не должны запускаться на одном компьютере, поэтому вы также сможете использовать несколько машин.
Я не думаю, что запуск нескольких экземпляров самой Кармы очень помог бы, поскольку это написано очень "неблокирующимся" способом, и я не видел, чтобы это было узким местом. Однако мы должны оптимизировать использование CPU/памяти. В этой области много улучшений в этой области.
-
работает только подмножество тестов:
Вы должны полностью использовать iit
/ddescribe
(Жасмин). Любая причина, почему это не работает для вас? Btw. Реализация Mocha it.only()
и describe.only()
имеет проблемы, поэтому я рекомендую Jasmine (или исправление Mocha).
Существует также прототип плагина Google Closure , который загружает только файлы, которые вам действительно нужны (скажем, вы iit
один тест, он будет загрузите/проанализируйте/оцените файлы, которые вам действительно нужны для iit
). Это значительно улучшает время запуска на огромных проектах - мы должны делать подобные трюки для других загрузчиков модулей (RequireJS, CommonJS).
-
записать более быстрый код:
Вы, наверное, знаете это уже...; -)
DOM медленный. Хорошее разделение логики /DOM позволит вам тестировать больше материала, не касаясь DOM. Если вы используете Angular, вы можете проверить пример директив тестирования.
Использование шаблона Injection Dependency помогает в значительной степени минимизировать окружающую среду, необходимую для подготовки (а также срыва) для каждого теста. Здесь пример.
В целом, более низкие тесты ниже. Я считаю, что хорошо использовать каждую функциональность/проблему с минимально возможным тестированием.
-
устранить утечки памяти:
Если ваши тесты утечки памяти, браузер будет медленнее и медленнее, поэтому тестовый номер 1000 будет довольно медленным, хотя он хорошо написан. Убедитесь, что каждый тест освобождает все ссылки. Вы можете использовать http://localhost:9876/debug.html
и профилировать память. Проверьте память перед выполнением (после того, как Жасмин выполнил все блоки describe()
и собрал тесты), а затем после выполнения тестов - он должен быть тем же.
Поиск утечек памяти сложнее других, но он может значительно улучшить скорость - я видел такие вещи, как от ~ 5 минут до минуты, просто устраняя утечки памяти.
Ответ 2
1a) О профилировании: вы можете использовать репортеры кармы, добавить в свою конфигурацию karma следующие строки:
reporters: [
'progress',
'junit',
],
junitReporter: {
outputFile: basePath + 'test_out/unit.xml',
suite: 'unit'
},
он создаст хороший xml, например:
<testcase name="BuilderController should have a tileSelectorId" time="0.015" classname="unit Chrome 31.0.1650 (Windows 7).tileBuilder testing"/>
<testcase name="BuilderController by default should sort by title" time="0" classname="unit Chrome 31.0.1650 (Windows 7).tileBuilder testing"/>
И вы можете сортировать и выбирать, какой медленный тест следует оптимизировать
1b) Также вы можете использовать reportSlowerThan из karma config
reportSlowerThan: 100,
Карма сообщит вам о тестах медленнее 100 мс
2) Я не знаю, как начать больше процессов/потоков, связанных с кармой.
3), потому что grunt: watch предоставит вам имя файла filename.js, вы можете запустить соответствующий файл filename.spec.js, поэтому вам нужно написать специальную задачу grunt
и используйте ddescribe и iit для запуска только указанного описания/it.
Ответ 3
Если вы ищете способ узнать, какие спецификации медленны, я написал сообщение в блоге (http://jipiboily.com/how-to-know-jasmine-specs-are-slow/), но короткая версия использует этот репортер, который я сделал:
// This works under Jasmine 2.3
var slowSpecsReporter = {
specStarted: function(result) {
this.specStartTime = Date.now()
},
specDone: function(result) {
var seconds = (Date.now() - this.specStartTime) / 1000
if (seconds > 0.5) {
console.log('WARNING - This spec took ' + seconds + ' seconds: "' + result.fullName + '"')
}
},
}
jasmine.getEnv().addReporter(slowSpecsReporter);