юнит-тесты карма-бегун / профилирование жасмина

Для модульных тестов мы используем grunt / karma-runner / jasmine / phantom.js. Поскольку мы стараемся охватить любую новую функциональность, количество модульных тестов быстро растет. И, к сожалению, время на тесты тоже увеличивается. Сейчас это не критично и на 1000 тестов уходит секунд 10, но все хуже и хуже.

И вопросы:

  1. Я знаю, что некоторые тесты плохо написаны (отнимают много времени), но какой из них мне следует оптимизировать? Существует ли какой-нибудь профилировщик кармы / жасмина, который измеряет время выполнения каждого теста?

  2. Могу ли я запустить больше потоков / процессов, выполняющих карму, поскольку ЦП используется только на 5-10%? Юнит-тесты действительно независимые.

  3. Каждый раз, когда я сохраняю файл, karma: watch запускает все тесты, возможно, существует какая-то опция для karma-runner, которая перезапускает тесты только для текущей папки (мы используем правило: unit tests file.spec) .js хранится в той же папке, что и исходный файл .js)?

Спасибо,

update1: кто-то предлагает мне использовать iit / ddescribe для жасмина (то же самое, что и .only для мокко), и это здорово вариант для разработки / отладки, а может быть есть другой способ?

Я размещаю вопрос на форуме пользователей кармы здесь.


person IL55    schedule 19.12.2013    source источник
comment
Попробуйте переключиться на Chrome вместо Phantom. После переключения мы получили значительно лучшие результаты (конечно, ваш пробег может отличаться).   -  person Elad    schedule 23.12.2013


Ответы (3)


Поиск медленных тестов

  • reportSlowerThan (точки или индикатор выполнения сообщит обо всех тестах, которые медленнее указанного числа в мс),

  • вы можете перейти в браузер и профилировать свои тесты так же, как и в приложении (например, флейм-чарты в Chrome потрясающие).

Ускорение тестов

  • распараллеливание:

    Мы над этим работаем. Вы сможете распараллеливать тесты в нескольких браузерах. Конечно, эти браузеры не обязательно должны работать на одном компьютере, поэтому вы также сможете использовать несколько компьютеров.

    Я не думаю, что запуск нескольких экземпляров самой Karma может так сильно помочь, поскольку он написан очень «неблокирующим» способом, и я не видел в этом узкого места. Однако мы должны оптимизировать использование ЦП / памяти. В v0.12 ожидается множество улучшений в этой области.

  • выполняется только часть тестов:

    Вы должны полностью использовать _2 _ / _ 3_ (Жасмин). По какой-либо причине, почему это не работает для вас? Кстати. В реализации Mocha it.only() и describe.only() есть проблемы, поэтому я рекомендую Jasmine (или исправление Mocha).

    Существует также прототип плагина Google Closure, который загружает только те файлы, которые вам действительно нужны (например, вы iit один тест, он будет загружать / анализировать / оценивать только те файлы, которые вам действительно нужны для этого iit). Это значительно сокращает время запуска больших проектов - мы должны проделать аналогичные трюки для других загрузчиков модулей (RequireJS, CommonJS).

  • напишите более быстрый код:

    Вы, наверное, уже это знаете ... ;-)

    DOM работает медленно. Хорошее разделение логики / DOM позволит вам тестировать больше вещей, фактически не касаясь DOM. Если вы используете Angular, вы можете проверить пример директив тестирования.

    Использование шаблона внедрения зависимостей очень помогает, поскольку вы в основном минимизируете среду, необходимую для подготовки (а также разрушения) для каждого теста. Вот пример.

    В общем, более низкие нижние тесты быстрее. Я думаю, что было бы хорошо покрыть каждую функциональность / проблему минимально возможным тестом.

  • устранение утечек памяти:

    Если в ваших тестах происходит утечка памяти, браузер будет работать все медленнее и медленнее, поэтому тест номер 1000 будет довольно медленным, даже если он хорошо написан. Убедитесь, что каждый тест освобождает все ссылки. Вы можете использовать http://localhost:9876/debug.html и профилировать память. Проверяйте память перед выполнением (после того, как Жасмин выполнила все блоки describe() и собрала тесты), а затем после выполнения тестов - она ​​должна быть такой же.

    Найти одни утечки памяти сложнее, чем другие, но это может значительно улучшить скорость - я видел такие вещи, как от ~ 5 минут до менее минуты, просто устраняя утечки памяти.

person Vojta    schedule 22.12.2013
comment
Не могли бы вы подробнее рассказать о том, как проверить память перед выполнением (после того, как Жасмин выполнил все блоки description () и собрал тесты), а затем после выполнения тестов? - person CorrugatedAir; 09.01.2015
comment
npmjs.com/package/grunt-contrib-jasmine-phantom Это плагин решает проблему и охватывает то, что вы упомянули в своем ответе. - person Reddy; 23.02.2015

1a) О профилировании: вы можете использовать репортеры кармы, добавьте в свой karma-config эти строки:

    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 из конфигурации кармы

     reportSlowerThan: 100,

Карма сообщит вам о тестах медленнее 100 мс.

2) Я не знаю, как запустить больше процессов / потоков кармы.

3) поскольку grunt: watch предоставляет вам измененное filename.js, вы можете запустить соответствующий filename.spec.js, поэтому вам нужно написать специальную задачу grunt

и используйте ddescribe и iit, чтобы запустить только указанное description / it.

person IL55    schedule 20.12.2013

Если вы ищете способ узнать, какие спецификации медленные, я написал сообщение в блоге (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);
person jipiboily    schedule 14.01.2016