Unit testing “有吗?”;“软”字;NUnit中的断言?
NUnit中是否有“软断言”这样的概念?如果是,我如何利用它 我所说的“软断言”的背景和细节: 在一组验收测试中,我想验证表单是否正确填写。目前,我使用以下specflow步骤执行此操作:Unit testing “有吗?”;“软”字;NUnit中的断言?,unit-testing,nunit,assertion,Unit Testing,Nunit,Assertion,NUnit中是否有“软断言”这样的概念?如果是,我如何利用它 我所说的“软断言”的背景和细节: 在一组验收测试中,我想验证表单是否正确填写。目前,我使用以下specflow步骤执行此操作: Then The new note form is filled out as follows | Label | Value | | First Name | Jon | | Last name | Skeet |
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
}
}
}
[然后(@“新的注释表填写如下”)]
public void然后newnoteformisfilledoutas如下(表)
{
foreach(表中的变量行。行)
{
变量名称=行[“标签”];
var值=行[“值”];
交换机(名称)
{
案例“名字”:
//Page是我们自动化框架的一部分—Page.FirstName是
//简单地说,是对获取
//
Assert.That(Page.FirstName,Is.EqualTo(value),
“名字不正确:应为{0},为{1}”,
值,第页。名);
继续;
案例“姓氏”:
Assert.That(Page.LastName,Is.EqualTo(value),
“名字不正确:应为{0},为{1}”,
值,Page.LastName);
继续;
//其他属性的类似情况
}
}
}
这是可行的,因为它给我们提供了正确的测试结果(通过/失败),并带有错误消息,显示出哪里出了问题。但是,由于当断言失败时测试执行被中止,因此只报告第一个失败的表单值;例如,如果表单为空,则上面示例中只有名字
会被报告丢失,我必须重新运行测试以查看姓氏
是否也丢失
由于这些是浏览器自动化测试,运行时相当长,如果测试失败报告所有不正确的表单元素,而不仅仅是第一个表单元素,那就更好了
NUnit能做到这一点吗
对于那些想反对“不要这样做——单元测试应该只测试一件事”的读者:
是的,我知道-但是你的论点是无效的,因为这不是单元测试。这是一个验收测试,测试整个堆栈是否正常工作。我们碰巧使用NUnit来设计和执行这些测试,但这并不能使它们成为单元测试。据我所知不是这样。我通过捕获异常,将它们放入列表,然后在方法末尾断言来实现这一点。它很粗糙,但很管用。我希望我手头有代码,但基本上我编写了一个围绕Assert的包装器来捕获和收集。我只是从Nunit获取了断言代码,并围绕它编写了包装器。
虽然没有内置答案那么好,但效果很好。它保持了测试的干净性,但是包装器是很多样板文件。Assert.Multiple现在可用了当然,我可以通过收集错误消息、断言集合为空或显示消息来手动完成这一点,但我认为这是单元测试框架应该为我做的事情。。。有一些选项,虽然它看起来没有内置任何东西。另外一个选项,但我认为close as dup是合适的:似乎至少提供了一种自己动手的方法。我们计划将其添加到NUnit 3.0中。如果您想跟踪进度,它是