什么是最好的方法来避免尝试...抓住...终于......在我的单元测试中?

时间:2011-11-23 22:48:14

标签: unit-testing coding-style mstest

我正在使用Microsoft Test在VS 2010中编写许多单元测试。在每个测试类中,我有许多类似于下面的测试方法:

[TestMethod]
public void This_is_a_Test()
{
  try
  {
    // do some test here
    // assert
  }
  catch (Exception ex)
  {
    // test failed, log error message in my log file and make the test fail
  }
  finally
  {
    // do some cleanup with different parameters
  }
}

当每个测试方法看起来像这样时我觉得它很难看。但到目前为止,我还没有找到一个很好的解决方案来使我的测试代码更加干净,尤其是finally块中的清理代码。有人可以给我一些建议吗?

提前致谢。

3 个答案:

答案 0 :(得分:6)

如果你真的想在测试执行时处理和记录异常,你可以用辅助方法包装这个标准模板,并使用如下所示 [*]

但是如果异常是测试用例的一部分,那么这是错误的方法,你应该使用测试框架提供的工具,例如NUnit提供了这样的帮助来测试异常:

Assert.Throws<ExceptionType>(() => { ... code block... });
Assert.DoesNotThrow(() => { ... code block... });

要清理特殊方法属性,如[TestCleanup][TestInitialize],以便通过测试框架自动进行测试初始化​​和清理。

[*] 这个想法是将测试主体包装在委托中并传递给实际执行try / catch块中包含的测试执行的帮助器:

// helper
public void ExecuteTest(Action test)
{
  try
  {
     test.Invoke();
  }
  catch (Exception ex)
  {
    // test failed, log error message in my log file and make the test fail
  }
  finally
  {
    // do some cleanup with different parameters
  }
}

[TestMethod]
public void This_is_a_Test_1()
{
   Action test = () =>
   {
       // test case logic
       // asserts
   };

   this.ExecuteTest(test);
}

答案 1 :(得分:1)

清除所有try-catch-finally(尤其是catch不仅是不必要的,甚至是有害的,你不应该在测试时捕获异常)并在tearDown方法中进行清理(不过它是在MS Test中完成的,我会在那里假设会像[TearDownMethod]或[FixtureTearDown]之类的东西。)

答案 2 :(得分:0)