dotCover和xUnit在某些环境中不收集覆盖率统计信息

时间:2014-09-15 19:07:59

标签: xunit.net dotcover

我们正在使用dotCover 2.7和xUnit.net 1.9.2。

在我的机器(Windows 7)和同事的机器(Windows 8)上,我们可以从命令行对着使用xUnit.net的单元测试程序集运行dotCover并获得正确的覆盖率报告。

在我们的构建机器(Windows Server 2008 R2 Standard)上运行相同的东西时,dotCover报告的唯一代码覆盖率是单元测试程序集本身。

我们正在使用MSBuild任务运行xUnit.net。这是.msbuild文件中的相关部分。

<UsingTask TaskName="Xunit.Runner.MSBuild.xunit" AssemblyFile="$(PackagesDir)xunit.$(XunitVersion)\lib\net20\xunit.runner.msbuild.dll" />

<Target Name="XunitTests">
    <xunit Assembly="$(TrunkDir)src.UnitTests\Ipseity.Server.Events.UnitTests\bin\Debug\Ipseity.Server.Events.UnitTests.dll" />
</Target>

我们使用以下命令从命令行运行dotCover(在每个环境中使用相同的命令)。

  

“c:\ Program Files(x86)\ JetBrains \ dotCover \ v2.7 \ Bin \ dotCover.exe”analyze /TargetExecutable="c:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe “/ TargetArguments =”/ t:XunitTests ipseity.msbuild“/ TargetWorkingDir = c:\ tfs \ SI \ ipseity \ trunk \ build /Output=c:\temp\coverage.xml

在Windows 7和Windows 8计算机上,coverage.xml文件包含以下内容。

<Root CoveredStatements="1977" TotalStatements="7867" CoveragePercent="25" ReportType="Xml" DotCoverVersion="2.7.2.176">
    <Assembly Name="Ipseity.Server.Common" CoveredStatements="4" TotalStatements="339" CoveragePercent="1">
        ...
    </Assembly>
    <Assembly Name="Ipseity.Server.Events" CoveredStatements="691" TotalStatements="798" CoveragePercent="87">
        ...
    </Assembly>
    <Assembly Name="Ipseity.Server.Events.UnitTests" CoveredStatements="1240" TotalStatements="1251" CoveragePercent="99">
        ...
    </Assembly>
    <Assembly Name="ipseity.Server.MessageProcessing" CoveredStatements="42" TotalStatements="5479" CoveragePercent="1">
        ...
    </Assembly>
</Root>

但是在构建服务器(Windows Server 2008 R2 Standard)上,我们只会在覆盖率报告中显示单元测试程序集。

<Root CoveredStatements="1033" TotalStatements="1039" CoveragePercent="99" ReportType="Xml" DotCoverVersion="2.7.2.176">
    <Assembly Name="Ipseity.Server.Events.UnitTests" CoveredStatements="1033" TotalStatements="1039" CoveragePercent="99">
        ...
    </Assembly>
</Root>

此时我们感到困惑的是,为什么我们在构建服务器上获得的结果不同于我们的开发框,因此任何有关寻找其他内容的建议都将受到赞赏。

1 个答案:

答案 0 :(得分:4)

在其中一位DotCover开发人员的帮助下,我们终于找到了问题。

DotCover要求PDB文件在分析期间可用。默认情况下,MSBuild <xunit...>任务阴影将程序集复制到另一个文件夹以运行测试。这显然复制PDB文件,只复制程序集。

因此,为了解决这个问题,我们只需要关闭阴影复制。

原始MSBuild任务

<xunit Assembly="$(TrunkDir)\Ipseity.Server.Events.UnitTests.dll" />

修正了MSBuild任务

<xunit Assembly="$(TrunkDir)\Ipseity.Server.Events.UnitTests.dll" ShadowCopy="False" />