使用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();
}
但是这看起来很混乱,因为抛出的异常与断言无关,并且防止自定义异常,这些异常应该使测试失败,因为从任何其他抽象类继承是不确定的。
答案 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());