有没有办法加速AngularJS量角器测试?

Sam*_*tar 20 angularjs protractor

我已经为我的应用程序创建了测试.一切正常,但运行缓慢,即使只有1/3的应用程序经过测试,仍然需要大约十分钟才能让protrator创建测试数据,填写字段,点击提交按钮等.

我正在使用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']
},
Run Code Online (Sandbox Code Playgroud)

这是一个测试组:

    login: ['Login/test.js'],            
    homePage: ['Home/test.js'],          
    adminUser: ['Admin/User/test.js'],
    adminRole: ['Admin/Role/test.js']
Run Code Online (Sandbox Code Playgroud)

这是另一个测试组:

    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'],
Run Code Online (Sandbox Code Playgroud)

这两个组可以独立运行,但它们必须按照我上面的顺序运行.在答案之后,我确实阅读了关于共享但我不确定这是否有助于我的情况,因为我的测试需要按顺序运行.理想情况下,我希望在一个浏览器中运行一组测试,而在另一个浏览器中设置另一组测试.

我读到了像PhantomJS这样的无头浏览器.有没有人有这些更快的经验?关于如何做到这一点的任何建议将不胜感激.

mad*_*adz 12

我们目前使用"shardTestFiles:true"并行运行我们的测试,如果您有多个测试,这可能会有所帮助.

我不确定你在这里测试什么,无论是数据创建还是最终结果.如果是后者,您可能需要考虑模拟数据创建,或者以其他方式绕过UI.

  • 嗨Samantha,shardTestFiles依赖于您的测试能够以任何顺序运行.在你的情况下,id考虑完全有两个不同的repos,因此你可以配置两个不同的runner在你的CI中相继运行.或者你可以找到一种以编程方式将它们绑在一起的方法. (3认同)

Jam*_*rew 7

注入数据

你可以做的一件事就是给你一个重要的性能提升就是不要加倍测试.我的意思是你最终会多次填充虚拟数据以达到一个步骤.它也是人们需要测试以某种顺序运行(加速数据输入)的主要原因之一.

例如,如果要在网格(数据表)上测试过滤.填写数据不是此操作的一部分.它只是一个烦人的事情,你必须做到测试过滤.通过调用服务来添加数据,您可以绕过UI和selenium一般的缓慢(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);
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

这里的代码不是最干净的,但你得到了它的一般要点.另一种方法是使用[Protractor#addMockModule] [1]用double或mock替换模块.在调用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);
Run Code Online (Sandbox Code Playgroud)

这些方法中的任何一种都可以为您的测试带来显着的加速.

分片测试

对测试进行分片意味着拆分套件并将它们并行运行.在量角器中这样做非常简单.将shardTestFiles和maxInstences添加到您的功能配置应允许您(在这种情况下)以并行方式运行最多两次测试.增加maxInstences以增加运行的测试次数.注意:注意不要将数字设置得太高.浏览器可能需要多个线程,并且在打开新窗口时也存在初始化成本.

capabilities: {
    browserName: 'chrome',
    shardTestFiles: true,
    maxInstances: 2
},
Run Code Online (Sandbox Code Playgroud)

设置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's browser driver.
   * See https://github.com/detro/ghostdriver#faq
   */
  'phantomjs.ghostdriver.cli.args': ['--loglevel=DEBUG']
}
Run Code Online (Sandbox Code Playgroud)