如何在TeamCity中使用protractor-flake并解决重跑测试报告问题
解决protractor-flake重跑后TeamCity测试报告异常的问题
我之前在从Jenkins迁移到TeamCity时,也碰到过一模一样的问题——用protractor-flake重跑失败用例后,明明重跑通过了,TeamCity却还是显示失败的测试结果。核心原因其实是Jenkins和TeamCity处理测试报告的逻辑完全不同:
Jenkins是靠读取最终的JUnit XML文件,protractor-flake重跑时会用成功的XML覆盖失败的,所以Jenkins能拿到最新的结果;但TeamCityReporter是实时向TeamCity输出日志,第一次失败的日志已经被TeamCity记录了,重跑的成功日志没办法覆盖之前的失败记录。
下面给你两个可行的解决方案,按优先级推荐:
方案1:继续用JUnitXmlReporter,让TeamCity解析XML报告
这是最稳妥的方案,和你在Jenkins的逻辑保持一致,TeamCity对JUnit XML的支持非常成熟:
在protractor配置里保留JUnitXmlReporter,确保每次重跑都会覆盖生成的XML文件:
onPrepare: function() { const jasmineReporters = require('jasmine-reporters'); // 配置JUnit报告生成,consolidateAll设为true会生成单个XML文件,方便覆盖 jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({ consolidateAll: true, savePath: './test-reports', filePrefix: 'protractor-results' })); }在TeamCity中添加XML报告导入步骤:
- 打开你的TeamCity构建配置,在构建步骤的最后添加一个「Reporting」类型的步骤
- 选择「Import XML reports」,在「Paths to XML reports」里填写你生成的XML路径(比如
./test-reports/protractor-results.xml) - 这样TeamCity会在构建结束后读取最终的XML文件,不管protractor-flake重跑多少次,都会以最后一次的成功结果为准
方案2:自定义protractor-flake的日志输出(适合一定要用TeamCityReporter的场景)
如果你的项目必须用TeamCityReporter实时输出日志,可以通过脚本包裹protractor-flake,只把最后一次运行的日志输出给TeamCity:
写一个简单的Node脚本(比如
run-flake-tests.js):const { execSync } = require('child_process'); try { // 运行protractor-flake,捕获所有输出 const fullOutput = execSync( 'protractor-flake --max-attempts=3 -- ./protractor.conf.js', { encoding: 'utf-8', stdio: ['inherit', 'pipe', 'pipe'] } ); // 拆分输出,只保留最后一次尝试的日志(因为protractor-flake会用=== Running attempt X分隔每次运行) const attempts = fullOutput.split('=== Running attempt'); const lastAttemptOutput = attempts[attempts.length - 1]; // 把最后一次的输出打印给TeamCity,这样TeamCity只会记录最终的结果 console.log(`=== Running attempt ${attempts.length - 1}` + lastAttemptOutput); } catch (error) { // 如果最终还是失败,打印完整的错误信息 console.error(error.stdout || error.message); process.exit(1); }在TeamCity的构建步骤里运行这个脚本,而不是直接运行protractor-flake命令:
node run-flake-tests.js
这个方法需要处理日志拆分的逻辑,相对麻烦一些,不如方案1稳定,所以优先推荐方案1。
内容的提问来源于stack exchange,提问作者ryasui
相关产品推荐
相关产品推荐

