OpenCover不能在TeamCity下使用

4
当我在TeamCity下运行时,我的项目在输出覆盖率文件中没有任何覆盖范围。如果我从命令行运行,则可以完全覆盖。显然,在TeamCity运行时使用本地系统帐户存在某些权限问题,即如果我将TeamCity运行程序更改为使用我用于访问计算机的登录之一,则会提供覆盖范围。但是,我不想在TeamCity服务中维护该用户的密码。
在nant脚本中启动OpenCover时,我使用-register:user参数,但这并没有帮助解决问题。
在运行TeamCity时,建议采用哪种设置才能使覆盖率正常工作?

你尝试手动使用regsvr32预注册分析器了吗? - Pavel Bakshy
你能否把你的评论转成一个回答,它有效。我首先尝试了直接在DOS命令提示符下注册> regsvr32 OpenCover.Profiler.dll,但是出现了0x80070005错误。诀窍是以管理员身份打开DOS命令提示符,然后再次运行regsvr32,就完成了。之后,在TeamCity中启动构建,覆盖率显示出来了。 - Orn Kristjansson
2个回答

5

需要手动使用regsvr32注册OpenCover.Profiler.dll。但是要执行此操作,您需要以管理员权限运行cmd。


确实是这样 - 我首先尝试只是进入dos提示符并注册> regsvr32 OpenCover.Profiler.dll,但无法工作,给了我错误0x80070005。诀窍是以管理员身份打开dos命令提示符,然后再次运行regsvr32,就可以了。之后,我在TeamCity中启动了一个构建,覆盖率就出现了。 - Orn Kristjansson
我相信这在随OpenCover(zip,msi)一起提供的OpenCover文档中有记录。 - Shaun Wilde

4

最近我使用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:&quot;$(TestAssemblies) /xml=NUnitReport.xml /noshadow&quot; -filter:&quot;+[HelloWorld.Mvc3UI*]* -[HelloWorld.Mvc3UI.UnitTests*]*&quot; -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 &quot;HelloWorld.Mvc3UI\*&quot;"></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>

我正在使用Gallio运行器和MbUnit测试,@Pavel的答案对我有用。 - Orn Kristjansson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接