как вы уже знаете, многие из нас, у которых есть большое количество написанных unit test, встретились с этой проблемой, которая не является тривиально разрешимой. У меня примерно 3500+ единиц тестов, написанных в синтаксисе Jasmine, следуя руководству AngularJs unit testing. Тесты выполняются с помощью Karma runner.
Проблема заключается в том, что они не могут выполняться одновременно из-за утечек памяти. Во время их запуска память накапливается независимо от того, в каком браузере они запускаются, и в какой-то момент браузер выходит из строя и отключается. Лучшее обходное решение, о котором я сейчас знаю, которое используется в сообществе, имеющем эту проблему, - это сплит тестов в нескольких прогонах и, в конце концов, получает правильный охват, объединяя результаты с одиночными прогонами.
Когда я впервые встретился с этой проблемой, у меня было около 1000 тестов. После попытки использования всех доступных браузеров для работы я разделил тесты на несколько прогонов, однако оказалось, что это не очень хорошо обходится в течение длительного времени. Теперь тесты выполняются в 14+ одиночных запусках, которые запускаются параллельно, чтобы сократить время завершения и все еще IMO, это не может надолго решить проблему, но задержать ее бит litle из-за ограничения ресурсов (ОЗУ, ЦП) и раздражающего потребления времени.
Кто-то может утверждать, что у меня есть утечки памяти в моем коде, для которых я не могу гарантировать, даже если у меня нет никаких проблем при запуске приложения в браузере. Вот почему я создал пример проекта, который выделит эту проблему.
Там для воспроизведения этой проблемы я создаю Angular service, который тяжел в потреблении памяти следующим образом:
app.factory('heavyLoad', function () {
// init
var heavyList = [];
var heavyObject = {};
var heavyString = '';
// populate..
return {
getHeavyList: function () { return heavyList; },
getHeavyObject: function () { return heavyObject; },
getHeavyString: function () { return heavyString; }
};
});
После этого у меня есть простой directive, который использует эту службу для инициализации многих элементов DOM:
app.directive('heavyLoad', function (heavyLoad) {
return {
scope: {},
template: '' +
'<div>' +
' <h1>{{title}}</h1>' +
' <div ng-repeat="item in items">' +
' <div ng-repeat="propData in item">' +
' <p>{{propData}}</p>' +
' </div>' +
' </div>' +
'</div>',
link: function (scope, element) {
scope.items = heavyLoad.getHeavyList();
scope.title = heavyLoad.getHeavyString();
// add data to the element
element.data(heavyLoad.getHeavyList());
}
};
});
И в конце я динамически регистрирую 1000 тестовых наборов с определение теста для директивы, которую btw пишет, как предложено в Angular руководство по тестированию устройств.
// define multiple suits with the same definition just for showcase
for (var i = 0; i < 1000; i += 1) {
describe('heavyLoad directive #' + i, testDefinition);
}
Чтобы попробовать пример, просто проверьте проект с GitHub и перед запуском запуска кармы:
$ npm install
$ bower install
Я с нетерпением жду, где найти проблему и решить ее наконец.
Приветствия