Unit testing 什么';这是避免尝试…抓住…最后。。。在我的单元测试中?

Unit testing 什么';这是避免尝试…抓住…最后。。。在我的单元测试中?,unit-testing,coding-style,mstest,Unit Testing,Coding Style,Mstest,我在VS2010中使用Microsoft Test编写了许多单元测试。在每个测试类别中,我有许多类似于以下的测试方法: [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

我在VS2010中使用Microsoft Test编写了许多单元测试。在每个测试类别中,我有许多类似于以下的测试方法:

[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块中的清理代码。这里有人能给我一些建议吗


提前感谢。

您是否考虑过在测试方法上使用ExpectedException属性?

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

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

Assert.Throws(()=>{…代码块…});
Assert.DoesNotThrow(()=>{…代码块…});
执行清理的特殊方法属性,如
[TestCleanup]
[TestInitialize]
通过测试框架自动执行测试初始化和清理

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

//助手
public void ExecuteTest(操作测试)
{
尝试
{
test.Invoke();
}
捕获(例外情况除外)
{
//测试失败,在我的日志文件中记录错误消息并使测试失败
}
最后
{
//使用不同的参数进行清理
}
}
[测试方法]
公共无效此\u为\u测试\u 1()
{
动作测试=()=>
{
//测试用例逻辑
//断言
};
这个.ExecuteTest(test);
}

最终清除所有try-catch(特别是catch不仅不必要,甚至有害,测试时不应捕获异常),并在tearDown方法中进行清理(但是在MS-Test中进行清理,我认为会有类似于[tearDown方法]或[FixtureTearDown]之类的东西).

我需要最后一个block来进行清理,至少因为每个测试方法都有不同的东西需要清理。如果是这样的话,是的。如果你需要清洁的话。测试是分开运行的。如果你聪明地把它们分成固定装置,在那里你可以进行普通的安装和清洁,你很少需要这种模式。我根据我的经验告诉你。你能给我举个例子说明你需要清洁什么吗?(我希望您理解,异常不是设计用来捕获的,而是手工记录的,但它们被设计用来让测试运行人员捕获它们,并查看它是失败还是错误,因此
catch
部分实际上与单元测试的本意背道而驰)。在catch block中,我希望将错误消息记录在我定义的中心位置以供查看。在最后一块中,我需要清理数据库中一些动态生成的数据。对于某些测试方法来说,只有很少的数据是通用的。这种方式进行的日志记录在原则上是不好的。您的测试应该规划一个场景并测试其功能(驱动您创建功能代码)。若将日志记录放在那个里,那个么就违反了应用于测试运行的“从表示分离域”。您应该使用命令行测试运行程序,或者设计一些与现有运行程序的挂钩(这肯定是有可能的),并保持测试不受非测试代码的影响。至于数据库,是否可以在设置中启动事务并在拆卸中回滚(这对于所有测试和工作来说都是非常常见的,而且更加健壮)?谢谢你的回答,我将尝试一下解决方案。