【问题标题】:Does AssertFailedException have any special treatment in unit-tests?AssertFailedException 在单元测试中有什么特殊处理吗?
【发布时间】:2016-06-18 21:08:28
【问题描述】:

我想知道AssertFailedException 有什么特别之处吗?

是否需要为失败的单元测试抛出它,还是可以抛出任何异常?

如果我抛出任何其他异常或者测试引擎会以任何不同的方式运行,会有什么问题吗?

我的意思是,AssertFailedException 的处理方式是否与其他异常不同?

【问题讨论】:

  • 非常好,不加评论就投反对票...

标签: c# visual-studio unit-testing exception


【解决方案1】:

好的,答案是肯定的。

我做了一些测试,发现AssertFailedException 的处理方式不同,而且非常邪恶。

AssertFailedException 隐藏了整个堆栈跟踪和来自内部异常的所有消息,并且只输出它自己的消息。我是否设置了内部异常并不重要。不会显示。

这是您看到的 strck 跟踪:

引发了“UnitTestDemo.MyException”类型的异常。在 UnitTestDemo.Foo(String bar) 在 C:[...]\Validations.cs:line 41 at UnitTestDemo.IsNullOrEmpty() 在 C:[...]\ValidationTests.cs:line 29

当你抛出一个带有内部异常的自定义异常时,你会得到这样的结果:

测试方法 UnitTestDemo.IsNullOrEmptyPasses 抛出异常: UnitTestDemo.ValidationException:类型异常 'UnitTestDemo.ValidationException' 被抛出,但没有被抛出 预期的。 ---> UnitTestDemo.ValidationException: 'bar' 必须为 null 或 空。

在 UnitTestDemo.Validation'1.Throw[TException](Func'2 getMessage) in C:[...]\ValidationHelper.cs:line 25 at UnitTestDemo.IsNullOrEmpty(ValidationContext'1 上下文,Func'2 getMessage) 在 C:[...]\Validations.cs:line 42 at UnitTestDemo.ValidationTests.c.b__2_0() 在 C:[...]\ValidationTests.cs:第 29 行 UnitTestDemo.DoesNotThrow(ValidationContext`1 context) 在 C:[...]\Validations.cs:line 36 --- 内部异常堆栈结束 痕迹 - - 在 C:[...]\Validations.cs:line 40 中的 UnitTestDemo.DoesNotThrow(ValidationContext'1 context) C:[...]\ValidationTests.cs:line 中的 UnitTestDemo.IsNullOrEmptyPasses() 29

您不仅可以看到来自测试的消息,还可以看到来自内部异常和完整堆栈跟踪的消息。

【讨论】:

  • @StevieV 这对你来说可能很有趣 ;-)
  • 这是一个比我更好的答案,是的,作为 MS 测试框架的用户,这对我来说非常有趣。我对此表示赞同,谢谢。
  • 只是,我不会说它很邪恶。当我为一件仪器/设备编写 API 时,我会告诉你我一直在哪里使用它。假设软件可以工作,但是由于设备中的一些怪癖,设备无法工作,因为 方式 我正在控制它(也许我发送了一些错误的命令)。假设我希望设备做出一些响应并得到不同的响应,我知道设备做了它认为应该做的事情,但是由于我自己的错误没有正确控制设备,它给了我错误的响应,我这样做@ 987654324@ 并承认公然失败。
  • @StevieV 我曾经使用 Assert.Fail() 的原因完全相同 ;-)
  • @StevieV 我在生产代码中使用我自己的Validation Extensions v2 (Code Review) 并替换了断言。
【解决方案2】:

我会说是的这种类型的异常是特殊的,只是它恰好是遇到以下代码时抛出的异常类型:

Assert.Fail();

不,这绝对不是必需的,但是每当我使用 MSTest 时,每当我需要公然向测试资源管理器表明我的测试失败时,这是我抛出的异常类型。

不,一切仍然有效。但是,请记住,每当您抛出异常时(至少在 Visual-Studio 的 MSTest 的情况下),您的测试确实会失败。实际上,这就是您测试代码可能存在的一些问题/错误的方式。有时,当我的测试失败时,是因为我的代码抛出了异常(并且失败了),这让我能够追踪并修复我的错误。

请参阅MSDN 上的文档。如您所见,这种类型的异常只是继承了普通的System.Exception,因此不能期望其行为与任何其他类型的异常有任何不同。

【讨论】:

  • 这听起来不错。我正在创建一些自定义验证/断言,我想将它们重用于其他目的,如果没有必要,我不想包含 Microsoft.VisualStudio.TestTools.UnitTesting 命名空间。我想也许 VS 在它的单元测试引擎的某个地方有一个 catch(AssertFailedException) 并且当它发生时会产生一些魔法。
  • @t3chb0t 很高兴听到。是的,当你抛出异常(并且在 Visual Studio 中使用 MSTest)时,你会得到一个测试失败。
  • 我看到你也被否决了,没有人发表评论。我真的很讨厌这样的人。
  • @t3chb0t 我很感谢你这么说。但是,我将不得不承认在不发表评论的情况下投反对票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多