我正在使用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块中的清理代码。有人可以给我一些建议吗?

提前致谢。

最佳答案

如果您真的想在测试执行过程中处理和记录异常,则可以将该标准模板包装在辅助方法中,并使用如下所示的[*]。

但是,如果异常是测试用例的一部分,那么这是错误的方法,您应该使用测试框架提供的功能,例如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);
}

08-04 17:22