Unit testing “有吗?”;“软”字;NUnit中的断言?

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 |

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
        }
    }
}
[然后(@“新的注释表填写如下”)]
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中。如果您想跟踪进度,它是