sonarqube C# 单元测试覆盖率一栏总是0%解决办法
一、什么叫单元测试(unit testing)?
是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函 数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中 要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
C#中,一个方法,一个类,一个窗口的测试。即单元测试。
二、为什么要进行单元测试。
为了程序的正确性,尽早的发现程序的BUG,便于后期的开发及调试,维护。
三、谁做这一工作?
答案是:程序员自己,因为程序员才明白自己写的code,才知道要达到的效果。
四、什么时候做?
单元测试越早越好,早到什么程度?极限编程(Extreme Programming,或简称XP)讲究TDD,即测试驱动开发,先编写测试代码,再进行开发。在实际的工作中,可以不必过分强调先什么后什么,重要的是高效和感觉舒适。从经验来看,先编写产品函数的框架,然后编写测试函数,针对产品函数的功能编写测试用例,然后编写产品函数的代码,每写一个功能点都运行测试,随时补充测试用例。所谓先编写产品函数的框架,是指先编写函数空的实现,有返回值的直接返回一个合适值,编译通过后再编写测试代码,这时,函数名、参数表、返回类型都应该确定下来了,所编写的测试代码以后需修改的可能性比较小。
五、 C#项目测试DEMO, 本demo用VS2019写。
新建一个控制台应用。名称叫:UnitTestDemo


写一个待测试的方法。


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


引用UnitTestDemo



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


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


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


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

第二个测试失败了

在方法上面有一个清楚的提示。
六、 sonarqube集成单元测试
这里需要借助Opencover来生成单元测试覆盖报告文档
1. 安装Opencover

安装过程所有选项默认即可
2. 执行sonarqub 扫描
SonarScanner.MSBuild.exe begin /k:"UnitTestDemo"  /d:sonar.host.url="http://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项目

sonarqube C# 单元测试覆盖率一栏总是0%解决办法的更多相关文章
- Exception in thread "main" java.lang.UnsupportedClassVersionError: * : Unsupported major.minor version 52.0 解决办法
		Exception in thread "main" java.lang.UnsupportedClassVersionError: * : Unsupported major.m ... 
- 20190713_(转)IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决办法 (转)
		此文为转载; 原文链接地址: https://www.cnblogs.com/mrma/p/3529859.html ----------------------------------------- ... 
- IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决办法
		IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法 IIS上部署MVC网站,打开后500错误:处理程序“ExtensionlessUrl ... 
- IIS 10.0 无法安装 URL rewrite重写模块 2.0解决办法
		[问题描述]系统升级到Windows10后,IIS是10.0的,发现无法安装 URLRewrite重写模块 2.0. [解决办法]打开注册表编辑器,在HKEY_LOCAL_MACHINE\SOFTWA ... 
- Unsupported major.minor version 52.0解决办法
		一.错误现象:当改变了jdk版本时,在编译java时,会遇到Unsupported major.minor version错误.jdk版本和stanford parser对应关系 JDK版本和Java ... 
- Unsupported major.minor version 51.0解决办法(转)
		我使用的是Eclipse-jee-indigo + JDK 1.6.23环境,结果使用时出现Unsupported major.minor version 51.0错误提示,下面我来介绍Unsuppo ... 
- Unsupported major.minor version 51.0解决办法
		问题: 之前使用的是高版本的myeclipse2015ci,然后换成了myeclipse10.5,之前的workspace的内容没有改变,结果工程都出现了感叹号,运行时提示 Unsupported m ... 
- 未能加载文件或程序集EntityFramework, Version=6.0.0.0解决办法
		其他信息: 未能加载文件或程序集"EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934 ... 
- missing artifact com.oracle:ojdbc14:jar:10.2.0.2.0解决办法
		下载jar,导入到maven中 下载:http://download.csdn.net/detail/spring123tt/6991897 cmd中输入: mvn install:install-f ... 
随机推荐
- 物联网协议Coap协议介绍
			COAP协议简介 Coap(Constrained Application Protocol)是一种在物联网世界的类web协议,它的详细规范定义在 RFC 7252.COAP名字翻译来就是" ... 
- 解析一个body片断
			问题 假如你有一个HTML片断 (比如. 一个 div 包含一对 p 标签; 一个不完整的HTML文档) 想对它进行解析.这个HTML片断可以是用户提交的一条评论或在一个CMS页面中编辑body部分. ... 
- hystrix熔断机制修改配置
			0.注意 0.1.如果使用command 的 execute( )方法的话,其实在一个for循环,执行多次,其实每个的执行顺序并不是固定的,如果你想固定,需要使用queue circuit break ... 
- ProjectEuler 008题
			题目: The four adjacent digits in the 1000-digit number that have the greatest product are 9 9 8 9 = 5 ... 
- rabbitMq可靠性投递之手动ACK
			#手动应答#spring.rabbitmq.listener.simple.acknowledge-mode=manual#spring.rabbitmq.listener.simple.acknow ... 
- nginx《一安装》
			linux上nginx相关 wget https://nginx.org/download/nginx-1.14.1.tar.gz tar -zxvf nginx-1.14.1.tar.gz ./co ... 
- AbpVnext使用分布式IDistributedCache Redis缓存(自定义扩展方法)
			AbpVnext使用分布式IDistributedCache缓存from Redis(带自定义扩展方法) 我的依赖包的主要版本以及Redis依赖如下 1:添加依赖 <PackageReferen ... 
- Python之requests模块-cookie
			cookie并不陌生,与session一样,能够让http请求前后保持状态.与session不同之处,在于cookie数据仅保存于客户端.requests也提供了相应到方法去处理cookie. 在py ... 
- Python之pyyaml模块
			pyyaml模块在python中用于处理yaml格式数据,主要使用yaml.safe_dump().yaml.safe_load()函数将python值和yaml格式数据相互转换.当然也存在yaml. ... 
- ubuntu-常用设置备忘
			环境 系统平台:Ubuntu 16.04.6 其他版本设置也差不多 vim喜好设置 系统安装vim sudo apt-get install vim 通过修改 /etc/vim/vimrc 文件设置 ... 
