programing

상대 경로와 함께 require 사용

kakaobank 2023. 3. 13. 20:37
반응형

상대 경로와 함께 require 사용

우리는 Protractor에 대해 꽤 많은 엔드 투 엔드 테스트를 가지고 있다.Page Object 패턴에 따라 테스트를 깔끔하고 모듈식으로 유지하고 있습니다.또한 DRY 원칙을 따르는 데 도움이 되는 도우미 기능도 있습니다.

문제:

단일 사양에 여러 페이지 개체와 도우미 모듈이 필요할 수 있습니다.예:

"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();
    });

    // ...

});

모든 require 스테이트먼트에 그 디렉토리 트래버설이 있는 것을 알 수 있습니다../../..그 이유는 저희가...specs테스트 대상 애플리케이션 기능별로 분류된 사양 및 여러 디렉토리를 내부에 보관합니다.

질문:

프로젝터의 상대 경로 문제에 접근하는 표준 방법은 무엇입니까?

즉, 트리를 통과하거나 모듈을 Import하기 위해 올라가는 것을 피하고 싶습니다.대신 기본 응용 프로그램 디렉토리에서 내려가는 것이 훨씬 깨끗합니다.


시도와 생각:

이 문제에 대한 접근에 관한 훌륭한 기사가 있습니다.Node.js의 로컬 require() 경로가 더 좋지만, Protractor를 사용하여 테스트를 개발할 때 어떤 옵션이 권장되는지 잘 모르겠습니다.

경로를 구축하기 위해 사용하려고 했지만node_modules/protractor응용 프로그램 디렉토리 대신 디렉토리.

저도 같은 문제가 있어서 결국 다음과 같은 해결책을 찾았습니다. 프로젝터 구성 파일에는 e2e 테스트의 기본 폴더에 대한 경로를 저장하는 변수가 있습니다., 프로젝터 설정은 콜백을 제공합니다.콜백에서는 다음과 같은 변수를 사용할 수 있습니다.global테스트에 사용할 글로벌 변수를 만듭니다.그 속성으로 정의합니다.globalglobals를 사용하는 것과 동일한 방법으로 변수를 사용합니다.browser또는element테스트에서.다양한 유형의 엔티티를 로드하는 커스텀 글로벌 요구 함수를 만드는 데 사용하였습니다.

// __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-displays/syslog-po/index.displays

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

'use strict';

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

module.exports = Header;

./page-po/page-po/param.json

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

./filength.json

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

./syslog/syslog-test.syslog

'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 Radioov의 솔루션과 유사하지만 전역 함수를 설정하는 것이 아니라 견인기 자체의 속성을 설정했다.

protractor.conf.displaces

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

test-e2e.displict

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

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

제가 일하는 곳에서 사용하는 방법이 당신에게 좋은 해결책이 될 것 같습니다.저는 우리가 모든 것을 어떻게 다루는지에 대한 간단한 예를 올렸습니다.b/c는 어떤 스펙 파일에서도 페이지 오브젝트 함수를 호출할 수 있기 때문에 스펙에서는 require를 사용할 필요가 없습니다.

모든 장소에서 require()를 사용하지 않고 다른 모듈에서 노드 모듈을 호출합니다.

모든 답변은 회피책에 가까운 것 같습니다.

실제로 기능하는 솔루션은 다음과 같습니다.

  • 설치 모듈 에일리어스
  • 이것을 패키지에 추가합니다.json
    "_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

언급URL : https://stackoverflow.com/questions/31491952/using-require-with-relative-paths

반응형