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

Как обойти ошибку памяти с помощью karma & phantomjs

Мы проводим тесты с использованием karma и phantomjs На прошлой неделе наши тесты загадочно начали сбой phantomJS с ошибкой -1073741819.

На основе этого потока для Chutzpah он показывает, что код указывает на сбой собственной памяти с помощью PhantomJS.

При дальнейшем исследовании мы последовательно видим, как phantom падает примерно 750 МБ памяти.

Есть ли способ настроить Karma, чтобы он не работал против этого предела? Или способ сказать, что он сбросил флажок phantom?

Пока у нас всего около 1200 тестов. Мы около 1/4 пути через наш проект, поэтому 5000 UI-тестов не могут быть и речи.

4b9b3361

Ответ 1

Благодаря феномену StackOverflow при размещении вопроса и быстрому обнаружению ответа мы решили это, добавив gulp задачи. Прежде чем мы просто запустили karma start в командной строке. Это создало один экземпляр фантомов, которые разбились, когда достигнуто 750 МБ.

Теперь у нас есть команда gulp для каждого из наших разделов тестов, например. gulp common-tests и gulp admin-tests и gulp customer-tests

Затем один gulp karma, который запускает каждую из этих группировок. Это позволяет каждой команде gulp иметь собственный экземпляр phantom и, следовательно, оставаться под этим порогом.

Ответ 2

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

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

   beforeEach(inject(SomeActualService)){ .... }

память, занятая SomeActualService, не будет выпущена в конце описываемого блока, и если у вас есть несколько тестовых файлов, в которые вы вводите одну и ту же услугу (или другие инъекционные объекты), для нее снова будет выделено больше памяти.

У меня есть пара идей о том, как избежать этого: 1. создавать макет объектов и никогда не использовать инъекции для получения реальных объектов, если вы не находитесь в тесте, который проверяет этот модуль. Это потребует написания большого количества дополнительного кода. 2. Создайте свой собственный трекер (только для тестов) для инъекционных объектов. Таким образом, они могут быть загружены только один раз и повторно использованы между тестовыми файлами.

Забыл упомянуть: мы используем angular 1.3.2, Jasmine 2.0 и попадаем в эту проблему около 1000 тестов.

Ответ 3

Я также столкнулся с этой проблемой после 1037 тестов в Windows 10 с PhantomJS 1.9.18.

Он появится как ERROR [launcher]: PhantomJS crashed. после того, как ОЗУ для процесса превысит примерно 800-850 МБ.

Здесь, как представляется, существует временное исправление:

Вы устанавливаете его через npm install karma-phantomjs2-launcher --save-dev

Но тогда нужно использовать его в karma.conf.js через

config.set({
    browsers: ['PhantomJS2'],
    ...
});

Кажется, что он запускает один и тот же набор тестов, используя только 250-550 МБ оперативной памяти и без сбоев.

Обратите внимание, что это исправление работает из окна Windows и OS X, но не Linux (двоичные файлы PhantomJS2 не запускаются). Это влияет на толкает Travis CI.

Чтобы обойти эту проблему на Debian/Ubuntu:

sudo apt-get install libicu52 libjpeg8 libfontconfig libwebp5

Ответ 4

Это проблема с PhantomJS. Согласно другому источнику, PhantomJS запускает сборщик мусора, когда страница закрыта, и это происходит только после запуска ваших тестов. Другие браузеры работают нормально, потому что их сборщики мусора работают должным образом.

Проведя несколько дней на этом вопросе, мы пришли к выводу, что лучшим решением было разделить тесты на группы. У нас хватало динамический профиль для каждого каталога и создала команду, которая запускает все эти профили. Для всех целей и задач он работает одинаково.

Ответ 5

У нас была аналогичная проблема с linux (ubuntu), которая оказалась количеством сегментов памяти, которыми может управлять процесс:

$ cat /proc/sys/vm/max_map_count
65530

Затем запустите это:

$ sudo bash -c 'echo 6553000 > /proc/sys/vm/max_map_count'

Обратите внимание, что число было умножено на 100. Это изменит настройки сеанса. Если это решает проблему, вы можете настроить ее для всех будущих сеансов:

$ sudo bash -c 'echo vm.max_map_count = 6553000 > /etc/sysctl.d/60-max_map_count.conf'

Ответ 6

Отвечая на старый вопрос, но, надеюсь, это помогает...

У меня есть процесс сборки, в котором задание CI выполняется только в командной строке только linux. Итак, кажется, что PhantomJS - мой единственный вариант. Я столкнулся с этой проблемой памяти локально на своем Mac, но так или иначе это не происходит в окне linux. Мое решение состояло в том, чтобы добавить еще одну тестовую команду в мой пакет .json для запуска кармы с помощью Chrome и запустить ее локально для запуска моих тестов. Когда он подтолкнут, Дженкинс начнет обычную тестовую команду, запустив PhantomJS.

Установите этот плагин: https://github.com/karma-runner/karma-chrome-launcher

Добавьте это к package.json

"test": "karma start", "test:chrome": "karma start --browsers Chrome"