close

Reporter API

Reporter API 允许你创建自定义测试结果处理器和输出格式器。此接口是实验性的,在未来的版本中可能会发生变化。

注意:使用示例和配置指南,请参阅 报告器指南

使用自定义报告器

通过实现 Reporter 接口来创建自定义报告器:

import type { Reporter, TestFileResult } from '@rstest/core';

const customReporter: Reporter = {
  onTestFileStart(test) {
    console.log(`Starting: ${test.testPath}`);
  },

  onTestFileResult(result) {
    console.log(`Finished: ${result.testPath}`);
  },

  onTestRunEnd({ results, duration }) {
    console.log(`All tests completed in ${duration.totalTime}ms`);
  },
};

在配置中使用自定义报告器:

import { defineConfig } from '@rstest/core';
import { customReporter } from './path/to/custom-reporter';

export default defineConfig({
  reporters: [customReporter],
});

接口概览

Reporter 接口为测试执行提供生命周期钩子。每个钩子在测试运行期间的具体时间点被调用。

重要提示:有关最新的接口定义和完整类型签名,请参考 源代码

钩子类别

  • 文件级钩子: onTestFileStartonTestFileReadyonTestFileResult
  • 套件级钩子: onTestSuiteStartonTestSuiteResult
  • 用例级钩子: onTestCaseStartonTestCaseResult
  • 运行级钩子: onTestRunEndonUserConsoleLogonExit

基本接口结构

interface Reporter {
  onTestFileStart?(test: TestFileInfo): void;
  onTestFileReady?(test: TestFileInfo): void;
  onTestFileResult?(test: TestFileResult): void;
  onTestSuiteStart?(test: TestSuiteInfo): void;
  onTestSuiteResult?(result: TestResult): void;
  onTestCaseStart?(test: TestCaseInfo): void;
  onTestCaseResult?(result: TestResult): void;
  onTestRunEnd?(context: TestRunEndContext): MaybePromise<void>;
  onUserConsoleLog?(log: UserConsoleLog): void;
  onExit?(): void;
}

示例

简单自定义报告器

import type { Reporter } from '@rstest/core';

const simpleReporter: Reporter = {
  onTestFileStart(test) {
    console.log(`📁 ${test.testPath}`);
  },

  onTestCaseResult(result) {
    const status = result.status === 'pass' ? '✅' : '❌';
    console.log(`${status} ${result.name}`);
  },

  onTestRunEnd({ results }) {
    const passed = results.filter((r) => r.status === 'pass').length;
    const failed = results.filter((r) => r.status === 'fail').length;
    console.log(`\n📊 ${passed} passed, ${failed} failed`);
  },
};

文件输出报告器

import { writeFileSync } from 'node:fs';
import type { Reporter } from '@rstest/core';

const jsonReporter: Reporter = {
  onTestRunEnd({ results }) {
    const report = {
      timestamp: new Date().toISOString(),
      results: results.map((r) => ({
        path: r.testPath,
        status: r.status,
        duration: r.duration,
        errors: r.errors,
      })),
    };

    writeFileSync('test-report.json', JSON.stringify(report, null, 2));
  },
};