在NUnit中是否存在“软断言”这样的概念?如果是这样,我该如何使用它?
我所说的“软断言”的背景和细节:
在一组验收测试中,我想验证表单是否填写正确。目前,我使用以下specflow步骤执行此操作:
Then The new note form is filled out as follows
| Label | Value |
| First Name | Jon |
| Last name | Skeet |
| Title | Cool Kat |
这实现了这样的事情:
[Then(@"The new note form is filled out as follows")]
public void ThenTheNewNoteFormIsFilledOutAsFollows(Table table)
{
foreach (var row in table.Rows)
{
var name = row["Label"];
var value = row["Value"];
switch (name)
{
case "First Name":
// Page is part of our automation framework - Page.FirstName is
// simply an abstraction over getting the value of the
// <input name="FirstName" />
Assert.That(Page.FirstName, Is.EqualTo(value),
"Incorrect first name: Expected {0}, was {1}",
value, Page.FirstName);
continue;
case "Last Name":
Assert.That(Page.LastName, Is.EqualTo(value),
"Incorrect first name: Expected {0}, was {1}",
value, Page.LastName);
continue;
// similar cases for the other properties
}
}
}
这是有效的,因为它为我们提供了正确的测试结果(通过/失败)以及显示出错的错误消息。但是,因为当Assert
失败时中止测试执行,所以只报告第一个失败的表单值;如果,例如,表格是空的,只有上面例子中的First Name
会被报告丢失,我必须重新进行测试才能看到Last Name
也丢失了。
由于这些是浏览器自动化测试,因此运行时很长,并且测试失败报告所有不正确的表单元素而不仅仅是第一个表单元素会很好。
NUnit可以实现吗?
对于想要反对的读者“不要这样做 - 单元测试应该测试一件事”:
是的,我知道 - 但你的论点是无效的,因为这不是一个单元测试。这是一个验收测试,测试整个堆栈是否正常工作。我们碰巧使用NUnit来设计和执行这些测试,但这并不能使它们成为单元测试。
从来没听说过。我已经通过捕获异常,将它们放在列表中,然后在方法结束时断言来实现它。这很hacky,但它确实有效。我希望我有代码方便,但基本上我写了一个围绕Assert的包装器,可以捕获和收集。我只是从Nunit中获取了断言代码并在其周围编写了包装器。不像内置的答案那么好,但效果很好。它保持测试干净,但包装是很多样板。