文件夹结构和依赖关系的问题
Problem with the folder structure and dependencies
我有以下初始情况:
我们的测试参考了通过国家/地区下拉列表提供多种语言版本的商店。
根据国家/地区的不同,商店具有不同的功能,因此测试也不同。
我这里有两个问题。首先是文件夹结构
为了不让每个国家都有单独的回购协议,我们想按文件夹将商店的测试规范分开。
但由于 PageObjects 是相同的,我只想定义它们一次,以便测试规范可以访问它们。
然而,它并没有像我想象的那样工作。
这是我对 Cypress 中文件夹结构的想法:
cypress-automation
cypress
fixtures
integration
shops
shop_de
sample-tests.spec.js
shop_en
sample-tests.spec.js
shop_es
sample-tests.spec.js
plugins
index.js
support
pageObjects
samplePageObject.js
index.js
commands.js
node_modules
cypress.json
package-lock.json
package.json
但是,它不起作用,因为 Cypress 缺少 PageObjects。出现以下错误:
Error: webpack compilation error
./cypress/integration/shops/shop_en/sample-tests.spec.js
Module not found: Error: Unable to resolve '../support/pageObjects/samplePageObject.js' in 'C:\users\users\desktop\cypress-automation\cypress\integration\shops\shop_en'.
第二个问题涉及index.js
在那里我必须在 beforeEach
方法中添加一个国家开关,因为商店的 URL 是相同的并且只能通过下拉菜单更改商店。
不幸的是,我不知道如何将 index.js
集成到存储文件夹中,以便 sample-tests.spec.js
访问特定的 index.js
而不是全局的。或者,我将不得不在每个 sample-tests.spec.js
中调整 beforeEach
方法,但是有这么多测试规范,我发现这是不切实际的。
有没有可能像我想象的那样?
编辑:
@Fody
我完全按照你说的做了。但是,现在我得到一个错误:
PageObjects_homePage__WEBPACK_IMPORTED_MODULE_1_.HomePage is not a constructor
这是我的代码中的一个示例,我是如何包含它的:
import { HomePage } from "@PageObjects/homePage";
构造函数看起来像这样
const homePage = new HomePage();
首页Class:
class HomePage {
testMethod() {
testcode()
}
}
export default HomePage;
对于第一部分,设置一个 webpack 别名,以便于从集成文件夹中的任何位置导入,任何级别嵌套。
按照他们的说明添加包 Cypress Webpack Preprocessor,
npm install --save-dev @cypress/webpack-preprocessor
npm install --save-dev @babel/core @babel/preset-env babel-loader webpack
- 如果尚未安装
或用纱线
yarn add -D @cypress/webpack-preprocessor
yarn add -D @babel/core @babel/preset-env babel-loader webpack
- 如果尚未安装
cypress/plugins.index.js
/// <reference types="cypress" />
const path = require('path');
const webpack = require('@cypress/webpack-preprocessor');
console.log('__dirname', __dirname) // __dirname is cypress/plugins
module.exports = (on) => {
const options = {
webpackOptions: {
resolve: {
alias: {
'@PageObjects': path.resolve(__dirname, '../../cypress/support/pageObjects')
},
},
},
watchOptions: {},
};
on('file:preprocessor', webpack(options));
};
cypress/integration/shops/shop_de/sample-tests.spec.js
// resolves any level of nesting
import {MyPageObject} from '@PageObjects/samplePageObject.js'
...
cypress/integration/shops/shop_de/bavaria/sample-tests.spec.jbs
// same import after move to sub-folder
import {MyPageObject} from '@PageObjects/samplePageObject.js'
...
我有以下初始情况:
我们的测试参考了通过国家/地区下拉列表提供多种语言版本的商店。 根据国家/地区的不同,商店具有不同的功能,因此测试也不同。
我这里有两个问题。首先是文件夹结构
为了不让每个国家都有单独的回购协议,我们想按文件夹将商店的测试规范分开。 但由于 PageObjects 是相同的,我只想定义它们一次,以便测试规范可以访问它们。 然而,它并没有像我想象的那样工作。
这是我对 Cypress 中文件夹结构的想法:
cypress-automation
cypress
fixtures
integration
shops
shop_de
sample-tests.spec.js
shop_en
sample-tests.spec.js
shop_es
sample-tests.spec.js
plugins
index.js
support
pageObjects
samplePageObject.js
index.js
commands.js
node_modules
cypress.json
package-lock.json
package.json
但是,它不起作用,因为 Cypress 缺少 PageObjects。出现以下错误:
Error: webpack compilation error
./cypress/integration/shops/shop_en/sample-tests.spec.js
Module not found: Error: Unable to resolve '../support/pageObjects/samplePageObject.js' in 'C:\users\users\desktop\cypress-automation\cypress\integration\shops\shop_en'.
第二个问题涉及index.js
在那里我必须在 beforeEach
方法中添加一个国家开关,因为商店的 URL 是相同的并且只能通过下拉菜单更改商店。
不幸的是,我不知道如何将 index.js
集成到存储文件夹中,以便 sample-tests.spec.js
访问特定的 index.js
而不是全局的。或者,我将不得不在每个 sample-tests.spec.js
中调整 beforeEach
方法,但是有这么多测试规范,我发现这是不切实际的。
有没有可能像我想象的那样?
编辑: @Fody
我完全按照你说的做了。但是,现在我得到一个错误:
PageObjects_homePage__WEBPACK_IMPORTED_MODULE_1_.HomePage is not a constructor
这是我的代码中的一个示例,我是如何包含它的:
import { HomePage } from "@PageObjects/homePage";
构造函数看起来像这样
const homePage = new HomePage();
首页Class:
class HomePage {
testMethod() {
testcode()
}
}
export default HomePage;
对于第一部分,设置一个 webpack 别名,以便于从集成文件夹中的任何位置导入,任何级别嵌套。
按照他们的说明添加包 Cypress Webpack Preprocessor,
npm install --save-dev @cypress/webpack-preprocessor
npm install --save-dev @babel/core @babel/preset-env babel-loader webpack
- 如果尚未安装
或用纱线
yarn add -D @cypress/webpack-preprocessor
yarn add -D @babel/core @babel/preset-env babel-loader webpack
- 如果尚未安装
cypress/plugins.index.js
/// <reference types="cypress" />
const path = require('path');
const webpack = require('@cypress/webpack-preprocessor');
console.log('__dirname', __dirname) // __dirname is cypress/plugins
module.exports = (on) => {
const options = {
webpackOptions: {
resolve: {
alias: {
'@PageObjects': path.resolve(__dirname, '../../cypress/support/pageObjects')
},
},
},
watchOptions: {},
};
on('file:preprocessor', webpack(options));
};
cypress/integration/shops/shop_de/sample-tests.spec.js
// resolves any level of nesting
import {MyPageObject} from '@PageObjects/samplePageObject.js'
...
cypress/integration/shops/shop_de/bavaria/sample-tests.spec.jbs
// same import after move to sub-folder
import {MyPageObject} from '@PageObjects/samplePageObject.js'
...