在 TeamCity 下运行时,我有一个项目在输出覆盖文件中没有给我任何覆盖。当我从命令行运行时,它覆盖得很好。显然,TeamCity 运行时使用的本地系统帐户存在一些权限问题,即,如果我将 TeamCity 运行器更改为使用我用来访问它所覆盖的机器的登录名之一。但是我不想在 TeamCity 服务中维护该用户的密码。
我在 nant 脚本中启动 OpenCover 时使用了 -register:user 参数,这没有帮助。
在 TeamCity 下运行时,推荐的设置是什么?
使用 regsvr32 手动预注册 OpenCover.Profiler.dll。但要执行此操作,您应该以管理员权限运行 cmd。
我最近使用 MSBuild 进行了设置,并且运行良好。以下是我的 MSBuild 脚本的相关部分:
<Project DefaultTargets="Build;Test;Archive;" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask AssemblyFile=
"..\..\tools\MSBuildCommunityTasks\MSBuild.Community.Tasks.dll"
TaskName="MSBuild.Community.Tasks.Xslt" />
<PropertyGroup>
<!--Default Configuration-->
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<!--Default Platform-->
<Platform Condition=" '$(Platform)' == '' ">"Any CPU"</Platform>
<!--Test assemblies-->
<TestAssemblies>HelloWorld.Mvc3UI.UnitTests\bin\$(Configuration)\HelloWorld.Mvc3UI.UnitTests.dll</TestAssemblies>
</PropertyGroup>
<Target Name="Build">
<MSBuild Targets="Clean;Rebuild" Projects="HelloWorld.sln" ContinueOnError="false"/>
</Target>
<Target Name="Test">
<!-- Check Code Coverage -->
<Exec Command="..\..\tools\OpenCover.4.0.519\OpenCover.Console.exe -register:user -target:..\..\tools\NUnit\nunit-console.exe -targetargs:"$(TestAssemblies) /xml=NUnitReport.xml /noshadow" -filter:"+[HelloWorld.Mvc3UI*]* -[HelloWorld.Mvc3UI.UnitTests*]*" -output:OpenCoverReport.xml"></Exec>
<!-- Format Code Coverage Report -->
<Exec Command="..\..\tools\ReportGenerator.1.5.0.0\ReportGenerator.exe OpenCoverReport.xml OpenCoverReport"></Exec>
<Xslt Inputs="NUnitReport.xml"
Xsl="..\..\tools\NUnit\NUnitReport.xsl"
Output="NUnitReport.html" />
</Target>
<Target Name="Archive">
<Exec Command="..\..\tools\7-Zip.9.20\7za.exe a build.zip "HelloWorld.Mvc3UI\*""></Exec>
</Target>
</Project>
关键是对 NUnit 使用 /noshadow 选项,对 OpenCover 使用 -register 开关(它需要 COM 注册才能运行,但此开关会临时注册 TeamCity 用户帐户)。
为了防止 OpenCover 有时挂起,它还有助于在 nunit-console.exe.config 文件中禁用 .NET 2.0 作为受支持的运行时,如下所述:
<startup useLegacyV2RuntimeActivationPolicy="true">
<!-- Comment out the next line to force use of .NET 4.0 -->
<!-- <supportedRuntime version="v2.0.50727" /> -->
<supportedRuntime version="v4.0.30319" />
</startup>