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

Есть ли способ ускорить испытания утяжелителя AngularJS?

Я создал тесты для своего приложения. Все работает, но работает медленно, и хотя тестируется только 1/3 приложения, для создания тестовых данных разработчику требуется около десяти минут, чтобы заполнить поля, нажать кнопку отправки и т.д.

Я использую Google Crome для тестирования. Кажется медленным, поскольку я смотрю, как транспортир заполняет поля один за другим.

Вот пример моего тестового набора:

suites: {
    login: ['Login/test.js'],            
    homePage: ['Home/test.js'],          
    adminPage: ['Admin/Home/test.js'],
    adminObjective: ['Admin/Objective/test.js'],
    adminObjDetail: ['Admin/ObjectiveDetail/test.js'],
    adminTopic: ['Admin/Topic/test.js'],
    adminTest: ['Admin/Test/test.js'],
    adminUser: ['Admin/User/test.js'],
    adminRole: ['Admin/Role/test.js']
},

Это одна тестовая группа:

    login: ['Login/test.js'],            
    homePage: ['Home/test.js'],          
    adminUser: ['Admin/User/test.js'],
    adminRole: ['Admin/Role/test.js']

Это еще одна тестовая группа:

    adminPage: ['Admin/Home/test.js'],
    adminObjective: ['Admin/Objective/test.js'],
    adminObjDetail: ['Admin/ObjectiveDetail/test.js'],
    adminTopic: ['Admin/Topic/test.js'],
    adminTest: ['Admin/Test/test.js'],

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

Я читал о безгласных браузерах, таких как PhantomJS. У кого-нибудь есть опыт с этим быстрее? Любые советы о том, как я мог бы это сделать, были бы очень благодарны.

4b9b3361

Ответ 1

В настоящее время мы используем "shardTestFiles: true" , который запускает наши тесты параллельно, это может помочь, если у вас есть несколько тестов.

Я не уверен, что вы здесь тестируете, будь то создание данных или конечный результат. Если последнее, вы можете захотеть рассмотреть насмехание создания данных или обходить пользовательский интерфейс каким-либо другим способом.

Ответ 2

Ввод данных в данные

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

Примером этого является тестирование тестовой фильтрации на сетке (таблица данных). Заполнение данных не является частью этого действия. Его просто раздражает, что вам нужно сделать, чтобы проверить фильтрацию. Вызывая службу для добавления данных, вы можете обойти общую медлительность пользовательского интерфейса и селена (Id также рекомендует это на стороне сервера, вводя значения непосредственно в БД с помощью миграции).

Хороший способ сделать это - добавить помощника в свой объект страницы следующим образом:

module.exports = {
    projects: {
        create: function(data) {
            return browser.executeAsyncScript(function(data, callback) {
                var api = angular.injector(['ProtractorProjectsApp']).get('apiService');
                api.project.save(data, function(newItem) {
                    callback(newItem._id);
                })
            }, data);
        }
    }
};

