MSBuild - 尝试运行 xUnit (.net) 测试

6
我正在尝试建立一个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[myusername]\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)任务类为“public”并实现Microsoft.Build.Framework.ITask接口。3)任务在项目文件中正确声明,或位于“C:\Windows\Microsoft.NET\Framework\v4.0.30319”目录中的*.tasks文件中。
但我已经检查了所有这些事情:
xunit.runner.msbuild.dll中的任务类为Xunit.Runner.MSBuild.xunit(类名中的xunit为小写)。
任务类继承自Task,它实现了ITask。
因此,可能在UsingTask中存在问题,但我不知道问题出在哪里。
(我也认为问题可能是xunit.runner.msbuild.dll针对.NET 2.0,并且我正在使用VS 2010,但我在.NET 2.0中重新创建了测试运行器项目,问题仍然存在。)
有人可以帮忙吗?
3个回答

2

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

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

MSBuildProjectDirectory 是一个保留属性,包含“项目文件所在目录的绝对路径”。

编辑:

尝试使用完整名称为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中执行此操作的能力是否被破坏了。 - Ryan Lundy
最终,我确定的是:TaskName 必须是任务类的 Namespace.ClassName;AssemblyFile 必须是程序集的绝对或相对路径;目标的 Name 不重要,除非它是 BeforeBuild 或 AfterBuild;Target 内部的 Tag 应该是任务的类名,但不包括命名空间。 - Ryan Lundy
但是即使这样,它仍然没有起作用;当我正确设置了xunit任务时,它会导致Visual Studio崩溃。所以我放弃了,并改为使用批处理命令运行xunit控制台。 - Ryan Lundy

0

如果我安装了Pex和Moles,我会得到完全相同的错误信息。在卸载它们后,一切都正常工作。


0

默认情况下,在“release”配置中构建将触发运行xunit测试。 如果您尝试在tfsbuild中禁用运行xunit测试,请传递以下构建参数。 这在运行单元测试作为单独步骤的新跨平台构建中非常有用。

/p:RunXunitTests=false

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