【问题标题】:No Coverage for Moles Tests on x64 Windows Server 2003没有覆盖 x64 Windows Server 2003 上的 Moles 测试
【发布时间】:2011-10-27 04:34:08
【问题描述】:

由于某些原因,OpenCover 没有涵盖在 Windows Server 2003(64 位)上使用 moles 的测试。我提出了一个similar question,它在我的 32 位 Windows 7 机器上解决了这个问题,但由于某种原因,在 Windows Server 机器上设置环境变量并没有什么不同。

CLRMONITOR_EXTERNAL_PROFILERS: 1542C21D-80C3-45E6-A56C-A9C1E4BEB7B8

x64 分析器是否有不同的 CLSID?或者这可能是另一个问题?

重现步骤

在visual studio中新建一个项目,三种方法:

public int method1()
{
    return 1;
}

public int method2()
{
    return 2;
}

public int method3()
{
    return 3;
}

接下来像这样创建一个测试项目:

[TestMethod()]
public void method1Test()
{
    // Test without moles
    Program target = new Program();
    int expected = 1;
    int actual = target.method1();
    Assert.AreEqual(expected, actual);
}

[TestMethod()]
[HostType("Moles")]
public void method2Test()
{
    // Test using moles
    ConsoleApplication2.Moles.MProgram.AllInstances.method2 = (instance) => { return 3; };
    Program target = new Program();

    // method3 is only called in this test
    int check = target.method3();
    int actual = target.method2();
    Assert.AreEqual(3, actual);
    Assert.AreEqual(3, check);
}

为了编译上述代码,您需要通过右键单击 ConsoleApplication2 引用并选择“添加 Moles 程序集”来“添加 Moles 程序集”。

使用以下命令运行 OpenCover:

C:\Program Files\OpenCover>OpenCover.Console.exe 
-target:"C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe" 
-targetdir:"S:\Work\ConsoleApplication2"
-targetargs:"/testcontainer:\"TestProject1\bin\Debug\TestProject1.dll\""
-filter:"+[*]*"
-output:results.xml
-mergebyhash

64位机器等效:

C:\Program Files (x86)\OpenCover>OpenCover.Console.exe" 
-target:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe"
-targetdir:"S:\Work\ConsoleApplication2"
-targetargs:"/testcontainer:\"TestProject1\bin\Debug\TestProject1.dll\""
-filter:"+[*]*"
-output:results.xml
-mergebyhash

在 results.xml 文件上运行 ReportGenerator。

预期结果

如果成功(如在我的 32 位 Windows 7 机器上),报告应显示 method3 已覆盖(在 method2Test 中调用),如下所示:

但是在 64 位 Windows Server 上运行时,结果如下所示:

在这两种情况下,所有测试都通过了,但在 64 位 Windows Server 上使用 Moles 的测试没有获取覆盖信息。

我希望这可以更清楚地解释问题 - 如果您需要更多信息,请告诉我。

谢谢,杰克

【问题讨论】:

  • 最新版本的 OpenCover 32 和 64 共享同一个 CLSID - 32 和 64 版本都注册了吗?
  • 是的,他们都使用 regsvr32 进行了注册
  • 能否提供您用于同时启动 opencover 和 moles 的命令行以及其他有用的说明,以便我进行复制。
  • 我已将此添加到问题中 - 希望它可以帮助您重现问题。

标签: c# .net windows-server-2003 moles opencover


【解决方案1】:

我按照你的指示,使用时得到了你的结果

设置 CLRMONITOR_EXTERNAL_PROFILERS=1542C21D-80C3-45E6-A56C-A9C1E4BEB7B8

但是当我将其更改为时,我得到了所需的覆盖结果

设置 CLRMONITOR_EXTERNAL_PROFILERS={1542C21D-80C3-45E6-A56C-A9C1E4BEB7B8}

注意:使用大括号 - 这是表达 GUID 的常用方式

【讨论】:

  • 我已经尝试过但无济于事 - 我正在从 build.proj 文件运行构建,我在 <Exec Command='[my open cover command]' /> 之前添加了 <Exec Command='set CLRMONITOR_EXTERNAL_PROFILERS={1542C21D-80C3-45E6-A56C-A9C1E4BEB7B8}' /> 但这似乎没有有所作为。
  • 你在运行 nant 吗?如果是这样,您应该使用 setenv 任务为该进程和所有子进程设置环境变量。当您使用 exec 时,它会在子进程中运行该命令,并且不会被下一个子进程拾取;我是这样理解的。
  • 我正在运行 MSBuild,但我想必须有一个与 setenv 等效的版本。我会做一个实验然后回复你。
  • 如果没有您自己的自定义 msbuild 任务,我认为 msbuild 无法做到这一点。您能否改为调用一个执行 set 操作的命令文件 (.bat/.cmd),然后调用 opencover?
  • 听起来它可能会起作用......我刚刚在竹子构建配置中发现了一个系统环境变量框,所以如果我把它放在那里它可能会起作用。如果没有,我会尝试批处理文件方法。
猜你喜欢
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多