sonarQube如何展示覆盖率?

配置扫描分析范围

项目中的一些源文件不用被sonar扫描,可以通过配置过滤这些文件。比如通过工具生成的代码、使用的三方库的源代码、有意复制的代码等等。

测试代码和非测试代码是有区别的

  • 对这两类源代码应用不同的分析规则
  • 这两个类别具有不同的指标
  • 测试代码不计入许可证定义的代码行数限制
  • 测试代码不计入覆盖率

sonar.sources 

sonar.sources 是 SonarQube 或 SonarScanner 在进行代码质量分析时配置的一个属性,它指定了哪些源代码目录应该被扫描。这个属性通常被设置在项目的配置文件中,如 sonar-project.properties 文件,或者在Maven、Gradle等构建工具的配置文件中。

作用:

        指定扫描范围、 提高分析效率、定制化分析。

例如:

        sonar.sources=src/main/java

        在这个例子中,sonar.sources被设置为 src/main/java, 意味着 SonarScanner 将只扫描这个目录下的java源代码文件。

注意事项:

  • 路径问题: 在配置 sonar.sources时,需要确保指定的路径是相对于项目根目录的,或者是一个绝对路径。
  • 配置多个目录:sonar.sources属性用于指定要进行代码分析的源代码目录。这些路径可以是单个目录,也可以是多个目录,多个目录之间使用逗号( , ) 分隔。比如sonar.sources=src/main/java,src/test/java。
  • 结合sonar.exclusions sonar.inclusions:
    • ​​​​​​​如果需要更精细地控制扫描范围,可以结合使用sonar.exclusions(排除特定目录或文件)和sonar.inclusions(仅包含特定目录或文件)属性。这样,即使sonar.sources指定了一个较大的范围,也可以通过排除和包含规则来缩小实际扫描的范围。
    • 排除特定文件或目录:如果你需要排除特定的文件或目录,可以使用 sonar.exclusions 属性来指定配出规则。例如 sonar.exclusions=**/*_test.java,**/vendor/** 将排除所有以_test.java结尾的文件和vendor目录下的所有文件。
    • 通配符使用: 在 sonar.inclusions 和 sonar.exclusions 等属性中,可以使用通配符(如 ** 表示任意数量的目录层级,*表示任意数量的字符但不包括目录分隔符)来匹配多个文件或目录。

sonar.tests

sonar.tests告诉 SonarScanner 在哪些目录中查找测试代码,以便在代码质量分析中可以包含这些测试代码的信息(尽管测试代码本身不会直接分析以寻找代码异味或漏洞),但它们的存在和位置对于理解项目结构和进行代码覆盖率分析很重要。

作用:

  • 指定测试源代码目录:sonar.tests 属性允许你指定一个或多个包含测试源代码的目录。这些目录中的文件通常包含项目的单元测试、集成测试等。
  • 支持代码覆盖率分析:虽然SonarQube本身不直接执行测试,但它可以集成外部的代码覆盖率工具。通过指定sonar.tests, SonarScanner能够更容易地找到这些测试相关的代码覆盖率报告,并将其与SonarQube中的代码质量分析相结合。

示例:

sonar.sources=src/main/java  
sonar.tests=src/test/java 

注意事项:

  • 路径分隔符: 在配置路径时,请确保使用与你的操作系统相匹配的路径分隔符(windows上是, Unix\Linux\macOS上是 )。 但是,在sonar-project.properties文件中,通常建议使用 / 作为路径分隔符,因为SonarScanner能够跨平台工作并理解这种表示方式。
  • 逗号分隔:如果需要指定多个目录作为测试源代码的位置,可以使用逗号(,) 来分隔这些目录的路径。
  • 结合 sonar.test.inclusionssonar.test.exclusions:
    • 虽然sonar.tests本身不支持通配符来指定复杂的文件或目录模式,但你可以通过精确指定目录路径来覆盖你的需求。如果需要更复杂的文件过滤,请考虑使用其他配置属性(如 sonar.test.inclusionssonar.test.exclusions)来进一步细化测试文件的包含和排除规则。

通配符模式

  •  **/.css : 匹配任意目录(不限层级)路径下的以.css为结尾的文件
  • **/*Bean.java :  匹配任意目录(不限层级)路径下的以Bean.java为结尾的文件
  • **/*Bean?.java :  例如可以匹配 /org/sonar/util/HelloBean1.java,不匹配 /org/sonar/util/HelloBean.java
  • org/sonar/* :  匹配 org/sonar目录下的文件,比如org/sonar/MyClass.java, 不匹配org/sonar/util/MyClassUtil.java。
  • org/sonar/**/* : 匹配 /org/sonar下的任何目录(不限层级)下的文件。

覆盖率

Sonar的覆盖率统计并不是由Sonar直接生成的,而是依赖于项目中的覆盖率工具来生成覆盖率报告,然后Sonar收集这些报告进行展示和分析。

golang项目覆盖率示例

1、使用go test -coverprofile命令

Golang内置的测试框架提供了 -cover 选项,用于在执行测试时生成覆盖率报告。这是获取单测覆盖率最直接和常用的方法。

go test -coverpkg=./...  -coverprofile=cov.out -timeout=10s ./...
  • -coverpkg=./... :  指定覆盖率统计的packages范围,这里 ./... 表示当前目录及其所有子目录。
  • -coverprofile=cov.out : 指定覆盖率profile文件的输出地址。
  • -timeout=10s : 设置单个测试用例的超时时间,默认为10秒钟。

2、coverprofile文件

执行上述命令后,会得到 cov.out文件,内容示例如下:

mode: set

...

demo/standalone/standalone.go:28.68,33.2 1 1
demo/standalone/standalone.go:35.127,36.34 1 1
demo/standalone/standalone.go:36.34,38.3 1 1

...

.coverprofile文件的内容主要是文本格式,但它不是直接为人类阅读而设计的,而是被设计用于被工具(如go tool cover) 解析和处理。这个文件的基本结构说明如下:

1.文件头

  • 文件开头可能会包含一些元数据,比如生成时间戳、Go版本等,但这部分不是必须的,并且可能因Go版本而异。

2、模式信息

  • 某些版本的Go可能在文件中包含关于覆盖率收集模式的说明,比如是否使用了设置模式(set mode)等。

3、覆盖率数据

  • 文件的主体是覆盖率数据,这些数据以一系列行的形式出现,每行描述了一个源文件中的一个代码块的覆盖率情况。
  • 每行大致遵循以下格式(但请注意,具体格式可能会根据Go版本有所不同):
<文件名>:<开始行号>.<结束行号>,<语句数>,<被执行的语句数>,<块数>,<被执行的块数>

可以通过如下命令查看覆盖率报告

go tool cover -html cov.out -o cov.html

3、配置sonar能读取go的覆盖率报告

如果sonar扫描工具是读取的配置文件,需要在编辑项目配置文件sonar-project.properties,添加如下配置:

sonar.go.coverage.reportPaths=xx/xx/xx

如果用的命令行执行,添加-D"sonar.go.coverage.reportPaths参数,示例如下:

sonar-scanner.bat \
-D"sonar.projectKey=xxxxxx"  \
-D"sonar.host.url=xxxxxx"  \
-D"sonar.login=xxxxxx" \
-D"sonar.sources=." \
-D"sonar.exclusions=vendor/**/*" \
-D"sonar.test.inclusions=**/*_test.go,**/mock_*.go" \
-D"sonar.go.coverage.reportPaths=cov.out" \

4、查看报告

但执行sonar扫描后,在sonar的平台上,就能看到对应项目的覆盖率信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值