有没有办法在另一个测试中重用N Unit测试的结果?

时间:2016-07-20 19:17:36

标签: c# .net unit-testing nunit integration-testing

我知道这里显而易见的答案是使用[SetUp]但是很有可能获得结果的代码会抛出异常并且我们想测试它。

预先免责声明,我们没有做“真正的”单元测试。我们所做的最好被描述为集成测试,设计完成,我们没有预先进行单元测试,我们现在没有资源来制作它们,但是我们正试图在更大的范围内进行自动覆盖大块的功能。

一个这样的块是一个聚合来自外部数据库的数据并创建4个复杂对象的函数,这些对象彼此具有各种引用,然后我们将其存储在内部数据库的多个表中。我们已经重构了主聚合函数来返回包装类中的对象(在聚合函数执行插入之前)。调用者现在进行插入,这让我们编写自动化测试来自动验证数据,而不会将其从数据库中拉回来。

问题是在NUnit中,我们想要测试这个聚合函数。我们不能再细化了。但是我们想要分别验证4个对象中的每一个,并验证函数不会抛出任何异常。

该函数需要花费很长时间才能运行,即使是一小组也是如此,因此我们希望避免在不同时间重新运行相同的东西来测试每个对象。

理想情况下,我们希望在验证函数完成且没有错误的情况下运行测试 - >将结果反馈到一个复杂对象的验证 - >复杂对象 - >等等。这可能与NUnit有关,或者我们可以使用另一种范例吗?

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

2 个答案:

答案 0 :(得分:0)

因为你没有"真实"已经进行了单元测试,为什么不创建单个"包装器"调用一组"步骤"的测试用例顺序如:

[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
}

它绝对不理想,但至少你确保你的测试能按正确的顺序运行。

如果你问我,我会尝试而不是诉诸这样的事情,我会尝试推动一段时间来尝试将代码重构为更可测试的东西,并从一开始就编写适当的测试。

答案 1 :(得分:0)

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

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

NUnit对它自己的一些测试比单元测试更有用,并且使用这种模式。在OneTimeSetUp中完成一次装配有点昂贵的装配。一些断言验证设置正确运行。然后针对已加载的程序集运行各种独立测试。

您可以轻松地执行相同的操作,在OneTimeSetUp中运行聚合函数,并使用四种不同的测试来检查各个方面。

从文体上看,我认为这种测试方式没有任何问题,只要它不是你为这个功能做的唯一一种测试。如果它很重要,它也可能值得一些单元测试。