DEV Community

Dennis Zhang
Dennis Zhang

Posted on

Gherkin语法的@标记和Examples

1、### @ 标记(也称为标签)用于对 Gherkin 场景(Scenario)或场景大纲(Scenario Outline)进行分类和过滤。你可以通过标签选择特定的测试场景进行运行。
用法: 标签可以放在 Feature 或 Scenario 之前,用 @ 加上标签名称表示。

通过使用标签,你可以运行特定类型的测试。例如,使用 cypress-cucumber-preprocessor 时,你可以只运行带有 @smoke 标签的测试:
命令行方式

npx cypress run --env TAGS="@smoke"
Enter fullscreen mode Exit fullscreen mode

配置文件方式

 e2e: {
    async setupNodeEvents(on, config) {
      // 加载Cucumber插件
      await addCucumberPreprocessorPlugin(on, config);

      // 为Cucumber Preprocessor添加Esbuild处理器
      on('file:preprocessor', createEsbuildPreprocessor(config));

      // 返回配置
      return config;
    },

    // 在这里设置需要运行的标签
    env: {
      TAGS: '@smoke and not @ignore',
    },

    // 其他 Cypress 配置
    specPattern: 'cypress/e2e/**/*.feature',
    baseUrl: 'http://localhost:3000',
  },
Enter fullscreen mode Exit fullscreen mode

2、Examples 表(用于场景大纲)
一个包含 Examples 表的 Gherkin 场景大纲

@login
Feature: User login

  Scenario Outline: Login with different credentials
    Given the user is on the login page
    When the user enters "<username>" and "<password>"
    Then the user should see a "<message>"

    Examples:
      | username    | password    | message              |
      | validUser   | validPass   | Welcome back!        |
      | invalidUser | validPass   | Invalid credentials! |
      | validUser   | invalidPass | Invalid credentials! |

Enter fullscreen mode Exit fullscreen mode

步骤定义文件通常放在 cypress/e2e/ 目录中。你需要使用 Gherkin 步骤定义(如 Given, When, Then)来处理 Examples 表中的数据

import { Given, When, Then } from '@badeball/cypress-cucumber-preprocessor';

Given('the user is on the login page', () => {
  cy.visit('/login'); // 访问登录页面
});

When('the user enters {string} and {string}', (username, password) => {
  // 使用传递的数据执行操作
  cy.get('input[name="username"]').type(username);
  cy.get('input[name="password"]').type(password);
  cy.get('button[type="submit"]').click();
});

Then('the user should see a {string}', (message) => {
  // 检查页面上的消息是否与预期一致
  cy.contains(message).should('be.visible');
});

Enter fullscreen mode Exit fullscreen mode

Top comments (0)