SonarQube系列二、分析dotnet core/C#代码
【前言】
本系列主要讲述sonarqube的安装部署以及如何集成jenkins自动化分析.netcore项目。目录如下:
- SonarQube系列一、Linux安装与部署
 - SonarQube系列二、分析dotnet core/C#代码
 - SonarQube系列三、Jenkins集成SonarQube(dotnetcore篇)
 
【实现功能】
这篇文章将要介绍的主要内容如下:
- sonarqube分析.netcore项目下的C#代码
 - sonarqube生成单元测试报告(代码覆盖率)
 
【SonarQube分析C#代码】
1.sonarqube账号token的生成
sonarqube支持生成用户token,以便在命令行或者脚本中使用token代表账号操作sonarbue,避免造成账号密码的泄露。
点击sonarqube首页右上角头像,进入我的账号

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

生成的token只会显示一次,且后续无法查询,因此先把他手动备份下来,后续会用到。
2.安装netcore分析器
分析netcore项目,微软和sonar一起协作做了很多工作,大大简化了我们的工具使用,官网可以查看相关工具及命令:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-msbuild/
我们按照官方提示,找到 MSBuild .NET Core Global Tool ,直接安装dotnet全局工具
dotnet tool install --global dotnet-sonarscanner --version 4.3.
安装完后,我们把我们的sonar的token注入到该命令的配置中,以便在执行命令时自动关联到对应账户的sonar。
在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: dotnet build -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工具,也便于脚本通用化,方便地应用到多个项目中。
如有任何疑问,欢迎在评论区讨论~
SonarQube系列二、分析dotnet core/C#代码的更多相关文章
- 使用 SonarQube 来分析 .NET Core 项目代码问题
		
0.介绍 Sonar 是一款开源的代码分析工具,可能有很多人已经用过,本篇文章主要是讲解如何在 Docker 里面安装 Sonar 并且用其来分析 .Net Core 项目. Sonar 是一个用于代 ...
 - 《ASP.NET Core In Action》读书笔记系列二 ASP.NET Core 能用于什么样的应用,什么时候选择ASP.NET Core
		
ASP.NET Core 能用于什么样的应用 ASP.NET Core 可以用作传统的web服务.RESTful服务.远程过程调用(RPC)服务.微服务,这归功于它的跨平台支持和轻量级设计.如下图所示 ...
 - WebChart网页局域网聊天系列(二):服务器结构及核心代码
		
public partial class MainForm : Form { private Socket server;//服务器Socket private int userNum;//当前在线用 ...
 - SonarQube系列一、Linux安装与部署
		
[前言] 随着项目团队规模日益壮大,项目代码量也越来越多.且不说团队成员编码水平层次不齐,即便是老手,也难免因为代码量的增加和任务的繁重而忽略代码的质量,最终的问题便是bug的增多和代码债务的堆积.因 ...
 - SonarQube系列三、Jenkins集成SonarQube(dotnetcore篇)
		
[前言] 本系列主要讲述sonarqube的安装部署以及如何集成jenkins自动化分析.netcore项目.目录如下: SonarQube系列一.Linux安装与部署 SonarQube系列二.分析 ...
 - 好代码是管出来的——浅谈.Net Core的代码管理方法与落地(更新中...)
		
软件开发的目的是在规定成本和时间前提下,开发出具有适用性.有效性.可修改性.可靠性.可理解性.可维护性.可重用性.可移植性.可追踪性.可互操作性和满足用户需求的软件产品. 而对于整个开发过程来说,开发 ...
 - 机器学习之决策树二-C4.5原理与代码实现
		
决策树之系列二—C4.5原理与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/9435712.html I ...
 - dotnet Core 2.0学习笔记(一)
		
一:Dotnet Core Windows运行环境,标红部分要注意 https://docs.microsoft.com/en-us/dotnet/core/windows-prerequisites ...
 - spring cloud+dotnet core搭建微服务架构:服务发现(二)
		
前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...
 
随机推荐
- Flutter学习笔记(6)--Dart异常处理
			
如需转载,请注明出处:Flutter学习笔记(6)--Dart异常处理 异常是表示发生了意外的错误,如果没有捕获异常,引发异常的隔离程序将被挂起,并且程序将被终止: Dart代码可以抛出并捕获异常,但 ...
 - solidity智能合约如何判断地址为0或空
			
智能合约地址判断 在旧版本中可使用以下代码来进行比较: owner != 0x0 但如果在新版本中使用,则会提示错误信息. 那么,如何正确使用来比较地址是否为空呢. 解决方案 可以使用address( ...
 - bash 遍历目录
			
bash遍历目录脚本traverse.sh: #!/bin/bash datadir=$ declare -a dirlist dirlist=`>/dev/null` for i in ${d ...
 - py+selenium IE 用driver.close()却把两个窗口都关了【已解决】
			
环境:py3 selenium unittest 测试浏览器:IE10 目标:在单个文件中,有多个用例,执行完A用例,由于打开了新的窗口,必须关闭新的窗口,才不会影响下一条用例的执行. 问题:按例 ...
 - Excel催化剂开源第51波-Excel催化剂遍历单元格操作性能保障
			
在Excel催化剂推出的这一年多时间里,经常性听到一种声音,大概意思是真正会写代码的人,都不会看上Excel催化剂写出来的功能,自己造一个更舒服贴心,仿佛会一点VBA就可以天下无敌一般,也好像Exce ...
 - classpath和classpath*区别
			
classpath和classpath*区别: classpath:只会到你的class路径中查找找文件. classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找. ...
 - sql注入篇1
			
一.前言 学习了感觉很久的渗透,总结一下sql注入,系统整理一下sql注入思路. 二.关于sql注入 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到 ...
 - compute节点上开启服务openstack-nova-compute.service时,无法启动的解决方法
			
本文前一部分为本人解决问题的过程,但最终没有解决:无奈在网上找方法时,看到有网友评论说:修改controller上的guest账号密码,再重启openstack-nova-compute. ...
 - Visual Studio 调试系列1 Debug 与 Release 模式
			
系列目录 [已更新最新开发文章,点击查看详细] Debug 模式 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序. 在Debug模式下调试,可以在断点处看到 ...
 - Aspnet Mvc 前后端分离项目手记(四)vue项目的搭建(一)(iview)
			
一项目创建 1,搭建vue-cli脚手架(依赖npm) 没有安装npm的同学,请先使用npm install -g vue-cli ,然后再进行这一步 安装的过程中有几项 ? Project name ...