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格式:
- 执行测试并生成JSON格式覆盖率文件:
flutter test --coverage --coverage-path=coverage/coverage.json
- 转换为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):
- 安装转换工具:
pip install lcov-to-cobertura-xml
- 执行转换:
lcov-to-cobertura-xml -i coverage/lcov.info -o coverage/coverage.opencover.xml
两种方案生成的文件都可直接用于SonarCloud的覆盖率分析。
内容的提问来源于stack exchange,提问作者Rafał Developer
相关产品推荐
相关产品推荐

