例如以下测试Foo方法,NTEST(FooTest_PassDemo)就是创建一个名为FooTest_PassDemo_Test的子类,将宏定义的断言EXPECT_EQ()等放入Run()方法主题中。展开代码如下。
int Foo(int a, int b) { return a + b; }
NTEST(FooTest_PassDemo) { EXPECT_EQ(3, Foo(1, 2)); EXPECT_EQ(2, Foo(1, 1)); }
// 将以上宏定义展开等价于以下代码。
class FooTest_PassDemo_TEST : public TestCase { public: FooTest_PassDemo_TEST(const char* case_name) : TestCase(case_name){}; virtual void Run(); private: static TestCase* const testcase_; };
TestCase* const FooTest_PassDemo_TEST::testcase_ = UnitTest::GetInstance()->RegisterTestCase(new FooTest_PassDemo_TEST("FooTest_PassDemo")); void FooTest_PassDemo_TEST::Run() { if (3 != Foo(1, 2)) { UnitTest::GetInstance()->CurrentTestCase->nTestResult = 0; std::cout << red << "Failed" << std::endl; std::cout << red << "Expect:" << Foo(1, 2) << std::endl; std::cout << red << "Actual:" << 3 << std::endl; } if (2 != Foo(1, 1)) { UnitTest::GetInstance()->CurrentTestCase->nTestResult = 0; std::cout << red << "Failed" << std::endl; std::cout << red << "Expect:" << Foo(1, 1) << std::endl; std::cout << red << "Actual:" << 2 << std::endl; } }
int _tmain(int argc, _TCHAR* argv[]) { //return UnitTest::GetInstance()->Run(); return RUN_ALL_TESTS(); } |
坐在班车上,脑子里回想着这篇博客,突然间有种模糊的意识,COM的设计思想貌似也可以用来设计单元测试框架,没有成熟的思路,只是个想法,写下以备忘。