如何故意失败所有C#单元测试

ale*_*lex 4 c# unit-testing mstest

题:

我试图找出是否有办法在满足特定条件时失败所有C#单元测试.

背景:

我为一个对象设置了单元测试,该对象对其内部数据进行编码和解码.这是一个相当人为的例子:

[TestClass]
public class FooTests
{
    private Foo TestFoo { get; set; }

    [TestMethod]
    public void DataEncodingIsWorking()
    {
        // TestFoo.EncodeData() ...
    }

    [TestMethod]
    public void DataDecodingIsWorking()
    {
        // TestFoo.DecodeData() ...
    }

    public FooTests(dynamic[] data) {
        TestFoo = new Foo(data);
    }
}

public class Foo {

    public void EncodeData() {
        // encodes Foo's data
    }

    public void DecodeData() {
        // decodes Foo's encoded data
    }

    public Foo(dynamic[] data) {
        // feeds data to Foo
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是创建一个新的实例TestFoo在每一个[TestMethod](有点重复),我创建了一个全球性的TestFoo对象FooTests.如果TestFoo无法实例化,我希望失败所有FooTests单元测试(因为如果对象无法实例化,编码/解码将无法工作).

这不是最佳实践的问题,但我也很好奇这种方法是否可怕.我想另一种方法是设置一个额外的单元测试来查看是否TestFoo正确实例化.

Mic*_*kyD 7

如何故意失败所有C#单元测试


TL; DR:在您的ClassInit()实例化测试所需的任何对象并添加适当的Assert语句.如果任何条件失败,所有测试都将失败.


您可以添加一个在运行任何测试方法之前自动调用的方法,并使用该ClassInitialize属性对其进行修饰.

MSDN:

标识一种方法,该方法包含在测试类中的任何测试运行之前必须使用的代码,并分配要由测试类使用的资源.这个类不能被继承.

...和:

在负载测试中运行时,使用此属性标记的方法将运行一次,并且它执行的任何初始化操作都将应用于整个测试.如果需要对测试中的每个虚拟用户迭代执行一次初始化操作,请使用TestInitializeAttribute.

在下面的示例中,我们实例化一个新Foo对象,Assert而不是null.我们当然可以根据需要测试其他情况.

[ClassInitialize]
public void ClassInit(TestContext context)
{
    TestFoo = new Foo(dynamicDataFromContext);
    Assert.IsNotNull(TestFoo);
}
Run Code Online (Sandbox Code Playgroud)

如果您对数据驱动的测试感兴趣,那么您可能需要签出如何:创建数据驱动的单元测试

我认为CRice在这个页面上提出了一个很好的观点,Assert.Inconclusive()所以你也可以选择合并它.