一、什么叫单元测试(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%解决办法的更多相关文章

  1. Exception in thread "main" java.lang.UnsupportedClassVersionError: * : Unsupported major.minor version 52.0 解决办法

    Exception in thread "main" java.lang.UnsupportedClassVersionError: * : Unsupported major.m ...

  2. 20190713_(转)IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决办法 (转)

    此文为转载; 原文链接地址: https://www.cnblogs.com/mrma/p/3529859.html ----------------------------------------- ...

  3. IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决办法

    IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法 IIS上部署MVC网站,打开后500错误:处理程序“ExtensionlessUrl ...

  4. IIS 10.0 无法安装 URL rewrite重写模块 2.0解决办法

    [问题描述]系统升级到Windows10后,IIS是10.0的,发现无法安装 URLRewrite重写模块 2.0. [解决办法]打开注册表编辑器,在HKEY_LOCAL_MACHINE\SOFTWA ...

  5. Unsupported major.minor version 52.0解决办法

    一.错误现象:当改变了jdk版本时,在编译java时,会遇到Unsupported major.minor version错误.jdk版本和stanford parser对应关系 JDK版本和Java ...

  6. Unsupported major.minor version 51.0解决办法(转)

    我使用的是Eclipse-jee-indigo + JDK 1.6.23环境,结果使用时出现Unsupported major.minor version 51.0错误提示,下面我来介绍Unsuppo ...

  7. Unsupported major.minor version 51.0解决办法

    问题: 之前使用的是高版本的myeclipse2015ci,然后换成了myeclipse10.5,之前的workspace的内容没有改变,结果工程都出现了感叹号,运行时提示 Unsupported m ...

  8. 未能加载文件或程序集EntityFramework, Version=6.0.0.0解决办法

    其他信息: 未能加载文件或程序集"EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934 ...

  9. 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 ...

随机推荐

  1. 菜鸟攻略–C语言多文件编程初探(二):使用 gcc 手动编译多文件 C 程序

    step1:下载安装 Dev-C++ 已经安装了 Dev-C++ 或系统中的可以跳过这步.去官网下载 Dev-C++.我昨天下载,发现有点慢,所以我把安装文件放到百度网盘了,供大家下载,下载链接为:h ...

  2. 在Spring中使用静态工厂时发生的无法得到对象的问题

    因为我测试时,使用的是之前的包Spring 3.x一类的jar包,发现我的代码毫无问题,但是就是运行不出来,后面去Spring官网上发现,JDK6+至少都要使用Spring4.x了,而为了配合JDK8 ...

  3. mysql基础操作(三):数据约束

    首先创建一个数据库 create database homework default character set utf8; use homework; 1.1 默认值约束(default) -- 数 ...

  4. FXGL游戏开发-JavaFX游戏框架

    FXGL 是一个JavaFX 游戏开发的框架,这个框架有两个版本,其中基于JDK1.8的版本已经不再维护,目前最新的是基于JDK11的版本,也就是Openjfx的版本. FXGL 提供了各种游戏范例: ...

  5. centos6.10下安装mysql8.0.16root密码修改的坑

    上图截取别人的自己懒得弄,检查自己的linux是否有安装就按上图做就行了 接下来是我的干货 mysql8.0安群策略对密码设置很严格规则:大小写加数字和特殊字符串 使用yum安装mysql 后 my. ...

  6. vue3.0入门(五):vite构建vue项目

    使用vite构建项目步骤 安装node,cmd输入:node -v验证是否安装成功:一般node安装后会自动安装npm,cmd输入:npm -v验证是否安装成功 选择一个文件夹作为项目文件夹,搜索框输 ...

  7. 786. 第k个数

    题目传送门 一.理解感悟 1.这是快速排序模板的练习题. 2.不一样的地方在于它可以利用快排模板,但却不需要真的把所有数据排序完成,每次一分为二后,只关心自己所有的那一半,就是可以节约一半的递归. 3 ...

  8. 存储系统管理(一)——Linux系统的设备和分区管理

    1.设备名称的理解 /dev/sda1? sata硬盘,a1表示第一块硬盘中的第一个分区 /dev/cdrom 光驱 /dev/mapper/*? 系统中的虚拟设备 2.发现系统中的设备 ? fdis ...

  9. uniapp 获取用户手机号

    参考资料: 微信小程序官方文档 uniapp开发微信小程序获取用户手机号 页面增加一个按钮 <button open-type="getPhoneNumber" @getph ...

  10. DOM对象入门

    1.概念 2.script最好是放在后面,等html的文档内容加载完毕,不然获取不到 3.事件基本操作 第一种绑定事件html和js耦合度高,用第二种 4.灯开关事件使用