代码覆盖率是衡量程序源代码被特定测试套件测试的程度的指标。具有高代码覆盖率的程序经过了更全面的测试,并且比低代码覆盖率的程序含有更少的软件缺陷的可能性。OpenCover是一个用于.NET 2及以上版本的代码覆盖率工具,支持32位和64位进程,包括分支和序列点;它自豪地基于PartCover——
以下是一个简单的数学库,包含Add和Divide方法,用于演示如何测量代码覆盖率。
using System;
namespace DotNetThoughts.Net
{
public class Math
{
public int Add(int number1, int number2)
{
return number1 + number2;
}
public int Divide(int number1, int number2)
{
if (number2 <= 0)
{
throw new DivideByZeroException("Number2 is less or equal to zero");
}
return number1 / number2;
}
}
}
以下是库的project.json文件。
{
"version": "1.0.0-*",
"description": "",
"authors": [""],
"tags": [],
"projectUrl": "",
"licenseUrl": "",
"frameworks": {
"dnx451": {},
"dnxcore50": {
"dependencies": {
"System.Runtime": "4.0.21-beta-23225"
}
}
}
}
创建库后,可以执行dnu build命令来验证一切是否正常。完成后,可以编写单元测试文件。
using Xunit;
namespace DotNetThoughts.Net.Tests
{
public class MathTest
{
[Fact]
public void AddTest()
{
Math m = new Math();
Assert.Equal(4, m.Add(2, 2));
}
[Fact]
public void DivideTest()
{
Math m = new Math();
Assert.Equal(4, m.Divide(8, 2));
}
}
}
以下是单元测试项目的project.json文件。
{
"dependencies": {
"Math": "",
"xunit": "2.1.0-*",
"xunit.runner.dnx": "2.1.0-*"
},
"commands": {
"test": "xunit.runner.dnx"
},
"frameworks": {
"dnx451": {},
"dnxcore50": {}
}
}
需要在根目录中有一个global.json文件,用于解决依赖关系。
{
"projects": [
"src",
"test"
]
}
要获取代码覆盖率,需要OpenCover,可以通过Nuget安装,或者从以下链接下载并安装:。
现在可以使用OpenCover执行测试,可以使用以下命令(为了可读性,添加了换行符)。
C:\Users\[USERNAME]\AppData\Local\Apps\OpenCover\OpenCover.Console.exe -target:"C:\Users\[USERNAME]\.dnx\runtimes\dnx-clr-win-x64.1.0.0-beta8-15618\bin\dnx.exe" -targetargs:"–lib C:\ASPNET\UnitTestDemo\src\Math\bin\Debug\dnx451 test" -output:coverage.xml -register:user -filter:"+[*]* -[xunit*]*"
确保使用的是正确的dnx可执行文件(可以在C:\Users\[USERNAME]\.dnx\runtimes中获取确切的名称和位置),lib位置应指向dnu构建输出位置。一旦成功完成,将在控制台窗口中看到一些输出。
它还生成coverage.xml文件,可以使用report generator工具生成输出报告,该工具可以从以下链接下载:。
要生成报告,需要执行:
ReportGenerator.exe “-reports:C:\ASPNET\UnitTestDemo\test\UnitTestDemoTests\coverage.xml” “-targetdir:C:\ASPNET\Report”
一旦报告生成,打开报告目录中的index.htm文件。可以找到这样的摘要视图。