转载:https://www.jianshu.com/p/b56d59f77d53
1.setup
Fixture内的所有测试用例,可以共享一个setup,用于执行相同的前置准备动作;
每个testcase现在是一个类,那么我们想到在fixture里面为所有testcase类提供一个共同的父类,
#define SETUP() struct TlpTestSetup
#define TEST(name) struct UNIQUE_NAME(tlp_test_) :TlpTestSetup
FIXTURE(TestSetUpInFixture)
{
SETUP()
{
using expected = __int(0);
};
TEST("should use variable defined in setup")
{
ASSERT_EQ(__int(0), expected);
};
};
// 上述fixture可以正常编译通过,但是遗憾的是没有定义setup的
// fixture中的testcase却不能编译通过了,
// 编译期告诉我们缺少一个名为TlpTestSetup的父类
// "tlp/test/details/Asserter.h"
using TlpTestSetup = tlp::EmptyType;
// 定义Fixture的头文件中定义了一个全局的类TlpTestSetup,
它是tlp库中空类的别名(struct EmptyType {})。
如果某一个fixture中定义了自己的TlpTestSetup,
则会在该fixture命名空间中遮掩全局的TlpTestSetup,
于是该fixture中所有的testcase都将继承于自己的TlpTestSetup。
否则就会继承自全局的这个空类
2.tearDown:TEARDOWN
定义一个类,每个测试用例能够继承它,然后再将自身传递给它
#define TEST(name) struct UNIQUE_NAME(tlp_test_) :
TlpTestSetup, TlpTestTearDown<UNIQUE_NAME(tlp_test_)>
#define TEARDOWN_BEGIN() \
template<typename TestCase> struct TlpTestTeardown \
{ \
TlpTestTeardown() \
{ \
struct Teardown : TestCase \
{
// 在这里实现teardown的定义,这里可以使用TestCase的内部定义!
#define TEARDOWN_END() }; } };
// TlpTestTeardown构造函数中Teardown类继承的TestCase是从模板参数输入的,
// 所以在Teardown中是不能直接引用TestCase中的定义的,必须加上TestCase::前缀。
#define __test_refer(...) typename TestCase::__VA_ARGS__
//
FIXTURE(TestWithSetUpAndTearDown)
{
SETUP_BEGIN()
using Expected = __int(2);
SETUP_END()
TEARDOWN_BEGIN()
ASSERT_EQ(__test_refer(Result), Expected);
TEARDOWN_END()
TEST("test1")
{
using Result = __add(__int(1), __int(1));
};
TEST("test2")
{
using Result = __div(__int(4), __int(2));
};
};