Код в этом не самый чистый, но вы получаете общий смысл. Другой альтернативой является замена модуля на двойной или макет с использованием [Protractor # addMockModule] [1]. Вы должны добавить этот код, прежде чем вы обратитесь к Protractor # get(). Он будет загружаться после переопределения ваших приложений, если он имеет то же имя, что и существующая служба.

Вы можете использовать его следующим образом:

var dataUtilMockModule = function () {
     // Create a new module which depends on your data creation utilities
    var utilModule = angular.module('dataUtil', ['platform']);
    // Create a new service in the module that creates a new entity
    utilModule.service('EntityCreation', ['EntityDataService', '$q', function (EntityDataService, $q) {

        /**
         * Returns a promise which is resolved/rejected according to entity creation success
         * @returns {*}
         */
        this.createEntity = function (details,type) {
            // This is your business logic for creating entities
            var entity = EntityDataService.Entity(details).ofType(type);
            var promise = entity.save();
            return promise;
        };
    }]);
};

browser.addMockModule('dataUtil', dataUtilMockModule);

Любой из этих методов должен дать вам значительное ускорение при тестировании.

Испытания на осколки

Завершение тестов означает разделение наборов и параллельное выполнение их. Сделать это довольно просто в транспортире. Добавление shardTestFiles и maxInstences в конфигурацию ваших возможностей должно позволить вам (в этом случае) выполнить не более двух тестов в parrallel. Увеличьте maxInstences, чтобы увеличить количество прогонов. Примечание: будьте осторожны, чтобы не установить слишком высокое значение. Браузеру может потребоваться несколько потоков, а также при инициализации при открытии новых окон.

capabilities: {
    browserName: 'chrome',
    shardTestFiles: true,
    maxInstances: 2
},

Настройка PhantomJS (из документов транспортира)

Примечание. Мы рекомендуем использовать PhantomJS для испытаний с помощью Protractor. Есть много сообщений о проблемах с сбоем PhantomJS и ведением себя по-другому от реальных браузеров.

Чтобы протестировать локально с помощью PhantomJS, вам нужно либо установить его глобально, либо относительно вашего проекта. Для глобальной установки см. Страницу загрузки PhantomJS (http://phantomjs.org/download.html). Для локального запуска: npm install phantomjs.

Добавьте phantomjs к возможностям драйвера и включите путь к двоичному файлу, если используете локальную установку:

capabilities: {
  'browserName': 'phantomjs',

  /* 
   * Can be used to specify the phantomjs binary path.
   * This can generally be ommitted if you installed phantomjs globally.
   */
  'phantomjs.binary.path': require('phantomjs').path,

  /*
   * Command line args to pass to ghostdriver, phantomjs browser driver.
   * See https://github.com/detro/ghostdriver#faq
   */
  'phantomjs.ghostdriver.cli.args': ['--loglevel=DEBUG']
}

Ответ 3

Еще один отзыв о скорости, который я нашел, заключается в том, что для каждого теста я регистрировался и выходил из системы после завершения теста. Теперь я проверю, если я уже вошел в систему со следующим в моем вспомогательном методе;

  # Login to the system and make sure we are logged in.
  login: ->
    browser.get("/login")
    element(By.id("username")).isPresent().then((logged_in) ->
      if logged_in == false
        element(By.id("staff_username")).sendKeys("admin")
        element(By.id("staff_password")).sendKeys("password")
        element(By.id("login")).click()
    )

Ответ 4

Я использую grunt-protractor-runner v0.2.4, который использует транспортир " >= 0.14.0-0 < 1.0.0". Эта версия в 2 или 3 раза быстрее последней ([email protected] в зависимости от [email protected]^1.0.0)

Поэтому я предлагаю вам попробовать и проверить предыдущую версию транспортира

Надеюсь, что это поможет

Ответ 5

Наряду с замечательными подсказками, приведенными выше, я бы рекомендовал отключить Angular/CSS Animations, чтобы ускорить все, когда они запускаются в браузерах без браузера. Я лично использую следующий код в своем тестовом пакете в функции "onPrepare" в файле "conf.js":

onPrepare: function() {
    var disableNgAnimate = function() {
        angular
            .module('disableNgAnimate', [])
            .run(['$animate', function($animate) {
                $animate.enabled(false);
            }]);
    };

    var disableCssAnimate = function() {
        angular
            .module('disableCssAnimate', [])
            .run(function() {
                var style = document.createElement('style');
                style.type = 'text/css';
                style.innerHTML = '* {' +
                    '-webkit-transition: none !important;' +
                    '-moz-transition: none !important' +
                    '-o-transition: none !important' +
                    '-ms-transition: none !important' +
                    'transition: none !important' +
                    '}';
                document.getElementsByTagName('head')[0].appendChild(style);
            });
    };

    browser.addMockModule('disableNgAnimate', disableNgAnimate);
    browser.addMockModule('disableCssAnimate', disableCssAnimate);
}

Обратите внимание: я не писал выше код, я нашел его онлайн, ища способы ускорить мои собственные тесты.

Ответ 6

Из того, что я знаю:

  • параллельный тест
  • ввод данных, если вы только тестируете элемент пользовательского интерфейса
  • используйте селектор CSS, нет xpath (у браузеров есть собственный движок для CSS, а механизм xpath не работает как механизм CSS)
  • запустить их на высокопроизводительных машинах
  • используйте как можно больше методов beforeAll() и beforeEach() для инструкций, которые вы часто повторяете в нескольких тестах

Ответ 7

Использование Phantomjs значительно сократит время, затрачиваемое на браузер, основанный на графическом интерфейсе, но лучшее решение, которое я нашел, - это управлять тестами таким образом, чтобы их можно было запускать в любом порядке независимо от других тестов. Его можно легко достичь за счет использования ORM (jugglingdb, sequelize и многие другие) и TDB-фреймворки, и чтобы сделать их более управляемыми, можно использовать структуру жасмина или огурца, которая имеет до и после подключения для отдельных тестов. Итак, теперь мы можем приспособиться к максимальным числам, которые наша машина может переносить с помощью "shardTestFiles: true".