C++11 模板元编程 - 测试Setup


Fixture内的所有测试用例,可以共享一个setup,用于执行相同的前置准备动作。

针对模板元编程进行测试时,所谓的前置动作一般是调用元函数,将结果保存在临时类型里,供fixture内所有测试用例使用。由于每个testcase现在是一个类,那么我们想到在fixture里面为所有testcase类提供一个共同的父类,就能达到这样的效果。

于是我们定义setup如下:

// "tlp/test/details/Fixture.h"

#define SETUP() struct TlpTestSetup

每个testcase需要继承自TlpTestSetUp,于是TEST的定义修改如下:

#define TEST(name) struct UNIQUE_NAME(tlp_test_) :TlpTestSetup

现在我们可以在fixture中定义setup了:

FIXTURE(TestSetUpInFixture)
{
    SETUP()
    {
        using expected = __int(0);
    };

    TEST("should use variable defined in setup")
    {
        ASSERT_EQ(__int(0), expected);
    };
};

上述fixture可以正常编译通过,但是遗憾的是没有定义setup的fixture中的testcase却不能编译通过了,编译期告诉我们缺少一个名为TlpTestSetup的父类。并不是所有的fixture都需要setup,所以我们提供一个默认的setup,以便不需要setup的fixture也都能编译通过。

// "tlp/test/details/Asserter.h"

using TlpTestSetup = tlp::EmptyType;

上面我们在定义Fixture的头文件中定义了一个全局的类TlpTestSetup,它是tlp库中空类的别名(struct EmptyType {})。如果某一个fixture中定义了自己的TlpTestSetup,则会在该fixture命名空间中遮掩全局的TlpTestSetup,于是该fixture中所有的testcase都将继承于自己的TlpTestSetup。否则就会继承自全局的这个空类。

至此,有没有定义setup的fixture都能正常工作了。


测试Teardown

返回 C++11模板元编程 - 目录

你可能感兴趣的:(C++11 模板元编程 - 测试Setup)