【问题标题】:MSBuild - trying to run xUnit (.net) testsMSBuild - 尝试运行 xUnit (.net) 测试
【发布时间】:2011-03-01 21:19:59
【问题描述】:

我正在尝试设置一个 C# 项目,该项目将在我构建时运行 xUnit 测试,以便我可以在持续集成中使用它们。我有一个常规项目,一个使用 xUnit 的类库测试项目,以及我的测试运行程序项目。从我读过的所有内容看来,我应该能够通过在测试运行程序项目中执行此操作来完成此操作:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Test"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  [auto-created project stuff]
  <UsingTask AssemblyFile="xunit.runner.msbuild.dll"
      TaskName="Xunit.Runner.MSBuild.xunit" />
  <Target Name="Test">
    <xunit Assembly="$(MSBuildProjectDirectory)\..\OnePageOneDb.Tests\bin\Debug\OnePageOneDb.Tests.dll" />
  </Target>
</Project>

当我在更改后构建解决方案(通常是编辑 .csproj 文件)时,我得到了这个:

“Xunit.Runner.MSBuild.xunit”任务 无法从程序集中加载 C:\Users[我的用户名]\Code\OnePageOneDb\OnePageOneDb.TestRunner\xunit.runner.msbuild.dll。 无法加载文件或程序集 'file:///C:\Users[myusername]\Code\OnePageOneDb\OnePageOneDb.TestRunner\xunit.runner.msbuild.dll' 或其依赖项之一。系统 找不到指定的文件。 确认 声明是正确的,即 程序集及其所有依赖项是 可用,并且该任务包含 实现的公共类 Microsoft.Build.Framework.ITask。

即使我将 xunit.runner.msbuild.dll 和 xunit.runner.utility.dll 添加到项目所指位置的项目中,我也会收到此消息。但是,如果我在没有任何更改的情况下再次构建,我会一直得到这个:

未找到“xunit”任务。查看 如下: 1.) 名称 项目文件中的任务是一样的 作为任务类的名称。 2.) 的 任务类是“公共的”并实现 Microsoft.Build.Framework.ITask 界面。 3.) 任务正确 在中声明 项目文件,或在 *.tasks 文件中 位于 "C:\Windows\Microsoft.NET\Framework\v4.0.30319" 目录。

但我已经检查了所有这些东西:

  1. xunit.runner.msbuild.dll 中的任务类为Xunit.Runner.MSBuild.xunit(类名中xunit 为小写)。
  2. 任务类继承自Task,后者实现了ITask。
  3. 所以也许 UsingTask 有问题,但我不知道是什么问题。

(我还认为问题可能是 xunit.runner.msbuild.dll 是针对 .NET 2.0 的,我使用的是 VS 2010,但我在 .NET 2.0 中重新创建了测试运行程序项目,问题仍然存在。 )

谁能帮忙?

【问题讨论】:

    标签: msbuild msbuild-task xunit


    【解决方案1】:

    您需要指定 xunit.runner.msbuild.dll 的正确路径。 首先,您可以设置完整路径并测试 xunit 是否可以按您的意愿工作。 但对于真实环境,您应该指定 dll 的相对路径。

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

    MSBuildProjectDirectory 是一个reserved property 并包含“项目文件所在目录的绝对路径”。

    编辑:

    尝试按全名使用目标Xunit.Runner.MSBuild.xunit

    <Target Name="Test">
        <Xunit.Runner.MSBuild.xunit Assembly="$(MSBuildProjectDirectory)\..\OnePageOneDb.Tests\bin\Debug\OnePageOneDb.Tests.dll" />
    </Target>
    

    【讨论】:

    • 我已经尝试使用 AssemblyFile 从项目目录本身、bin\Debug 目录或许多其他地方获取 DLL,我得到了相同的结果。我还尝试制作一个新的简单任务,该任务除了在构建期间记录一条消息之外什么都不做。我收到相同的“未找到任务”消息。我已经尝试过带命名空间和不带命名空间的 TaskName。我尝试过 AssemblyName 而不是 AssemblyFile。我尝试了一个到 AssemblyFile 的硬编码(C:[etc])路径。我开始怀疑这样做的能力是否在 VS 2010 中被破坏了。
    • 最后我确定的是:TaskName必须是任务类的Namespace.ClassName; AssemblyFile 必须是程序集的绝对或相对路径; Target 的 Name 无关紧要,除非它是 BeforeBuild 或 AfterBuild; Tag inside Target应该是任务的类名,但没有命名空间。
    • 但是尽管如此,它还是没有用;当我正确设置 xunit 任务时,它使 Visual Studio 崩溃。所以我放弃了,转而使用运行 xunit 控制台的批处理命令。
    【解决方案2】:

    如果我安装了 Pex 和 Moles,我会收到完全相同的错误消息。卸载后一切正常。

    【讨论】:

      【解决方案3】:

      默认情况下,在“发布”配置中构建会触发运行 xunit 测试。 如果您尝试在 tfsbuild 中禁用运行 xunit 测试,请传递以下构建参数。 这在运行单元测试是一个单独步骤的新跨平台构建中很有用。

      /p:RunXunitTests=false
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-18
        • 1970-01-01
        • 1970-01-01
        • 2012-05-21
        • 2011-04-04
        • 2017-07-29
        • 2015-11-20
        相关资源
        最近更新 更多