使用cypress-cucumber-preprocessor时,如何使用标签来过滤规格和功能?

问题描述 投票:0回答:1

我有我的 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 完全兼容的库。

  • cypress-tags - 不兼容。对功能或场景上的任何标签引发异常。这太糟糕了,因为它支持类似于 Cucumber 的标签表达式。
  • cypress-cucumber-tagging - 不兼容。安装后,将跳过所有 Cucumber 测试。还支持 Cucumber 标签表达式,啊。
  • cypress-grep - 这是我得到的最接近的,但它不完全兼容。对于给定的运行,您可以使用
    tags=''
    代表 Cucumber OR
    grepTags=''
    代表 Spec,但不能同时使用两者。如果两个环境变量均已设置,则将跳过所有 Cucumber 测试。所以我这迫使我将 Spec 与 Cuke 的构建/报告分开,我真的不想这样做。
javascript tags cucumber cypress cypress-grep
1个回答
0
投票

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
包含在运行中,但由于没有标签而被跳过。

© www.soinside.com 2019 - 2024. All rights reserved.