You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在内存中生成cucumber-js HTML报告(AWS Lambda场景)

实现Cucumber.js内存中生成HTML报告(适配AWS Lambda邮件发送)

完全可以实现内存中生成Cucumber HTML报告,核心思路是绕开文件输出,将报告内容直接存储在内存变量中,后续可直接用于邮件发送。下面提供两种可靠的实现方案:

方案一:基于官方HTML Formatter改造内存输出

直接扩展Cucumber官方的HTML Formatter,将原本写入文件的内容转向内存缓存:

  1. 创建自定义内存Formatter
const { HtmlFormatter } = require('@cucumber/cucumber/lib/formatter/html_formatter');

class InMemoryHtmlFormatter extends HtmlFormatter {
  constructor(options) {
    // 模拟内存流,替代文件写入流
    const memoryStream = {
      buffer: '',
      write(chunk) {
        this.buffer += chunk.toString();
      },
      end() {}
    };
    
    // 调用父类构造,传入内存流
    super({ ...options, stream: memoryStream });
    this.memoryStream = memoryStream;
    
    // 测试结束时触发回调传递报告内容
    this.on('end', () => {
      options.onReportReady?.(this.memoryStream.buffer);
    });
  }
}

module.exports = InMemoryHtmlFormatter;
  1. 运行测试并获取内存报告
const { runCucumber } = require('@cucumber/cucumber');
const InMemoryHtmlFormatter = require('./InMemoryHtmlFormatter');

async function generateTestReport() {
  let htmlReport = '';

  await runCucumber({
    features: ['features/my-feature.feature'],
    tags: '@your-target-tag',
    require: ['step-definitions/**/*.js'],
    formatters: [
      {
        formatter: InMemoryHtmlFormatter,
        options: {
          // 回调接收生成的HTML报告
          onReportReady: (report) => {
            htmlReport = report;
          }
        }
      }
    ]
  });

  return htmlReport;
}

// AWS Lambda Handler示例
exports.handler = async () => {
  const report = await generateTestReport();
  
  // 这里接入邮件发送逻辑(比如AWS SES)
  // sendTestResultEmail(report);

  return { statusCode: 200, body: '测试报告已生成并准备发送' };
};

方案二:JSON结果转HTML(更稳定的兼容方案)

先在内存中收集JSON格式的测试结果,再用官方的@cucumber/html-formatter转换为HTML,这种方式不依赖Cucumber内部结构,版本兼容性更好:

  1. 安装依赖
npm install @cucumber/html-formatter --save
  1. 实现测试与报告生成逻辑
const { runCucumber } = require('@cucumber/cucumber');
const { HtmlFormatter } = require('@cucumber/html-formatter');
const { Writable } = require('stream');

async function generateTestReport() {
  // 内存收集JSON测试结果
  const jsonResults = [];
  await runCucumber({
    features: ['features/my-feature.feature'],
    tags: '@your-target-tag',
    require: ['step-definitions/**/*.js'],
    formatters: [
      {
        formatter: 'json',
        options: {
          stream: new Writable({
            write(chunk, _, callback) {
              jsonResults.push(JSON.parse(chunk.toString()));
              callback();
            }
          })
        }
      }
    ]
  });

  // 将JSON结果转换为HTML
  let htmlReport = '';
  const htmlFormatter = new HtmlFormatter({
    stream: new Writable({
      write(chunk, _, callback) {
        htmlReport += chunk.toString();
        callback();
      }
    })
  });

  // 传递所有JSON结果给Formatter
  jsonResults.forEach(result => htmlFormatter.parse(result));
  htmlFormatter.finish();

  return htmlReport;
}

// AWS Lambda Handler示例
exports.handler = async () => {
  const report = await generateTestReport();
  
  // 执行邮件发送逻辑
  // sendTestResultEmail(report);

  return { statusCode: 200, body: '测试报告生成完成' };
};

注意事项

  • 生成的HTML报告是自包含的(内嵌CSS、JS资源),无需额外文件,直接作为邮件内容或附件发送即可。
  • AWS Lambda部署时,需确保features、step-definitions等测试相关文件被打包进部署包。
  • 两种方案均无需写入Lambda临时文件系统,完全符合无文件操作的需求。

内容的提问来源于stack exchange,提问作者SanjX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 02:25:29