如何设置一个单元测试,如果另一个单元测试失败,则跳过该单元测试?

Ged*_*dde 5 c# unit-testing xunit.net

xUnit.net中是否有一种方法可以使单元测试依赖于另一个单元测试,以便在另一个测试失败时将其跳过

注意:这不是关于测试之间共享夹具或使测试彼此耦合等问题。我避免了这一点。

Given:     Unit tests OuterTest and InnerTest
Condition: If OuterTest is dependent on InnerTest and InnerTest fails
Result:    OuterTest is skipped (ideally with an explanation)
Run Code Online (Sandbox Code Playgroud)

基本原理

这是单元测试序列化的一部分,但是我也可以想到其他用例。我有一个外部类型,它具有内部类型的依赖关系,其中内部被序列化为外部序列化的一部分。我有一个针对内部类型的序列化单元测试,如果失败了,我知道对外部的序列化单元测试将由于嵌套而失败。

类型看起来像这样:

[Serializable]
class Inner {}

[Serializable]
class Outer {

    public Outer(Inner inner) {
        Inner = inner;
    }

    [Serializable]
    Inner Inner { get; }
}
Run Code Online (Sandbox Code Playgroud)
  • 我真的不想在外部的单元测试中使用内部的Stub,因为这迫使我引入内部的接口并弄乱了仅需要这些类型的单个具体实现的层次结构。这也迫使我为存根创建自定义序列化程序,这听起来比好处多麻烦。

  • 鉴于很难为内部类创建存根,以下是我的论点:我不希望两个测试都失败,因为这很难找到失败的根本原因。我认为最好跳过外部测试并给出相关性失败的警告。

问题

搜索一段时间后,我没有找到有关此用例的任何信息,因此我有以下问题:

  1. 是否可以基于xUnit.net中其他单元测试的结果来创建有条件地运行的测试?
  2. 这是一个不好的请求,还是某种代码的味道,如果是,为什么?

kri*_*gar -2

你不想那样做。如果您的某些东西破坏了多个测试,那么您希望您的测试能够展示一个问题影响整个系统的所有方式。

在您的情况下,您应该做的是通过序列化您的类来运行两股测试Outer。一是使用存在的对象,二是使用类的模拟Inner

有一个强有力的论点认为,没有模拟Inner类的情况可以被视为“集成”测试,但是,因为它只是使用存在的对象,所以我认为这有点灰色区域。

通过查看单元测试的结果来了解Outer由于无法序列化而无法序列化的测试仍然是非常重要的。Inner