我知道这里显而易见的答案是使用[SetUp]但是很有可能获得结果的代码会抛出异常并且我们想测试它。
预先免责声明,我们没有做“真正的”单元测试。我们所做的最好被描述为集成测试,设计完成,我们没有预先进行单元测试,我们现在没有资源来制作它们,但是我们正试图在更大的范围内进行自动覆盖大块的功能。
一个这样的块是一个聚合来自外部数据库的数据并创建4个复杂对象的函数,这些对象彼此具有各种引用,然后我们将其存储在内部数据库的多个表中。我们已经重构了主聚合函数来返回包装类中的对象(在聚合函数执行插入之前)。调用者现在进行插入,这让我们编写自动化测试来自动验证数据,而不会将其从数据库中拉回来。
问题是在NUnit中,我们想要测试这个聚合函数。我们不能再细化了。但是我们想要分别验证4个对象中的每一个,并验证函数不会抛出任何异常。
该函数需要花费很长时间才能运行,即使是一小组也是如此,因此我们希望避免在不同时间重新运行相同的东西来测试每个对象。
理想情况下,我们希望在验证函数完成且没有错误的情况下运行测试 - >将结果反馈到一个复杂对象的验证 - >复杂对象 - >等等。这可能与NUnit有关,或者我们可以使用另一种范例吗?
我想在最坏的情况下,我们只在同一数据集上运行聚合4次。
答案 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中运行聚合函数,并使用四种不同的测试来检查各个方面。
从文体上看,我认为这种测试方式没有任何问题,只要它不是你为这个功能做的唯一一种测试。如果它很重要,它也可能值得一些单元测试。