记一次阅读代码,很有意思的测试用例封装
test.h
// 简单测试的宏定义
#define TEST(testcase_name) \
MYTINYSTL_TEST_(testcase_name)
// 测试案例的类名,替换为 test_cast_TEST
#define TESTCASE_NAME(testcase_name) \
testcase_name##_TEST
// 使用宏定义掩盖复杂的测试样例封装过程,把 TEXT 中的测试案例放到单元测试中
#define MYTINYSTL_TEST_(testcase_name) \
class TESTCASE_NAME(testcase_name) : public TestCase { \
public: \
TESTCASE_NAME(testcase_name)(const char* case_name) \
: TestCase(case_name) {}; \
virtual void Run(); \
private: \
static TestCase* const testcase_; \
}; \
\
TestCase* const TESTCASE_NAME(testcase_name) \
::testcase_ = UnitTest::GetInstance()->RegisterTestCase( \
new TESTCASE_NAME(testcase_name)(#testcase_name)); \
void TESTCASE_NAME(testcase_name)::Run()
test.cpp
TEST(copy_test)
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int exp[5], act[5];
std::copy(arr1, arr1 + 5, exp);
mystl::copy(arr1, arr1 + 5, act);
EXPECT_CON_EQ(exp, act);
std::copy(arr1 + 5, arr1 + 10, exp);
mystl::copy(arr1 + 5, arr1 + 10, act);
EXPECT_CON_EQ(exp, act);
}
TEST(copy_test)会先调用
#define TEST(testcase_name) \ ? MYTINYSTL_TEST_(testcase_name)
定义的MYTINYSTL_TEST_(testcase_name)会调用
#define MYTINYSTL_TEST_(testcase_name) \
class TESTCASE_NAME(testcase_name) : public TestCase { \
public: \
TESTCASE_NAME(testcase_name)(const char* case_name) \
: TestCase(case_name) {}; \
virtual void Run(); \
private: \
static TestCase* const testcase_; \
}; \
\
TestCase* const TESTCASE_NAME(testcase_name) \
::testcase_ = UnitTest::GetInstance()->RegisterTestCase( \
new TESTCASE_NAME(testcase_name)(#testcase_name)); \
void TESTCASE_NAME(testcase_name)::Run()
内部定义的TESTCASE_NAME会调用
#define TESTCASE_NAME(testcase_name) \ ? ? testcase_name##_TEST
看最终的预编译结果
class copy_test_TEST : public TestCase { public: copy_test_TEST(const char* case_name) : TestCase(case_name) {}; virtual void Run(); private: static TestCase* const testcase_; }; TestCase* const copy_test_TEST ::testcase_ = UnitTest::GetInstance()->RegisterTestCase( new copy_test_TEST("copy_test")); void copy_test_TEST::Run()
{
//...
}
一个封装好的执行单元类及其执行函数
|