Подтвердить что ты не робот

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

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

И вопросы:

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

  • Могу ли я начать больше потоков/процессов с карма-бегом, потому что CPU используется только для 5% -10%? Модульные тесты действительно независимы.

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

Спасибо,

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

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

4b9b3361

Ответ 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);