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

Flutter生成coverage.opencover.xml用于SonarCloud遇格式异常问题

解决Flutter生成opencover.xml格式覆盖率文件失败问题

问题场景

  • 需求:生成coverage.opencover.xml文件用于SonarCloud代码覆盖率分析
  • 已完成操作:执行flutter test --coverage成功生成coverage/lcov.info
  • 失败操作:激活最新版coverage包(1.7.2)后,执行转换命令触发FormatException解析异常

错误命令及日志

执行的转换命令:

dart pub global run coverage:format_coverage --lcov --in=coverage\lcov.info --out=coverage.opencover.xml --packages=./pubspec.yaml --report-on=lib

抛出的异常日志:

Unhandled exception:
FormatException: Unexpected character (at character 1)
SF:lib\main.dart
^
#0      _ChunkedJsonParser.fail (dart:convert-patch/convert_patch.dart:1383:5)
#1      _ChunkedJsonParser.parseNumber (dart:convert-patch/convert_patch.dart:1250:9)
#2      _ChunkedJsonParser.parse (dart:convert-patch/convert_patch.dart:915:22)
#3      _parseJson (dart:convert-patch/convert_patch.dart:35:10)
#4      JsonDecoder.convert (dart:convert/json.dart:610:36)
#5      JsonCodec.decode (dart:convert/json.dart:216:41)
#6      HitMap.parseFiles (package:coverage/src/hitmap.dart:209:28)
#7      main (file:///C:/Users/z004u3kh/AppData/Local/Pub/Cache/hosted/pub.dev/coverage-1.7.2/bin/format_coverage.dart:66:31)
#8      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:294:33)
#9      _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:189:12)

当前生成的lcov.info内容

SF:lib\main.dart
DA:3,0
DA:4,0
DA:8,2
DA:11,1
DA:13,1
DA:15,1
DA:31,1
DA:40,1
DA:53,1
DA:54,1
DA:60,1
DA:61,2
DA:67,2
DA:71,1
DA:79,1
DA:80,1
DA:84,3
DA:87,3
DA:89,1
DA:92,1
DA:107,1
DA:111,1
DA:112,2
DA:113,3
DA:118,1
DA:119,1
LF:26
LH:24
end_of_record

解决方案

问题根源:coverage包的format_coverage命令默认仅支持JSON格式的原始覆盖率数据,你用--lcov参数指定输入格式,但该命令并没有实现LCov到opencover的直接转换逻辑,导致它把LCov文本当成JSON解析,抛出格式异常。

方案一:直接生成JSON再转换

跳过LCov生成步骤,直接生成原始JSON覆盖率数据,再转换为opencover格式:

  1. 执行测试并生成JSON格式覆盖率文件:
flutter test --coverage --coverage-path=coverage/coverage.json
  1. 转换为opencover.xml:
dart pub global run coverage:format_coverage --in=coverage/coverage.json --out=coverage/coverage.opencover.xml --packages=./.dart_tool/package_config.json --report-on=lib --format=opencover

方案二:用第三方工具转换现有LCov文件

如果已经有lcov.info,可以用Python工具lcov-to-cobertura-xml转换(需先安装Python):

  1. 安装转换工具:
pip install lcov-to-cobertura-xml
  1. 执行转换:
lcov-to-cobertura-xml -i coverage/lcov.info -o coverage/coverage.opencover.xml

两种方案生成的文件都可直接用于SonarCloud的覆盖率分析。

内容的提问来源于stack exchange,提问作者Rafał Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:30:21