2011-01-13 78 views
3

如果在逻辑测试失败时使用Assert(...),则单元测试将中止,并且未运行其余单元测试。有没有办法让逻辑测试失败,但只提供一个警告或什么,仍然运行其余的单元测试?C#单元测试警告而不是失败

背景下的一个例子是我有产生了一些学生,教师和课程,建立关系的测试,然后将它们放入一个数据库。然后,一些SSIS包在此数据库上运行,该数据库将现有数据转换为另一个数据库中的另一个数据库模式。然后测试需要检查新的数据库中的某些东西,如正确的行数,动作等。

显然其他测试是删除和mods,但它们都遵循相同的结构 - 在源数据库中创建数据,运行SSIS包,验证目标数据库中的数据。

+1

你能解释一下你的情况吗?这听起来像你可能正在做一些我可能会建议的事情。 – NerdFury 2011-01-13 05:24:25

回答

9

这听起来像你试图在单个测试中测试太多东西。

如果条件不能满足,则可能测试的其余部分也不会通过。只要我知道事情不符合我的期望,我宁愿结束测试。

单元测试的概念是红色失败,绿色通行证。我知道MSTest也允许黄色,但它不会做你想要的。你可以做一个Assert.Inclusive以获得黄灯。当我在一个基于特定数据库数据进行大量集成测试的代码库上工作时,我已经使用了它。没有测试失败,我开始让结果不确定。该代码可能工作得很好,但数据丢失。而且没有理由相信数据会一直存在(他们不是很好的IMO测试)。

0

单元测试是黑白的 - 要么你通过考试与否,无论你正在打破逻辑与否,无论你在DB数据是否正确(尽管DB单元测试不再是单元测试本身)。

你打算怎么处理这个警告?这是通过还是失败?如果通过,那么在这种情况下单元测试有什么意义?如果它失败..那么只是失败。

我建议在搞清楚什么应该是单元测试,应该如何进行单元测试花一点时间。 “单元测试”是许多用于非常非常不同的事情的陈词滥调。

1

从你的问题已经解释了,它更多的是一个验收测试(不包括单元测试)的。单元测试框架旨在快速失败。这就是为什么Assert的行为方式(以及它的好处)。

回到你的问题:你应该看看使用像Fitnesse这样的验收测试框架,它可以支持你想要的东西,即显示我失败的步骤,但继续执行直到结束。
但是,如果您必须使用单元测试框架,请使用收集变量/参数来模拟此行为。例如

  • 维护测试
  • 追加一个描述性错误消息为每个失败的步骤
  • 在试验的端部内一List<string>,断言收集变量为空
1

如果使用Gallio/MbUnit,你可以使用Assert.Multiple来实现你想要的。它捕获失败的断言,但不会立即停止执行测试。所有失败的断言都会在测试结束后收集并报告。

[Test] 
public void MultipleAssertSample() 
{ 
    Assert.Multiple(() => 
    { 
     Assert.Fail("Boum!"); 
     Assert.Fail("Paf!"); 
     Assert.Fail("Crash!"); 
    }); 
} 

上述示例中的测试显然失败,但最令人感到兴奋的是3次失败显示在测试报告中。执行不会在第一次失败时停止。

0

当我想获得更有意义的故障报告时,我遇到了类似的问题。我在比较收藏并习惯弄错元素数量 - 不知道失败的真正原因是什么。不幸的是,我最终手动编写了一个比较代码 - 所以检查所有条件,然后在最后以一个好的错误信息做一个断言。