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.
你可以做的一件事就是给你一个重要的性能提升就是不要加倍测试.我的意思是你最终会多次填充虚拟数据以达到一个步骤.它也是人们需要测试以某种顺序运行(加速数据输入)的主要原因之一.
例如,如果要在网格(数据表)上测试过滤.填写数据不是此操作的一部分.它只是一个烦人的事情,你必须做到测试过滤.通过调用服务来添加数据,您可以绕过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进行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)
| 归档时间: |
|
| 查看次数: |
11537 次 |
| 最近记录: |