SonarQube系列2、分析dotnet core/C#代码

【前言】

本系列主要讲述sonarqube的安装部署以及如何集成jenkins自动化分析.netcore项目。目录以下:html

  1. SonarQube系列1、Linux安装与部署
  2. SonarQube系列2、分析dotnet core/C#代码
  3. SonarQube系列3、Jenkins集成SonarQube(dotnetcore篇)

【实现功能】

  这篇文章将要介绍的主要内容以下:jquery

  1. sonarqube分析.netcore项目下的C#代码
  2. sonarqube生成单元测试报告(代码覆盖率)

【SonarQube分析C#代码】

1.sonarqube帐号token的生成

sonarqube支持生成用户token,以便在命令行或者脚本中使用token表明帐号操做sonarbue,避免形成帐号密码的泄露。web

点击sonarqube首页右上角头像,进入个人帐号api

而后进入安全tab页,随便输入个标识,点击生成,生成一个帐号专属的token安全

生成的token只会显示一次,且后续没法查询,所以先把他手动备份下来,后续会用到。架构

2.安装netcore分析器

分析netcore项目,微软和sonar一块儿协做作了不少工做,大大简化了咱们的工具使用,官网能够查看相关工具及命令:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-msbuild/app

咱们按照官方提示,找到 MSBuild .NET Core Global Tool ,直接安装dotnet全局工具工具

dotnet tool install --global dotnet-sonarscanner --version 4.3.1

安装完后,咱们把咱们的sonar的token注入到该命令的配置中,以便在执行命令时自动关联到对应帐户的sonar。post

在dotnet tool的安装目录下,找到一个叫 SonarQube.Analysis.xml 的配置文件。单元测试

个人xml在该目录下:/root/.dotnet/tools/.store/dotnet-sonarscanner/4.6.2/dotnet-sonarscanner/4.6.2/tools/netcoreapp2.1/any

而后咱们在对应节点将 sonarweb 的地址和 token 填写上便可。

固然若是不配置也是能够的,那么就须要每次执行命令时将token一块儿看成参数填写,确定是不如一次性配置好方便的。

3.开始分析代码

首先随便找个项目,这个就很少说了。有了代码之后而后进入代码目录,依次输入下面命令:

开始命令,下面命令已经备注了三个参数的用途

dotnet sonarscanner begin /k:这里填SonarQube将要生成的项目的惟一编码 /n:sonarqube中将要显示的项目名称 /v:当前执行活动号(能够动态递增或使用时间戳)

编译命令,build 后面的参数为 dotnet core 项目的 xxx.sln 文件的完整路径

dotnet build xxx.csproj

分析并将分析结果推送到sonarqube站点

dotnet sonarscanner end 

例如:

dotnet sonarscanner begin /k:SevenTiny.Bantina /n:SevenTiny.Bantina /v:11

dotnet build 20-Solution/SevenTiny.Bantina.sln

dotnet sonarscanner end 

通过一段时间之后,能够看到输入日志已经 push 到 sonarqube 站点成功,那么就能够去 sonarqube 站点查看结果了,项目会经过 api 自动建立。

上述步骤并不会有覆盖率,先忽略,咱们后面会继续讲解如何提供单元测试覆盖率。

咱们点击标题进入项目详情页:

这里主要报告了几个指标(sonar有默认标准,若是不达标会报警,例如顶端红色错误提示):

Bugs 漏洞:代码中的重大漏洞,可能影响到项目的正常运行,急需改正;

异味:可有可无的编码不规范问题,建议改正,通常不会影响功能,点开详细信心能够看到规范的使用案例,对规范本身的变成水平有至关大的帮助;

覆盖率:项目的单元测试状况;

重复:项目中的重复代码块,建议重构;

sonarqube 还提供了不少图表来展现多维度的代码分析状况。

【添加单元测试信息】

通过上述步骤并不能实现单元测试的结果展现,事实上,sonarqube 自己也办不到对单元测试的分析,一般的作法是将其余工具生成的单元测试结果整合到 sonarqube 中,借助 sonarqube 来更好地展现单元测试结果。

首先咱们的项目要有专门的单元测试项目,而且规范地使用 Assert 等单元测试语句对项目代码进行了单元测试。

1.使用 coverlet 分析单元测试覆盖率

在单元测试项目安装 coverlet.msbuild nuget包(单测项目,不是正式的项目),这种方式便于和dotnet test命令集成。这种方式下, 当它被启用后, 它会集成到dotnet test 这个命令架构里, 在测试运行后自动生成覆盖率报告.

2.经过 dotnet test 命令输出单元测试结果

dotnet test 是 dotnet 默认的集成工具,用于执行单元测试项目并输出测试结果。

执行命令

dotnet test xxxtest.csproj --logger:"trx;LogFileName=test.trx" /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:CoverletOutput='./TestResults/'

上述命令指定了某个测试项目,并输出测试结果为 test.trx 文件,同时输出单元测试覆盖率分析文件为 opencover 格式的文件。

也就是说,上述命令会生成两个文件,一个是单测的结果,一个是单测覆盖率的详情描述 xml 文件。

3.将单测文件集成到sonarqube

打开 sonarqube 的单个项目设置(不是全局设置)

而后找到对应语言的页签,固然咱们今天的语言是C#,找到单元测试覆盖率 opencover 的设置区域,用通配符 ** 去匹配生成的单测覆盖率文件。

还有单元测试报告文件设置

这样下次执行 dotnet sonarscanner 命令的时候,就会自动把单元测试的相关文件输出结果也推送到 sonarqube 中。

最后的结果也就是图中展现的那样,显示出了项目代码的单元测试覆盖率,甚至是本次有提交新代码的时候新代码的单元测试覆盖率,若是低于阈值(默认80%)则会出现上面的报警:

点进单元测试覆盖率详情页,咱们能够看到更加详细地对单元测试的描述,例如覆盖了多少行代码,漏掉了多少行代码:

点开具体的代码行还能够看到那些行有单元测试的覆盖,总之是很是详尽了...

【扩展】

SonarQube 如何排除不须要分析地代码文件?

有些时候,引入了不少第三方的库(尤为是web项目的jquery库),咱们并不须要对第三方引用的库进行分析(甚至会由于包含的杂七杂八的的各类语言脚本太多),那么咱们就要将无关的代码排除。

 打开单独项目的设置(非全局设置)

找到排除,能够采用通配符排除文件或文件夹,下面有通配符的使用介绍。

固然了也能够指定哪些文件是须要包含的,这样能够按需进行分析。

【总结】

使用 sonarqube 分析dotnet core/C#代码的所有过程已经完成了,下一章咱们会将过程当中的全部命令脚本化,使其便于集成CI/CD工具,也便于脚本通用化,方便地应用到多个项目中。

若有任何疑问,欢迎在评论区讨论~

相关文章
相关标签/搜索