NUnit:在单个测试中运行多个断言

时间:2020-03-06 15:04:59  来源:igfitidea点击:

我被要求编写一个测试应用程序,该应用程序需要在数据库中的多行上测试一个新的存储过程,从本质上讲,我想执行以下操作:

[Test]
public void TestSelect()
{
    foreach(id in ids)
    {
        DataTable old = Database.call("old_stored_proc",id);
        DataTable new_ = Database.call("new_stored_proc",id);

        Assert.AreEqual(old.Rows[0]["column"],ne_.Rows[0]["column"]);
    }
}

当我运行此测试时,如果一行与另一行不匹配,则整个测试将失败;否则,整个测试将失败。相反,我想计算断言的传递次数和失败的次数。有没有办法用NUnit做到这一点?

我意识到NUnit可能会过大,如果没有它,这是一个简单的任务……我只是想学习它。 ;)

解决方案

好吧,我们可以声明一个计数器,然后断言计数器的值以确定通过/失败

另外,我们可以在测试设置中完成大部分工作,然后仅创建多个测试。

我不清楚我们为什么需要在同一测试中使用所有断言的stmts。

我将计算不匹配的行数,然后编写一个断言,将这个数与0进行比较,并返回消息中不匹配的字符串数。

我们也可以使用Assert.Greater

P.S.原则上,我们应该尝试对每个单元测试执行一个声明。这就是要旨。

似乎我们只是在声明错误的内容。如果要检查所有值,然后断言没有错误(或者显示错误数量),请尝试以下操作:

[Test]
public void TestSelect()
{
    int errors = 0;
    foreach(id in ids)
    {
        DataTable old = Database.call("old_stored_proc",id);
        DataTable new_ = Database.call("new_stored_proc",id);

        if (old.Rows[0]["column"] != new_.Rows[0]["column"])
        {
            errors++;
        }            
    }

    Assert.AreEqual(0, errors, "There were " + errors + " errors.");
}

1)如果ID不变,并且在测试运行时未查找,请为每个ID创建一个单独的单元测试治具。这样,我们将知道哪些ID实际上是失败的。有关数据驱动测试的问题,请参见此处:
http://googletesting.blogspot.com/2008/09/tott-data-driven-traps.html

2)如果我们需要动态查找ID,从而无法为每个ID创建固定装置,请使用akmad的建议进行一次更改。保留ID值不相等的列表,并将该列表添加到错误消息中。诊断仅说明错误数量的失败测试将非常困难,因为我们将不知道是什么ID导致错误。

3)我不知道在NUnit中将有多么困难,但是在PyUnit中,当我们需要对动态生成的数据运行测试时,我们会动态创建测试装置并将其添加到TestCase类,从而导致失败对每个不合格的数据进行测试。虽然我认为如果没有python的动态功能,这将更加困难。

根据我们列出的目标,如果一行与另一行不匹配,则整个测试将失败。计算断言通过或者失败的次数所得到的信息少于将预期结果与实际获得的结果进行比较的信息。

我知道问题是关于NUnit的,但是有趣的是,Gallio / MbUnit具有一项功能,可以一次运行并捕获多个断言。

[Test]
public void MultipleTest()
{
    Assert.Multiple(() =>
    {
       Assert.IsTrue(blabla);
       Assert.AreEqual(pik, pok);
       // etc.
    }
}

" Assert.Multiple"正在捕获所有失败的断言,并将在测试结束时报告它们。