Unit testing 约束模型相对于NUnit中经典模型的优势?

Unit testing 约束模型相对于NUnit中经典模型的优势?,unit-testing,nunit,Unit Testing,Nunit,除了更好的可读性(可能?)以及能够使用&和|链接约束之外,约束模型与经典模型相比还有哪些其他优势 我是经典模型的快乐用户,我正在决定重构旧测试是否值得。除了可读性之外,我不知道还有什么其他优势。但这可能是一个很大的优势。我发现,只要用Assert开始每个测试,(…)而不是使用几个Assert函数,就可以更轻松地直观地扫描断言,因为您不再需要麻烦函数名,只需查看参数即可 在NUnit 2.4中,两种语法(类和约束)在下面使用完全相同的代码。不管怎样,在幕后都没有优势。除非你真的没有更好的时间,否则

除了更好的可读性(可能?)以及能够使用
&
|
链接约束之外,约束模型与经典模型相比还有哪些其他优势


我是经典模型的快乐用户,我正在决定重构旧测试是否值得。

除了可读性之外,我不知道还有什么其他优势。但这可能是一个很大的优势。我发现,只要用
Assert开始每个测试,(…)
而不是使用几个Assert函数,就可以更轻松地直观地扫描断言,因为您不再需要麻烦函数名,只需查看参数即可


在NUnit 2.4中,两种语法(类和约束)在下面使用完全相同的代码。不管怎样,在幕后都没有优势。除非你真的没有更好的时间,否则我不会费心重写测试。

我必须说我是“经典”模型的粉丝。我发现在大多数情况下,我的断言更容易表达,而且我发现它们也更容易阅读。代码中没有任何东西是不必要的——没有“那个”和“是”听起来很流畅,但不便于发现

这很可能是由于熟悉程度和其他原因,但我认为值得向你保证的是,你不是唯一一个认为经典模型完全合理的人:)

话虽如此,当有更容易用约束表达的东西时,使用它是有意义的。当某些条件可以用约束显式测试时,尤其如此,但经典模型只使用
Assert.IsTrue(condition)
。关键的一点是,对于这种情况,约束可能比经典约束提供更多的信息


因此,我认为学习基于约束的模型是一个好主意,但我不会去转换任何测试,我也不会在您发现经典模型更简单或更可读的地方使用它。

我个人更喜欢约束模型
断言。这是
风格,只在现在使用它。我发现这种较新的样式更具可读性,并确定它不太可能混淆“实际”和“预期”参数。(就像你当然可以使用经典模型
Assert.AreEqual
等,我见过很多人这么做。)这显然会导致报告错误结果的失败测试

例如,未经检查;-),以下哪项是正确的

Assert.AreEqual(实际、预期);
断言.AreEqual(预期、实际);
引入断言并将较新的约束模型与经典模型进行比较的示例包括:

例如,以下代码必须使用约束模型。那里 不是真正的经典

int[] array = new int[] { 1, 2, 3 }; Assert.That(array, Has.Exactly(1).EqualTo(3)); Assert.That(array, Has.Exactly(2).GreaterThan(1)); Assert.That(array, Has.Exactly(3).LessThan(100)); NUnit引发的
AssertionException
包含以下“简短的
消息”

预期值:1
但结果是:0
相反,当使用较新的约束模型语法表达此测试时:

Assert.That(数组,Has.justice(1).EqualTo(4));
…NUnit返回
消息

应为:正好一项等于4
但是是:<1,2,3>
我想大多数人都会同意,这个异常消息比使用NUnit较旧的经典模型语法生成的消息更有用



†非常感谢您帮助我了解约束模型中引入的错误消息的这一重要改进。

我确实发现我会不时地自我检查这些参数的预期顺序。但是也就是说,对于
AreEqual
,这些参数的顺序真的很重要吗?也许
Assert.Greater(value1,value2)
是一个更好的例子来说明经典模型中这种潜在的模糊性?@davidr是的,顺序确实重要。不是测试是否失败(不管它是否会失败),而是因为它会告诉你它期望的实际值,而不是期望值(NUnit根据这些值构造一个句子)。你认为哪个更可读是浪费时间,因为它完全是主观的。但是,失败测试的输出非常不同。如果我要测试一个不存在的值4——“预期:正好是一个项目4——但它是:<1,2,3>”(约束)或“预期:1但它是:0”(经典),则比较输出。约束模型比经典模型清楚地传达了更精确的信息。@nashwan非常感谢您的反馈!我已把你的例子纳入我的回答中。您的示例当然支持这样的观点,即较新的约束模型语法确实比较旧的经典模型语法有所改进。欢迎您。事实上,约束模型在失败时输出消息方面比简单模型提供的改进是我很少在代码中提供任何消息参数的原因。我很困惑为什么有人希望在测试失败时使用传递不太精确信息的模型。如果是这样的话,你可以把它发挥到极致,对所有事情都使用Assert.IsTrue(…)——|@nashwan:我发现当一个测试失败时,我通常有足够的信息——如果我没有,不管怎样,很容易改变测试。因此,我宁愿在阅读通过测试的更常见情况下编写可读性代码。
Assert.That(foo,Is.Equal(…)
的额外冗长不具吸引力。(类似地,虽然许多人讨厌在一个测试中使用多个断言,但如果它测试一个逻辑流,我也同意。如果一个测试失败,那几乎总是相当于不止一个失败…)我更多地考虑在IDE之外失败的测试,即在一个CI中,所有人都会退出测试名称和失败