C# 有没有办法在另一个测试中重用N单元测试的结果?

C# 有没有办法在另一个测试中重用N单元测试的结果?,c#,.net,unit-testing,nunit,integration-testing,C#,.net,Unit Testing,Nunit,Integration Testing,我知道这里最明显的答案是使用[SetUp],但很有可能得到结果的代码会抛出异常,我们希望对此进行测试 免责声明:首先,我们没有进行“真正的”单元测试。我们正在做的可以最好地描述为集成测试,设计已经完成,我们没有预先进行单元测试,我们现在没有资源进行单元测试,但是我们正在尝试在更大的功能块上获得一些自动覆盖 一个这样的块是一个函数,它聚合来自外部数据库的数据,并创建4个相互之间具有各种引用的复杂对象,然后将这些对象存储在内部数据库的多个表中。我们已经重构了主聚合函数,以返回包装类中的对象(在聚合函

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

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

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

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

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

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

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

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

[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
}
这肯定不理想,但至少你要确保你的测试将以正确的顺序运行


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

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

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

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

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


从风格上讲,我认为这种测试方法没有错,只要它不是您对函数所做的唯一测试。如果它很重要,它可能也应该进行一些单元测试。

使用设置有什么问题?如果安装中存在异常,则测试将不会运行,并且错误会告诉您由于异常XYZ而导致安装失败。如果一个对象的创建成本很高,我会将其缓存在一个字段中,供其他测试使用。当然,我们已经在使用N Unit快速地进行了处理,但我的理解是,不应该“测试”[Setup]。在测试类中创建一个类级别变量来保存该值。作为免责声明,这使得测试依赖于运行顺序,这在正常测试场景下是个坏主意(单元测试应该是独立的,不依赖于要运行的测试之外的任何东西)。如果是我,在你的情况下,我会使变量为null,这样我就可以很容易地测试前一个测试是否确实运行过,并抛出断言。如果没有,则不确定。我认为顺序依赖关系很好,事实上,这就是我在发布本文后一直在研究的内容。我不是在骗自己,以为这些是单元测试,所以我同意。如果为空,那么聚合肯定会失败,没有理由尝试验证单个对象枚举。我知道你理解你在做什么,我在免责声明中主要针对阅读本文的其他人。