sonarqube C# 单元测试覆盖率一栏总是0%解决办法

一、什么叫单元测试(unit testing)?

是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函 数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中 要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
C#中,一个方法,一个类,一个窗口的测试。即单元测试。

二、为什么要进行单元测试。

为了程序的正确性,尽早的发现程序的BUG,便于后期的开发及调试,维护。

三、谁做这一工作?

答案是:程序员自己,因为程序员才明白自己写的code,才知道要达到的效果。

四、什么时候做?

单元测试越早越好,早到什么程度?极限编程(Extreme Programming,或简称XP)讲究TDD,即测试驱动开发,先编写测试代码,再进行开发。在实际的工作中,可以不必过分强调先什么后什么,重要的是高效和感觉舒适。从经验来看,先编写产品函数的框架,然后编写测试函数,针对产品函数的功能编写测试用例,然后编写产品函数的代码,每写一个功能点都运行测试,随时补充测试用例。所谓先编写产品函数的框架,是指先编写函数空的实现,有返回值的直接返回一个合适值,编译通过后再编写测试代码,这时,函数名、参数表、返回类型都应该确定下来了,所编写的测试代码以后需修改的可能性比较小。

五、 C#项目测试DEMO, 本demo用VS2019写。

新建一个控制台应用。名称叫:UnitTestDemo

image

image

写一个待测试的方法。

image

image

新建一个单元测试项目。名称叫:UnitTestDemoTest

image

image

引用UnitTestDemo

image
image
image

编写测试方法

修改类名,及方法名。UnitTest1重命名为ProgramTest,方法名:TestMethod1改为:AddTest。
这里说明一下,方法面上面的特性:[TestMethod]这是必须的。告诉编译器这是一个测试法式。
写代码。调用要测试的方法。
image

image

打开“测试资源管理器”,在“测试”->窗口->测试资源管理器

image
image

如果未通过。是个红色的X,我们现在再写一个未通过的方法。
注意方法的特性一定要加[TestMethod],再去运行测试。
image

image

回到主项目。看方法提示行。上面有标测测试通过。

image

第二个测试失败了
image

在方法上面有一个清楚的提示。

六、 sonarqube集成单元测试

这里需要借助Opencover来生成单元测试覆盖报告文档

1. 安装Opencover

下载地址://phoenixnap.dl.sourceforge.net/project/opencover.mirror/4.7.1221/opencover.4.7.1221.msi
image

安装过程所有选项默认即可

2. 执行sonarqub 扫描

SonarScanner.MSBuild.exe begin /k:"UnitTestDemo"  /d:sonar.host.url="//192.168.101.76:9000" /d:sonar.login="8ad34045e7e978ca678e184c397a76a62114f9ed" /d:sonar.cs.opencover.reportsPaths="%CD%\testcover.xml"

MSBuild.exe /t:Rebuild

"C:\Users\sunpengfei\AppData\Local\Apps\OpenCover\OpenCover.Console.exe" -output:"%CD%\testcover.xml" -register:user -target:"C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" -targetargs:"%CD%\UnitTestDemoTest\bin\Debug\UnitTestDemoTest.dll"

#注意替换相关exe 文件路径OpenCover.Console.exe是前面安装的 ,其他的是vs 2019自带程序,#UnitTestDemoTest.dll是测试项目生成

SonarScanner.MSBuild.exe end /d:sonar.login="8ad34045e7e978ca678e184c397a76a62114f9ed"

Begin 和end是固定格式,这里begin部分多了一个/d选项,/d为dynamic properties 动态属性.通过动态属性指定单元测试报告的位置.%CD%即为当前目录
第二段 msbuild.exe执行构建.
第三段 这里是生成单元测试覆盖率报告的关键. 首先指定Opencover所在位置,-register user 为注册当前windows用户以使其有权限执行.-output 指定覆盖率文件输出位置,这里必须和上面的 sonar.cs.opencover.reportsPaths保持一致. -target为要指定的单元测试runner,这里使用的是visual studio自带的vstest.console.exe targetargs指定要进行单元测试的目标dll.

3. 扫描结果

执行完成以后,我们再打开sonarqube web管理界面就会看到刚刚生成的mytest项目
image

Tags: