基于类的单元测试中的常见行为:继承或共享测试夹具?

时间:2017-03-13 08:49:20

标签: matlab unit-testing

我有几个要编写的测试类,我希望它们具有非常相似的Setup和Teardown代码(基本上相同的方法,但使用不同的参数)。 根据我对unittest软件包的理解,似乎有两种方法可以做到这一点:

  • 创建一个继承自matlab.unittest.TestCase类的基类,其中包含Setup和Teardown的公共代码。然后我所有的实际测试用例类都会扩展它。
  • 使用共享的测试夹具模式记录here:夹具将包含常见的设置/拆卸代码,并在所有测试用例类中引用

在阅读了Andy Campbell的回答之后,我认为值得为usecase和我们的TestSuite组织提供一些更多的背景:我们在这些测试中测试的软件只能在整个模拟工作台中使用,这意味着这实际上并不是说单位 - 我们不会一次测试一个函数的意义上的测试。我们的测试策略如下:

  • 使用我们的模拟器播放模拟场景
  • 记录模拟输出(在文件或工作区中)
  • 对先前记录的模拟输出启动单元测试
  • 在测试序列结束时,发布有关模拟的其他结果

鉴于模拟计算量很大,我们无法在每次单元测试之前启动模拟。另一方面,由于每个模拟场景都有一个测试类,因此应为每个测试类应用setup / teardown代码。

你会提倡哪一个?第一个在我看来更自然,更容易理解,但我觉得这可能不是规范的方式。另一方面,我不确定完全掌握共享夹具的概念。

1 个答案:

答案 0 :(得分:2)

共享测试夹具与放置在类中并通过基类共享的设置/拆卸代码之间存在语义差异。

首先,设置/拆卸代码是否昂贵?换句话说,执行它需要很长时间还是有其他原因为什么执行它的次数更少?如果设置代码不昂贵,那么将它放入TestMethodSetup方法并通过继承共享它确实更好。这将允许您共享所需的代码,但它不会共享实际的灯具。也就是说,每个测试都会设置并拆除自己的fresh fixture。这对于确保测试的独立性非常有用,但只有在设置不昂贵的情况下才可行,因为它每次都会发生。

如果夹具设置/拆卸费用昂贵,您不仅要共享设置/拆卸夹具所需的代码,而且您可能还想共享夹具的实际实例。也就是说,您可能只想设置它并将其拆除一次以用于您将运行的所有测试。它们将共享相同的夹具实例(在文献中称为shared fixture)。如果您使用共享夹具,您仍然可以将它放在基类中,派生的测试类将从其使用中受益,但不同之处在于夹具可以跨测试类边界共享。如果你有以下内容:

<强> MySharedTestFixture.m

classdef MySharedTestFixture < matlab.unittest.fixtures.Fixture
    methods
        function setup(fixture)
            disp('Setting up expensive fixture');
        end
        function teardown(fixture)
            disp('Tearing down expensive fixture.');
        end
    end
end

<强> BaseTest.m

classdef (Abstract, SharedTestFixtures={MySharedTestFixture}) ...
    BaseTest < matlab.unittest.TestCase

end

<强> FooTest.m

classdef FooTest < BaseTest
    methods(Test)
        function testSomething(testCase)
        end
    end
end

<强> BarTest.m

classdef BarTest < BaseTest
    methods(Test)
        function testSomethingElse(testCase)
        end
    end
end

观察测试运行的输出:

>> runtests
Setting up MySharedTestFixture
Setting up expensive fixture
Done setting up MySharedTestFixture
__________

Running BarTest
.
Done BarTest
__________

Running FooTest
.
Done FooTest
__________

Tearing down MySharedTestFixture
Tearing down expensive fixture.
Done tearing down MySharedTestFixture
__________

你可以看到,昂贵的共享夹具只是在整个班级中设置和拆除一次。

您可以使用TestClassSetup/Teardown方法在给定类的所有测试中共享设置/拆除代码,但这些不会在不同的测试中共享。

另外,如果你想制作一个规范的装置,或许是因为它是你通常需要做的事情,你可以将其创建为官方Fixture,然后在特定的环境中决定你希望它们应用的地方以及你希望它们分享的范围。例如,对于上面的MySharedTestFixture类,我可以作为SharedTestFixture在类之间共享它,但我也可以通过调用applyFixture在一个给定类中的测试来共享它。 TestClassSetup方法。同样地,我可以在applyFixture方法中调用TestMethodSetup来创建夹具作为类中所有测试的新夹具,最后,如果我只想将夹具作为一个一次性使用测试方法,我可以轻松地在需要它的测试方法中调用applyFixture。在这种情况下,共享代码可以与实际实例共享的程度分开。

希望有所帮助!