如何在所有Cucumber用例执行完成后执行S3上传命令?
技术栈
- 基于WebdriverIO的JavaScript:用于Web元素识别与断言
- Cucumber:用于编写测试步骤与执行
.feature测试文件 - performanceTotal包:用于性能测量与生成报告
现状
performanceTotal包会生成csv和json格式的结果文件,我需要从中提取数据生成页面切换耗时等图表,但该结果文件仅在所有测试步骤(包括AfterAll)执行完成后才会生成。
问题
我要在Jenkins中运行测试生成长期趋势图表,需要把结果文件上传到S3(上传逻辑本身没问题)。但因为结果文件在测试完全结束后才可用,在AfterAll步骤里执行上传无效(结果文件是AfterAll之后才生成的),请问有没有办法在Cucumber框架外部或者测试完全结束后执行上传命令?
现有AfterAll代码片段
AfterAll({timeout: 10 * 60000} ,async () => { logInfo("Starting generation of charts and upload of json result files to S3"); await Promise.all(feat.map(async item => { await generatePerformanceChart(item, "line", result); await uploadResultsToS3(item); })); logSuccess("Upload of results files to S3 successful!"); });
可行解决方案
1. 利用WebdriverIO的onComplete钩子
WebdriverIO提供全局的onComplete钩子,它会在所有测试(包括Cucumber的AfterAll)完全执行完毕,且所有服务(包括performanceTotal)都完成收尾工作后触发。你可以在wdio.conf.js中配置这个钩子来执行S3上传:
// wdio.conf.js exports.config = { // 其他配置项... onComplete: async function(exitCode, config, capabilities, results) { console.log("Starting generation of charts and upload of json result files to S3"); await Promise.all(feat.map(async item => { await generatePerformanceChart(item, "line", result); await uploadResultsToS3(item); })); console.log("Upload of results files to S3 successful!"); } }
这个钩子是WebdriverIO生命周期的最后一步,此时performanceTotal已经生成所有结果文件,可直接读取并上传。
2. 拆分脚本:将上传逻辑独立为单独的Node.js脚本
如果不想修改测试配置,可以把图表生成和S3上传的逻辑抽成独立的Node.js脚本(比如upload-results.js),然后在Jenkins的构建步骤中,先执行测试命令,再执行上传脚本:
# Jenkins构建步骤 npm run test # 执行Cucumber测试,performanceTotal生成结果文件 node upload-results.js # 读取结果文件并上传到S3
这种方式完全脱离测试框架,确保测试完全结束后再执行上传,适合灵活调整上传逻辑的场景。
3. 调整performanceTotal配置(备选)
检查performanceTotal的配置项,看是否支持实时生成结果文件或提前触发文件生成。不过根据官方说明,它默认在测试结束后统一生成,所以这个方法优先级较低,可作为备选尝试。
内容的提问来源于stack exchange,提问作者ionion

