实现一个自定义异常,使单元测试失败

时间:2015-06-24 19:48:52

标签: c# visual-studio unit-testing

使用Visual Studio中内置的测试工具(在我的案例VS 2013中,虽然我相信这也延伸到其他版本),但是'TestMethod'(任何标有[TestMethod]属性的方法)都可能导致运行后的3种状态中的1种:

  • 传递
  • 跳过/非决定性
  • 失败

如果测试运行完成且没有未捕获的异常,则传递测试。测试失败,它会引发未捕获的异常。如果测试引发了一种特殊类型的未捕获异常,则该测试是不确定的:AssertInconclusiveException

我的问题是,是否有可能(例如,[TestCleanup]方法)处理与AssertInconclusiveException类似的自定义未捕获异常,并将测试状态设置为“不确定”而不是“失败” “?或者是将AssertInconclusiveException识别为Visual Studio本身内置的特殊异常?我正在寻找的粗糙伪代码大致是:

[TestCleanup]
public void TestCleanup()
{
    if(this.TestContext.CurrentTestOutcome == UnitTestOutcome.Failed 
        && this.TestContext.UncaughtException.GetType() == typeof(MyCustomException))
    {
        this.TestContext.CurrentTestOutcome = UnitTestOutcome.Inconclusive;
    }
}

这将用作集成测试套件的一部分,以便在测试的设置方法抛出特殊SetupFailureException时(通常表示下游系统不是被测试的下行系统)将测试标记为不确定

通过定义:

,我已经能够在过渡期间产生所需的行为
public class SetupFailedException : AssertInconclusiveException
{
}

// example test that demonstrates desired behavior
[TestMethod]
public void TestThatFailsAsInconclusiveByThrowingUncaughtSpecialException()
{
    throw new SetupFailedException();
}

但是这看起来很混乱,因为抛出的异常与断言无关,并且防止自定义异常,这些异常应该使测试失败,因为从任何其他抽象类继承是不确定的。

1 个答案:

答案 0 :(得分:0)

不确定性的认可是内置于测试框架中的,当您进行清理时,将故障更改为不确定的为时已晚。

感觉你应该真正从集成测试中捕获异常,因为这表明你正在识别你的测试可以抛出某种类型的异常的方法,并且正确的做法是忽略导致那种情况。

如果您需要有多个可以像这样检测到的异常,我很想让它们实现一个接口,这样catch块就可以检查捕获的异常是否实现了该接口。

如果您希望最小化对其余测试代码的影响/可见性,那么您可以包含可能在操作中失败的调用,在这种情况下,您的代码可能如下所示:

界面:

public interface ISomeNonCriticalException {
}

来电者代码:

public void CallPossiblyInconclusiveMethod(Action something) {
    try {
        something();
    }
    catch (Exception ex) {
        if (ex is ISomeNonCriticalException) Assert.Inconclusive();
        else throw;
    }
}

在你的测试中:

CallPossiblyInconclusiveMethod(()=>SomeMethodThatMightFail());