在另一个测试中重用N单元测试结果的任何方法

本文关键字:测试结果 单元 任何 方法 另一个 测试 | 更新日期: 2023-09-27 17:57:59

我知道这里显而易见的答案是使用[SetUp],但得到结果的代码很有可能会抛出异常,我们想对此进行测试。

免责声明,我们不是在做"真正的"单元测试。我们正在做的可以最好地描述为集成测试,设计已经完成,我们没有预先进行单元测试,我们现在没有资源进行测试,但我们正在尝试对更大的功能块进行一些自动覆盖。

一个这样的块是一个函数,它聚合来自外部数据库的数据,并创建4个复杂对象,这些对象之间有各种引用,然后我们将这些引用存储在内部数据库的几个表中。我们已经重构了主聚合函数,以返回包装类中的对象(在聚合函数也进行插入之前)。调用方现在进行插入,这使我们可以编写自动测试来自动验证数据,而无需复杂地将数据从数据库中提取出来。

问题是,在NUnit中,我们想要测试这个聚合函数。我们不能再把它弄得更细了。但我们希望分别验证这4个对象中的每一个,并验证该函数是否没有抛出任何异常。

即使是一个小集合,该函数也需要相当长的时间才能运行,因此我们希望避免重复运行同一个东西4次来测试每个对象。

理想情况下,我们希望运行一个测试来验证函数是否完成,没有错误->将结果输入到一个复杂对象的验证中->复杂对象->等等。NUnit可能做到这一点吗?或者我们可以使用另一种范式吗?

我想在最坏的情况下,我们只在同一个数据集上运行聚合4次。

在另一个测试中重用N单元测试结果的任何方法

我理解你在设置中进行测试时的犹豫,这当然不适合大多数单元测试情况。然而,有时它很有用,NUnit也支持它。设置中的断言失败会导致fixture失败,所有测试方法也会被报告为失败。

[FWIW,NUnit所做的而不是支持的是拆卸中的失败。拆卸中的任何异常,甚至SuccessException,都会导致错误。]

NUnit有一些自己的测试,它们比单元测试更具功能性,并且使用这种模式。在OneTimeSetUp中只完成一次程序集的加载,这在一定程度上是昂贵的。一些断言验证了安装程序是否正确运行。然后对加载的程序集运行各种独立的测试。

你可以很容易地做同样的事情,在OneTimeSetUp中运行聚合函数,并进行四个不同的测试来检查各个方面。

从风格上讲,我认为这种测试方式没有错,只要它不是你对功能所做的唯一一种测试。如果它很重要,那么它可能也值得进行一些单元测试。

既然你还没有做"真正的"单元测试,为什么不创建一个单独的"包装器"测试用例,按顺序调用一组"步骤",比如:

[Test]
public void ShouldPassAllTests()
{
    var result1 = Step1();
    var result2 = Step2(result1);
    var result3 = Step3(result2);
    Step4(result3);
}
private void Step1/2/3/4()
{
    // Arrange Something
    // Do Something
    // Assert Something
}

这肯定不理想,但至少你要确保你的测试将以正确的顺序运行。

如果你问我,我会尝试而不是求助于这样的事情,我会努力争取一些时间,尝试将你的代码重构成更可测试的东西,并从一开始就编写正确的测试。