我有我的 Cypress 项目设置,这样我就可以一次性编写和运行 Spec 和 Cucumber 测试。
cypress run --spec "cypress/tests/gsac/specs/*.cy.js,cypress/tests/gsac/*.feature"
效果很好!所有测试结果都在一份报告中。
但现在我需要过滤我运行的内容。按测试名称过滤不够灵活。 Cucumber 具有出色的标签功能,使用 AND/OR 表达式按标签进行过滤。
// Feature files
@smoke
Feature: A critical thing
@slow
Scenario: A thing that is slow to test.
@smoke
Feature: A critical thing
# Run syntax
cypress run --spec "cypress/tests/integration/*.cy.js,cypress/tests/integration/*.feature" \
--env tags='@smoke and not @slow'
这仅过滤 Cucumber 测试,以便运行所有 Spec 测试。
有人知道 Cypress + Cucumber 标签 + Spec 标签的工作解决方案吗?
我研究了各种用于过滤规格的库,但我找不到与 cypress-cucumber-preprocessor 完全兼容的库。
tags=''
代表 Cucumber OR grepTags=''
代表 Spec,但不能同时使用两者。如果两个环境变量均已设置,则将跳过所有 Cucumber 测试。所以我这迫使我将 Spec 与 Cuke 的构建/报告分开,我真的不想这样做。cypress-cucumber-preprocessor
和@cypress/grep
都改变specPattern
设置来实现标签过滤。因此,根据配置的不同,可能会存在冲突。
@cypress/grep
有两种替代配置方法 - 在 cypress/support/e2e
或 cypress.config.ts
中。
使用配置方法适用于我的项目
cypress.config.ts
import { defineConfig } from "cypress";
import createBundler from "@bahmutov/cypress-esbuild-preprocessor";
import { addCucumberPreprocessorPlugin } from "@badeball/cypress-cucumber-preprocessor";
import createEsbuildPlugin from "@badeball/cypress-cucumber-preprocessor/esbuild";
async function setupNodeEvents(
on: Cypress.PluginEvents,
config: Cypress.PluginConfigOptions
): Promise<Cypress.PluginConfigOptions> {
await addCucumberPreprocessorPlugin(on, config);
on("file:preprocessor", createBundler({ plugins: [createEsbuildPlugin(config)] }));
if (config.env.tags) {
config.env.grepTags = config.env.tags // set grepTags to be same as tags
config.env.grepFilterSpecs = true
require('@cypress/grep/src/plugin')(config);
}
return config;
}
export default defineConfig({
e2e: {
specPattern: "**/*.{cy.ts,feature}", // both extension types
setupNodeEvents,
env: {
"filterSpecsMixedMode": "show", // for cucumber, allow specs
}
},
})
命令行只是
"scripts": {
"cy:run": "cypress run --env tags=@smoke",
我有以下功能和规格 - a.* 有
@smoke
标签,b.* 没有。
a.功能
@smoke
Feature: some feature
Scenario: first scenario
Given a step
b.功能
Feature: some other feature
Scenario: second scenario
Given a step
a.cy.ts
it('passes', { tags: '@smoke' }, () => {
cy.visit('https://example.cypress.io')
})
b.cy.ts
it('b passes', () => {
cy.visit('https://example.cypress.io')
})
结果
(Run Finished)
Spec Tests Passing Failing Pending Skipped
┌──────────────────────────────────────────────────────────────────────────────────────────────┐
│ √ a.cy.ts 00:03 1 1 - - - │
├──────────────────────────────────────────────────────────────────────────────────────────────┤
│ √ a.feature 188ms 1 1 - - - │
├──────────────────────────────────────────────────────────────────────────────────────────────┤
│ √ b.feature 122ms 1 - - 1 - │
└──────────────────────────────────────────────────────────────────────────────────────────────┘
√ All specs passed! 00:03 3 2 - 1 -
由于 b.cy.ts
设置,运行中省略了
config.env.grepFilterSpecs:true
。这似乎是使事情在规范(grep)方面工作所必需的。
b.feature
包含在运行中,但由于没有标签而被跳过。