Cypress

npm install @tracera/cypress

需要 Node.js ≥ 22.19 和 Cypress ≥ 14(见 自动化测试适配器)。@tracera/cypress。

在 cypress.config.ts 中:

import { defineConfig } from 'cypress';
import { registerTraceraPlugin } from '@tracera/cypress';

export default defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      return registerTraceraPlugin(on, config);
    },
    supportFile: 'cypress/support/e2e.ts',
  },
});

在 support 文件中:

import '@tracera/cypress/support';

对于 Component Testing,从 component.setupNodeEvents 调用 registerTraceraPlugin,并在 CT support 文件中导入相同的 support 入口。

启用重试时只上报 最终 一次 Cypress 尝试。若该次是重试(retry > 0),结果 Env 页会包含 CYPRESS_RETRY(1 表示第二次运行)。

环境变量与运行模式见 自动化测试适配器。

绑定 testCaseId 与 autotestName

从 @tracera/cypress/runtime 导入 tracera / annotations,或在导入 support 后使用 cy.traceraTestCase。若未设置 autotestName,适配器使用 Cypress 测试标题。

在声明时(推荐 — 即使提前 this.skip() 也会绑定):

import { annotations } from '@tracera/cypress/runtime';

it('login', annotations(42, 'e2e/login'), () => {
  cy.visit('/login');
  cy.get('[data-testid=sign-in]').should('be.visible');
});

在测试体内(若 annotations 已绑定用例则可省略):

import { tracera } from '@tracera/cypress/runtime';

it('login', () => {
  tracera.testCase(42, 'e2e/login');
  cy.visit('/login');
  cy.get('[data-testid=sign-in]').should('be.visible');
});

或者:cy.traceraTestCase(42, "e2e/login")。

步骤

使用 tracera.step(或 cy.traceraStep)。在 import "@tracera/cypress/support" 之后,标准 beforeEach / afterEach 已仪器化 — 其中的步骤进入 准备 / 清理。

import { tracera } from '@tracera/cypress/runtime';

beforeEach(() => {
  tracera.step('open shop', () => {
    cy.visit('/shop');
  });
});

it('checkout', () => {
  tracera.testCase(10, 'e2e/checkout');
  tracera.step('add to cart', () => {
    cy.get('[data-testid=add]').click();
  });
});

afterEach(() => {
  tracera.step('cleanup', () => {
    // …
  });
});

注释、错误与附件

在步骤内是该步骤的字段。在步骤外是结果上的字段。结果最多 10 个附件,每个步骤最多 10 个。注册插件后,失败截图会自动转发。

import { tracera } from '@tracera/cypress/runtime';

it('login', () => {
  tracera.testCase(42, 'e2e/login');
  tracera.comment('result-level note');
  tracera.error('result-level error text');

  tracera.step('open login', () => {
    cy.visit('/login');
    tracera.comment('landed on login');
    tracera.attachment({
      fileName: 'suite-log.txt',
      mimeType: 'text/plain',
      data: 'finished login flow',
    });
  });
});