【问题标题】:Protractor - Test Suites - Not running in sequence量角器 - 测试套件 - 未按顺序运行
【发布时间】:2019-07-19 01:51:57
【问题描述】:

我正在使用 Protractor + Jasmine。

我有一个奇怪的问题。 我有 2 个测试套件(或 Spec.js)。我想一个接一个地运行它们(严格)。但是,量角器正在启动与 Spec1 相关的 BeforeAll()。并快速跳转到与 Spec2 相关的 BeforeAll()。

在 Spec1 中,有一个登录功能,有时登录需要 40 秒。是这个原因吗?

并且,从 Spec1 登录后,Protractor 跳转到 Spec2 并开始执行“BeforeAll”。稍后回到 Spec1 相关的“描述”。

请耐心等待这些大文件,因为它们对于调试至关重要。

如果我分别运行这两个规范,即不按顺序运行,一切都很好。

Spec1.js

beforeAll(function () { 
    originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
    jasmine.DEFAULT_TIMEOUT_INTERVAL = globalconstants.wait10Mints;
    browser.waitForAngularEnabled(false);
    browser.get(env.appUrl);
    browser.getTitle().then(function (title) {
        expect(title, "Browser title is not the expected. But " + browser.getTitle()).toBe("Valueone");
    });
    browser.waitForAngularEnabled(true);
    loginPage.login();

    commonPage.navigateToUsers();
    usersPage.deleteUsers(name); 
});

describe('Create Users', function () {
it("Create user", function () {
something 
});

it("Create user", function () {
something 
});
});

Spec2.js

beforeAll(function () { 
    originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
    jasmine.DEFAULT_TIMEOUT_INTERVAL = globalconstants.wait10Mints;
    browser.waitForAngularEnabled(false);
    browser.get(env.appUrl);
    browser.getTitle().then(function (title) {
        expect(title, "Browser title is not the expected. But " + browser.getTitle()).toBe("Valueone");
    });
    browser.waitForAngularEnabled(true);
    loginPage.login();

    commonPage.navigateToAccounts();
    accountsPage.deleteAccounts(number); 
});

describe('Create Accounts', function () {
it("Create Savings", function () {
something 
});

it("Create current account", function () {
something 
});

});

Conf.js

var env = require('./Utils/env.js');
var HTMLReport = require('protractor-html-reporter-2');
var JasmineReporters = require('jasmine-reporters');

exports.config =
    {

        baseUrl: 'http://localhost:9999',
        directConnect: true,
        framework: 'jasmine2',

        suites: {
            1sp: './mysuites/1Spec.js',
            2sp: './mySuites/2Spec.js',
        },

        capabilities: {
            'browserName': env.browserName,
            'platform': env.osName,

            //Closes any existing browsers
              'shardTestFiles': false,
              'maxInstances': 1
        },

        params: {
            tempVar: false
        },

        onPrepare: async () => {
            global.result = false;

            var fs = require('fs-extra');
            fs.emptyDir('./Reports/Screenshots/', function (err) {
                console.log(err);
            });
            jasmine.getEnv().addReporter({
                specDone: function (result) {
                    if (result.status == 'failed') {
                        browser.getCapabilities().then(function (caps) {
                            browser.takeScreenshot().then(function (png) {
                                var stream = fs.createWriteStream('./Reports/Screenshots/' + env.browserName + '-' + result.fullName + '.png');
                                stream.write(new Buffer(png, 'base64'));
                                stream.end();
                            });
                        });
                    }
                }
            });

            var width = 1600;
            var height = 1200;
            browser.driver.manage().window().setSize(width, height);

            //Html reporter
            jasmine.getEnv().addReporter(new JasmineReporters.JUnitXmlReporter({
                consolidateAll: true,
                savePath: './Reports',
                filePrefix: 'xmlresults'
            }));
        },

        onComplete: async () => {

            var capsPromise = browser.getCapabilities();
            capsPromise.then(function (caps) {
                testConfig = {
                    reportTitle: 'UI Test Execution Report',
                    outputPath: './Reports',
                    outputFilename: 'UI Test Results',
                    screenshotPath: './screenshots',
                    testBrowser: 'FireFox',
                    modifiedSuiteName: false,
                    screenshotsOnlyOnFailure: true,
                    testPlatform: env.osName
                };
                new HTMLReport().from('./Reports/xmlresults.xml', testConfig);
            });
        }
    };

【问题讨论】:

  • 你也可以发布你的conf的功能部分吗?
  • 您的完整 conf.js 文件将非常有帮助。这很可能是问题所在
  • 附上配置 - 提前感谢您花时间帮助我 - 这些文件很长,但是它们可以帮助我们调试问题。
  • 你用什么命令来执行你的代码?
  • 由于我们尚未从 VSCode IDE 集成到 Jenkins,我正在运行 - 这可能是原因吗?如果其他一切看起来都很好,那么问题出在 vscode 本身。量角器正在“并行”运行。刚开始 Spec1 BeforeAll,跳转到第二个规范 - 执行 BeforeAll 方法。

标签: jasmine protractor


【解决方案1】:

经过一番调查,我能够重新创建您的问题,它似乎与 Jasmine 如何处理 beforeAll 挂钩有关。有一个完整的讨论可用 herehere 但基本上(并且令人惊讶的是)似乎您的测试文件中未在描述中声明的任何内容都将在执行 ANY 测试之前执行,包括 beforeAll 钩子。这让我感到惊讶,因为我几乎可以肯定我之前使用过之前所有的外部描述都没有问题,但现在无法验证。

但是,如果您在 describe 中声明 beforeAll 钩子,它将被提升并在您的测试之前仍然执行,与您当前期望它现在的行为完全相同。

您可以尝试在您的描述中移动您的 beforeAll 块,如下所示:

Spec1.js

describe('Create Accounts', function () {
   beforeAll(function () { 
       originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
       jasmine.DEFAULT_TIMEOUT_INTERVAL = globalconstants.wait10Mints;
       browser.waitForAngularEnabled(false);
       browser.get(env.appUrl);
       browser.getTitle().then(function (title) {
           expect(title, "Browser title is not the expected. But " + browser.getTitle()).toBe("Valueone");
       });
       browser.waitForAngularEnabled(true);
       loginPage.login();

       commonPage.navigateToAccounts();
       accountsPage.deleteAccounts(number); 
   });

   it("Create Savings", function () {
       something 
   });

   it("Create current account", function () {
      something 
   });

});

Spec2.js

describe('Create Users', function () {
    beforeAll(function () {
        originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
        jasmine.DEFAULT_TIMEOUT_INTERVAL = globalconstants.wait10Mints;
        browser.waitForAngularEnabled(false);
        browser.get(env.appUrl);
        browser.getTitle().then(function (title) {
            expect(title, "Browser title is not the expected. But " + browser.getTitle()).toBe("Valueone");
        });
        browser.waitForAngularEnabled(true);
        loginPage.login();

        commonPage.navigateToUsers();
        usersPage.deleteUsers(name);
    });

    it("Create user", function () {
        something
    });

    it("Create user", function () {
        something
    });
})

【讨论】:

  • 非常感谢(再次 - 像往常一样)DublinDev,感谢您花时间帮助我!它现在运行良好(正如我所期望的那样)。这几乎花了我 5-6 个小时才弄清楚出了什么问题 - 我仍然无法理解。非常感谢!我是在做我的项目,还是你在代表我做!哈哈
  • 哈哈没问题的人!我实际上是在尝试通过阅读此处的问题并尝试在有时间的时候重新创建/解决它们来提高我自己对量角器的了解,所以这只是一个巧合,我们一直在相互碰撞:) 这个问题对我来说也很有趣非常违反直觉,所以很高兴帮助/学习!
  • @user3055964 我又在考虑这个问题,觉得这应该仍然是公认的答案,因为它确实解决了您的问题,并解释了为什么它会对未来的用户有所帮助。如果您不同意,我可以对其进行编辑以稍微清理一下
  • 这确实是一个答案,它解决了我的问题,不知道发生了什么,但我之前将其标记为答案。
【解决方案2】:

只需在您的config 中添加以下内容即可。

specs: ['src/**/*spec.js'], // This should be the relative path to you spec.js

现在测试将根据您路径中的文件顺序运行。

运行测试:protractor config.js

您的配置中的Suites 用于根据功能或其他内容对测试进行分组。

解决问题的最佳方法是将所有测试移动到一个文件中,并在规范中包含两个 describe

结构: spec.js

`describe()`
{
beforeall() \\ Spec1.js
it()
it()
}
describe(){
beforeAll()\\spec2.js
it()
it()
}

希望对你有帮助

【讨论】:

  • 感谢 Madhan 的帮助!但是,将套件更改为规格并没有帮助。 Protractor 开始执行第一个 Spec BeforeAll,甚至在完成之前,它开始执行第二个 Spec BeforeAll。似乎,“并行执行”正在发生。我搞砸了。
  • 与我建议的更改共享配置文件将检查。
  • 非常感谢 Madhan 尝试帮助我 - 如您所见,DublinDev 提供了解决方案。
  • 解决方案与提供的答案中的规范结构相同。你可以看到我已经将beforeAll() 移到了describe 的旁边。如果解决方案对您有帮助,您可以投票。
  • 是的,我完全错过了这一点 - 解决了这个问题 - 但是,最好的方法是不要将所有内容都移动到一个文件中 - 这不是一个强大/可扩展的框架。每个功能都应该存在于自己的规范中 - 谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
相关资源
最近更新 更多