我应该在测试方法中使用try catch吗?


18

我正在做单元测试。

我正在尝试测试一个功能。

我从测试组件中调用它。但是,我想,如果远程功能不能处理异常,那么我的测试器组件也将获得异常。

那么我应该担心在测试器组件中出现异常吗?

谢谢。

编辑:

PS:

抛出错误是件好事,但仅对其他功能有用,直到最后一个选择才对最终用户有效!

天哪,我写了一个编程报价!


我是测试的新手,应该只测试该功能的行为。我认为这称为黑盒和白盒测试。哦,我记得。我在大学学习的!
维卡斯

您具体使用哪种语言和xUnit框架?在某些情况下,我会同意。
格雷格·K

我将MXUnitMockBox和ColdBox一起用于ColdFusion语言。
维卡斯

Answers:


23

简短答案:不。

不要在单元测试中捕获异常。您正在进行单元测试,以查找错误和引发异常的情况。

单元测试框架应以明智的方式处理异常。大多数(如果不是全部)xUnit框架都具有一种结构,可以预期要在被测系统中引发特定异常情况时使用的某些异常,并且如果引发了预期异常,则可以通过测试,但如果没有异常,则可以通过。


我认为高级测试框架可以很好地处理异常,即使我发现在Visual Studio中,我们也可以像您所说的“预期异常”一样对异常进行测试。因此,很高兴认识和分享。谢谢..
维卡斯

有时候,您想检查是否抛出了异常,因为好的测试不能只测试能正常工作的情况,还可以测试失败的情况。
deadalnix

1
您确实想捕获异常,因为您想测试异常发生的情况(尤其是您自己的异常)。如果您编写的代码在某些情况下会因异常而失败,则这些条件应成为测试套件的一部分,因此应进行测试。在那些测试下,应该捕获并分析那些异常。
jwenting 2011年

1
@Jwenting阅读第二段-单元测试框架可以捕获异常,如果引发某些异常,则允许测试通过,如果没有异常,则允许失败
mcottle 2011年

5

(与mcottle的答案相反)长答案:否...大多数时候

当您说期望测试引发特定异常时,您将知道该测试中的任何一行何时引发该特定异常。

这与知道被测方法会引发异常并不完全相同。

如果您的测试涉及设置对象或上下文(在测试内,而不是在框架的版本内SetUp),则最好将您实际要测试的单行包装在try / catch中,并可能需要一个帮助程序。

例如,

public static class AssertHelper {
    public delegate void Thunk();

    public static void DoesNotThrow<T>(Thunk thunk, string message = "")
        where T: Exception {
        try {
            thunk.Invoke();
        } catch(T) {
            Assert.Fail(message);
        }
    }
}

接着

[TestMethod]
public void assertHelperInAction() {
    // Random setup stuff here that's too annoying to put in my SetUp
    // method.
    AssertHelper.DoesNotThrow<IllegalArgumentException>(() =>
        {/* My random method under test */})
}

如果此测试失败,则说明我的测试方法引发了异常,而不是随机设置中的异常。

(您应该尝试避免使用随机的安装程序。有时,在测试中包含一些安装代码会更容易。)


好的例子!对于将“测试”阶段限制为精确测试,我会非常小心,但是我会记住这个技巧,当我无法找到一种方法来实现这一目标时(例如,在测试比赛条件时)并需要接近“测试”的“设置”才能达到条件)。
Ethel Evans,

1

通常,您应该只发布异常,测试框架将为您提供包含所有所需信息的漂亮报告。


但是在TDD方法中,我们应该遵循以下步骤:

  1. 编写测试
  2. 观看失败,并使错误可理解
  3. 更正密码
  4. 重构代码和测试

当您发出异常时,如果错误很明显,那就很好。但是有时例外是晦涩的,甚至是误导的。您怎么能在代码中使用它(对于以后忘记了的您,或者对于花费大量时间解决问题的团队成员而言)?所以我的策略是:“ 如果有必要清除故障,则需要捕获异常 ”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.