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模板元编程 - 目录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容