对相对路径使用 require

IT技术 javascript angularjs testing protractor
2021-03-05 00:03:56

我们对 Protractor 进行了大量的端到端测试。我们遵循页面对象模式,这有助于我们保持测试干净和module化。我们还有一组帮助函数来帮助我们遵循DRY 原则

问题:

单个规范可能需要多个页面对象和辅助module。例如:

"use strict";

var helpers = require("./../../helpers/helpers.js");
var localStoragePage = require("./../../helpers/localStorage.js");
var sessionStoragePage = require("./../../helpers/sessionStorage.js");

var loginPage = require("./../../po/login.po.js");
var headerPage = require("./../../po/header.po.js");
var queuePage = require("./../../po/queue.po.js");

describe("Login functionality", function () {

    beforeEach(function () {
        browser.get("/#login");

        localStoragePage.clear();
    });

    // ...

});

你可以看到,我们有一个目录遍历在每一个需要声明:./../..这是因为我们有一个specs目录,我们将规范和多个目录按测试中的应用程序功能分组保存在其中。

问题:

在量角器中处理相对路径问题的规范方法是什么?

换句话说,我们希望避免遍历树,向上导入module。相反,从基本应用程序目录下下来会更干净。


尝试和想法:

有一篇关于解决这个问题的好文章:Better local require() paths for Node.js,但我不确定在使用 Protractor 开发测试时推荐哪个选项。

我们也尝试使用require.main来构造路径,但它指向的是node_modules/protractor目录而不是我们的应用程序目录。

5个回答

我遇到了同样的问题,最终得到了以下解决方案。在我的Protractor配置文件中,我有一个变量,用于存储 e2e 测试的基本文件夹的路径。此外,Protractor配置提供了onPrepare回调,您可以在其中使用名为的global变量为您的测试创建全局变量。您将它们定义为该global变量的属性,并使用与使用全局变量browserelement在测试中相同的方式我用它来创建自定义全局要求函数来加载不同类型的实体:

// __dirname retuns a path of this particular config file
// assuming that protractor.conf.js is in the root of the project
var basePath = __dirname + '/test/e2e/';
// /path/to/project/test/e2e/

exports.config = {

    onPrepare: function () {

        // "relativePath" - path, relative to "basePath" variable

        // If your entity files have suffixes - you can also keep them here
        // not to mention them in test files every time

        global.requirePO = function (relativePath) {
            return require(basePath + 'po/' + relativePath + '.po.js');
        };

        global.requireHelper = function (relativePath) {
            return require(basePath + 'helpers/' + relativePath + '.js');
        };

    }

};

然后您可以立即在测试文件中使用这些全局实用程序方法:

"use strict";    

var localStorageHelper = requireHelper('localStorage');
// /path/to/project/test/e2e/helpers/localStorage.js 

var loginPage = requirePO('login');
// /path/to/project/test/e2e/po/login.po.js

var productShowPage = requirePO('product/show');
// /path/to/project/test/e2e/po/product/show.po.js


describe("Login functionality", function () {

    beforeEach(function () {
        browser.get("/#login");

        localStorageHelper.clear();
    });

    // ...

});

我们一直面临同样的问题,并决定将所有页面对象和帮助文件转换为节点包。在测试中要求它们现在就像var Header = require('header-po'). 转换为包的另一个好处是您可以使用正确的版本控制。

这是一个简单的例子:

./page-objects/header-po/index.js

//page-objects/header-po/index.js

'use strict';

var Header = function () {
    this.goHome = function () {
        $('#logo a').click();
    };
  };

module.exports = Header;

./page-objects/header-po/package.json

{
    "name": "header-po",
    "version": "0.1.1",
    "description": "Header page object",
    "main": "index.js",
    "dependencies": {}
}

./package.json

{
    "name": "e2e-test-framework",
    "version": "0.1.0",
    "description": "Test framework",
    "dependencies": {
        "jasmine": "^2.1.1",
        "header-po": "./page-objects/header-po/",
    }
}

./tests/header-test.js

'use strict';

var Header = require('header-po');

var header = new Header();

describe('Header Test', function () {
    it('clicking logo in header bar should open homepage', function () {
        browser.get(browser.baseUrl + '/testpage');
        header.goHome();
        expect(browser.getCurrentUrl()).toBe(browser.baseUrl);
    });
});

我有同样的问题。对 Michael Radionov 做了类似的解决方案,但不是设置全局函数,而是设置量角器本身的属性。

量角器配置文件

onPrepare: function() {
  protractor.basePath = __dirname;
}

测试-e2e.js

require(protractor.basePath+'/helpers.js');

describe('test', function() {
   .......
});

我认为我们在我工作的地方使用的方法对您来说可能是一个很好的解决方案。我已经发布了一个关于我们如何处理所有事情的简短示例。这是非常好的 b/c 你可以在任何规范文件中调用页面对象函数,你不需要在规范中使用 require 。

从另一个module调用节点module,而无需在任何地方使用 require()

所有的答案似乎更多的是解决方法

实际可行的解决方案是这样的:

    "_moduleAliases": {
        "@protractor": "protractor/_protractor",
        "@tmp": "protractor/.tmp_files",
        "@test_data": "protractor/.tmp_files/test_data",
        "@custom_implementation": "protractor/custom_implementation",
    },
  • 将此添加为量角器配置的第一行
require('module-alias/register');
  • 像这样在项目的任何地方使用它
const params = require('@test_data/parameters');
const customImplementation require('@custom_implementation')
// etc
我希望我没有遗漏任何重要的东西,因为我在 2 年前实现了它并且仍然没有修改地使用它。让我知道
2021-04-29 00:03:56