如何在量角器中对测试文件进行分片?
Protractor是为 Angular 和 AngularJS 应用程序开发的端到端测试框架。它像真实用户一样对与之交互的应用程序运行测试,在真实浏览器中运行。在本文中,我们将讨论如何在量角器中对测试套件进行分片。
先决条件:Protractor的安装和设置
测试套件的分片意味着并行运行测试套件。假设有两个测试套件,因此这两个测试套件的并行分片意味着将创建两个 chrome 实例,并且两个测试套件将分别在两个不同的 chrome 实例上运行(即,它们将独立运行其他)而如果两个测试套件将串联运行,则只会创建一个 chrome 实例,然后第二个测试套件必须等待第一个测试套件完成才能运行(即它们不能独立运行) .现在,由于分片有助于测试套件并行运行,它将减少执行时间并提高测试效率。
下面是上述解释的流程图表示:
并行运行测试
连续运行测试
方法:
- 我们将创建一个基本的测试程序,我们将在其中看到我们如何对测试套件进行分片
- 所有Protractor测试都会有一个包含配置的文件,这将是启动测试的初始文件。
- 让我们创建这个名为 conf.js 的文件。
- 对于分片,在 conf.js 文件的功能块中声明两个功能。
- shardTestFiles – 允许不同的规范并行运行。如果设置为 true,则规范将按文件分片(即由这组功能运行的所有文件将并行运行)。默认为假。
- maxInstances – 对于这组功能,可以并行运行的浏览器实例的最大数量。仅当 shardTestFiles 为 true 时才需要这样做。默认值为 1。
第 1 步:我们必须首先创建一个 conf.js 文件,其中包含要与Protractor一起使用的配置。
conf.js
// An example configuration file to
// illustrate sharding
exports.config = {
directConnect: true,
// Capabilities to be passed to the
// webdriver instance for sharding
capabilities: {
'browserName': 'chrome',
// Sharding
'shardTestFiles': true,
'maxInstances': 2,
},
// Framework to use. Jasmine is
// recommended
framework: 'jasmine',
// Spec patterns are relative to the
// current working directory when
// protractor is called.
specs: ['test1.js','test2.js'],
SELENIUM_PROMISE_MANAGER: false,
// Options to be passed to Jasmine.
jasmineNodeOpts: {
defaultTimeoutInterval: 30000
}
};
index1.html
fade-in effect on page load using JavaScript
Inner text
index2.html
test1.js
describe('Protractor Demo App', function () {
it('should have a title', async function () {
// Disable waiting for Angular render update
await browser.waitForAngularEnabled(false)
// Get the HTML file that has to be tested
await browser.get('index1.html');
// Get the fade in element
let fadeIn = element(by.id('fade-in'));
// Wait for the fade in process to complete
await browser.driver.wait(async function() {
return await fadeIn.getCssValue('opacity') === '1';
}, 30000, "Taking too long to fade in");
});
});
test2.js
describe('Protractor Demo App', function () {
it('should have a title', async function () {
// Disable waiting for Angular render update
await browser.waitForAngularEnabled(false)
// Get the HTML file that has to be tested
await browser.get('index2.html');
// Test if the element is hidden
let hiddenDiv = element(by.id('hidden-div'));
// This test will pass only when
// element is hidden
expect(hiddenDiv.isDisplayed()).toBe(false);
});
});
第 2 步:我们将创建名为index1.html和index2.html 的两个 HTML 文件。
index1.html
fade-in effect on page load using JavaScript
Inner text
index2.html
第 3 步:我们将创建 test1.js 文件。在这个文件中,我们将访问 index1.html 文件,然后等待元素完全淡入。浏览器是由Protractor创建的全局,用于浏览器级别的命令,例如使用 browser.get 导航() 方法。 describe 和 it 语法来自 Jasmine 框架,其中 describe 是对测试的描述,同时定义了测试的步骤。
test1.js
describe('Protractor Demo App', function () {
it('should have a title', async function () {
// Disable waiting for Angular render update
await browser.waitForAngularEnabled(false)
// Get the HTML file that has to be tested
await browser.get('index1.html');
// Get the fade in element
let fadeIn = element(by.id('fade-in'));
// Wait for the fade in process to complete
await browser.driver.wait(async function() {
return await fadeIn.getCssValue('opacity') === '1';
}, 30000, "Taking too long to fade in");
});
});
同样,我们将创建 test2.js 文件。在这个文件中,我们将访问 index2.html 文件,然后检查该元素是否隐藏。 browser 是Protractor创建的全局变量,用于浏览器级别的命令,例如使用 browser.get() 方法进行导航。 describe 及其语法来自 Jasmine 框架,其中 describe 是对您的测试的描述,同时它定义了测试的步骤。
test2.js
describe('Protractor Demo App', function () {
it('should have a title', async function () {
// Disable waiting for Angular render update
await browser.waitForAngularEnabled(false)
// Get the HTML file that has to be tested
await browser.get('index2.html');
// Test if the element is hidden
let hiddenDiv = element(by.id('hidden-div'));
// This test will pass only when
// element is hidden
expect(hiddenDiv.isDisplayed()).toBe(false);
});
});
第 4 步:最后,我们将使用下面给出的命令运行配置文件。这将运行配置文件并运行测试,如下面的输出所示。
protractor conf.js
输出: