在测试抛出的异常时,我应该测试多少异常?

时间:2012-03-01 21:54:21

标签: unit-testing exception testing exception-handling

这符合我对异常处理最佳实践的浅薄理解。

如果我正在为抛出异常的测试用例编写单元测试,我是否只关心抛出正确的异常类型,还是应该检查更多?具体做法是:

  1. 如果我调用一个方法并期望一个NullReferenceException,我应该检查那个异常并确保它来自我期望它来自哪里吗?

  2. 如果抛出异常,我是否应该立即不关心状态,或者对系统状态进行断言是否仍然有效?

  3. 如果我将null传递给一个方法,并且抛出了NullArgumentException,我是否关心抛出哪个参数,或者只抛出它被抛出?

  4. 我目前认为,一旦抛出异常,所有赌注都会在系统状态方面下降,并且深入挖掘异常是很糟糕的,因为此时你开始检查你的方法是如何实现的。

    感谢,
    标记

2 个答案:

答案 0 :(得分:4)

  

如果我正在为抛出异常的测试用例编写单元测试,我是否只关心抛出了正确的异常类型,还是应该检查更多?

如果您将测试视为推动您的应用程序设计的东西 - 您需要检查对于更多类客户端有意义的所有内容。

  

如果我调用一个方法并期望一个NullReferenceException,我应该检查那个异常并确保它来自我期望它来自哪里吗?

在测试中,您始终会检查是否在已知影响下获得了所需的结果。所以你调用方法,并捕获异常。你不应该关心它是什么以及如何抛出它 - 你被投掷的事实就好了。

  

如果抛出异常,我是否应该立即不关心状态,或者对系统状态进行断言是否仍然有效?

这取决于要求。如果你的app / library应该能够在异常处理后工作并且具有有效状态 - 你需要检查它。

  

如果我将null传递给一个方法,并且抛出了NullArgumentException,我是否关心抛出哪个参数,或者只抛出它被抛出?

假设您的图书馆为黑匣子。你传递了一些东西,你找回了一些东西。无论结果如何产生。是否产生了什么。

<强> UPD

正如@eschneider在评论中提到的那样 - 你还应该检查抛出的异常是否是正确的类型。

答案 1 :(得分:1)

  

如果我调用一个方法并期望一个NullReferenceException,我是否应该检查该异常并确保它来自我期望它来自哪里?

您从该测试中获得的代码知识是否重要?如果是 - 测试它。使用NRE可能就足够了(并且通常是)你知道它在某些条件下被抛出,这就是它的全部内容。

  

如果抛出异常,我是否应该立即关注状态,或者对系统状态进行断言是否仍然有效?

这完全取决于您的要求。如果在特殊情况下的状态需要以某种方式处理,那么你肯定应该为此编写测试。

  

如果我将null传递给一个方法,并且抛出了NullArgumentException,我是否关心抛出哪个参数,或者只抛出它被抛出?

考虑一下您的最终用户。他会关心什么论证引起了例外吗?你会关心吗?如果你的最终用户是程序员通过日志文件搜索可能的失败原因,那么我可以想象他会感谢你提供这些信息。它始终是“它对用户有什么价值吗?”的问题。。如果是(并且您想确保已提供该值) - 测试它。

  

我目前认为,一旦抛出异常,所有的赌注都会在系统状态方面下降,深入挖掘异常是很糟糕的,因为那时你开始检查你的方法已实施。

异常,因为名称表示意味着异常情况。所有投注都是关闭的,取决于 取决于您的应用程序在这些特殊情况下采取的措施。如果所有赌注都没有,我认为你的申请行为相同(以最简单的方式处理它并忘记它)。但是,如果您的代码想要做某事(如日志,最终用户的格式,重新抛出等),那么验证它确实是正确的异常,并在某些情况下抛出正确的消息定义明确的观点 - 所有这些都是有价值的,值得测试。