执行基于Xunit的测试,由Teamcity中的特征过滤

tra*_*max 5 msbuild teamcity xunit xunit.net

我正在将我的项目从NUnit移动到xUnit测试框架.我们正在通过MSBuild任务在TeamCity中执行测试.我想按类别排除测试.在NUnit和Teamcity中,这很简单.

我将如何在xUnit中进行此操作?

Msbuild目标如下所示:

  <Target Name="xUnitTests">
    <xunit Assembly="$(SolutionDir)\Tests\bin\Debug\MyApp.Tests.exe" />
  </Target>
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想Exclude="Category=database"<xunit>元素添加为元素,但这是无效的.

我很快查看了xUnit源代码,但没有找到msbuild runner的这个选项.

在msbuild runner中忽略特征测试的其他任何替代方法?

Sev*_*ate 5

我将通过简单的例子来扩展Josh Gallagher的答案.假设您有以下测试:

[Fact]
[Trait("Category", "Integration")]
public async Task Test_for_long_running_operation()
{
    var someClass = new SomeClass();
    int result =  await someClass.LongRunningOperationAsync()
    Assert.Equal(5, result);
}

[Fact]
[Trait("Category", "Unit")]
public void Test_for_quick_operation()
{
    var someClass = new SomeClass();
    int result =  someClass.GetSomeNumber()
    Assert.Equal(3, result);
}
Run Code Online (Sandbox Code Playgroud)

您可以在msbuild目标文件中包含以下内容:

<Target Name="xUnitTests">
    <!-- For debug builds: skipping long integration tests -->
    <xunit Condition="'$(Configuration)' == 'Debug'"
           ExcludeTraits="Category=Integration"
           Assembly="$(SolutionDir)\Tests\bin\Debug\MyApp.Tests.exe" />

    <!-- For release builds: run them all -->
    <xunit Condition="'$(Configuration)' == 'Release'"
           Assembly="$(SolutionDir)\Tests\bin\Debug\MyApp.Tests.exe" />
</Target>
Run Code Online (Sandbox Code Playgroud)


Jos*_*her 2

TraitAttribute在测试中使用Execmsbuild 文件中的任务以及带有/-trait "Category=database"参数的 xunit.console.clr4.exe 运行程序。

另一种方法是不使用 msbuild,而是在 TeamCity 中创建一个额外步骤,在其中直接运行 xunit 控制台。您可以在 xunit 项目文件中指定程序集。这是我用于 TeamCity 和 XUnit.net 的解决方案。我将 xunit 项目文件保存在解决方案项目文件夹中,并手动将测试程序集添加到其中。