【问题标题】:Excluding unit tests only on specific platform仅在特定平台上排除单元测试
【发布时间】:2015-04-18 00:48:53
【问题描述】:

我的场景如下: 我正在使用 Xamarin.Forms 开发跨平台移动应用程序。该解决方案的一部分是针对 iOS/Android/WP8 的单元测试项目,并且在每个平台上执行的测试都在一个共享库中。

测试是使用 xUnit.Net 框架编写的。

现在我有一些测试在所有移动平台上都成功了,但在 Windows 上却没有(即,当我在开发期间从 VS 中运行它们时):

// in a PCL (which is referenced by platform-specific unit test projects)

[Fact]
public void SomeTest()
{
    // succeeds on iOS, Android, and WinPhone
    // fails on Windows (when executed from within Visual Studio)
}

我不想在开发过程中每次都从每个移动平台运行每个测试 - 这会非常耗时。当然,我只在更大的块中这样做。

结果是我有一堆在 VS 中失败的单元测试,我看不出这是一个“真正的”错误还是“只是”一个特定于平台的问题。相反,我想立即查看问题所在,而不是有几十个我必须单独检查的红色测试。

有人知道怎么做吗?

【问题讨论】:

  • FactAttribute.Skip 在 v1 中是 virtual(不确定这是否适用于 V2)。您可以使用它来创建FactWhenNotInVsOnWinAttribute(Google for FactWhen,您会在该空间中看到我 7 年前的一些疯狂想法)

标签: c# unit-testing cross-platform xamarin.forms xunit.net


【解决方案1】:

你不能用traits to achieve this吗?

即添加一个特征,指定不应在 Windows 上运行测试,然后您可以使用您正在使用的任何测试运行器在 Visual Studio 中仅执行不具有此特征的测试。

【讨论】:

  • 是的,这正是我想要的。结合相应的 R# 选项设置“类别”特征以排除此类别就可以了。非常感谢。
【解决方案2】:

如果您要为每个平台创建不同的构建(我确信您必须这样做),为什么不使用编译预处理器指令排除您不想运行的测试?

然后您可以在 VS 编译期间传入值 WINDOWS 并使用以下命令排除测试:

#if !WINDOWS

[Fact]
public void SomeTest()
{
    // succeeds on iOS, Android, and WinPhone
    // fails on Windows (when executed from within Visual Studio)
}

#endif

更多关于如何使用预处理器指令的信息在这里:MSDN: C# Preprocessor Directives

【讨论】:

  • 感谢您的回复。实际上,我不需要为每个平台构建不同的版本——至少并非总是如此。我可以在除 iOS 之外的所有平台上使用 Debug/Any CPU。事实上,我考虑了你的解决方案,它应该可以工作。但我想知道是否有更简单的方法......
  • 我不知道任何更简单的方法,除了可能为每个平台创建一个列表,但这也是一个维护麻烦 - 通过预处理器指令嵌入“它应该为 X 平台运行”在我的比为平台维护单独的列表更容易。
猜你喜欢
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多