C++基类RunTest如何自动调用派生类中未知的新增测试方法链
C++本身没有内置.NET风格的反射能力,你不需要依赖反射就能实现需求,用测试函数注册机制即可实现,具体方案如下:
1. 实现思路
给基类维护一个测试函数列表,派生类在构造阶段将自身的测试方法注册到这个列表中,基类的RunTest遍历列表按要求的顺序执行即可。新增测试方法时仅需要在派生类中新增函数+注册一行代码,无需修改基类,完全满足你后续扩展的需求。
本方案要求编译器支持C++11及以上标准,目前主流编译器(GCC 4.8+、Clang 3.3+、MSVC 2012+)均默认支持。
2. 代码修改
2.1 修改testBase.h
#include <vector> #include <functional> class TestBase { public: TestBase() {} virtual void TestStart() = 0; virtual void TestEnd() = 0; void RunTest() { // 遍历所有已注册的测试用例按顺序执行 for (auto& testFunc : testCases) { TestStart(); testFunc(); TestEnd(); } } protected: // 提供给派生类的测试用例注册接口 void RegisterTest(std::function<void()> testFunc) { testCases.push_back(testFunc); } private: // 存储所有已注册的测试用例 std::vector<std::function<void()>> testCases; };
2.2 修改classifierTest.cpp
仅需要修改构造函数,在构造阶段注册所有测试用例即可,其余代码不需要改动:
#include "classifierTest.h" ClassifierTest::ClassifierTest() { // 注册所有测试用例,后续新增测试只需要在这里加一行注册代码即可 RegisterTest([this](){ Test1(); }); RegisterTest([this](){ Test2(); }); RegisterTest([this](){ Test3(); }); } void ClassifierTest::TestStart() { // 你的前置逻辑 } void ClassifierTest::TestEnd() { // 你的后置逻辑 } void ClassifierTest::Test1(){ // 测试1逻辑 } void ClassifierTest::Test2(){ // 测试2逻辑 } void ClassifierTest::Test3(){ // 测试3逻辑 }
3. 执行效果
你原有main函数不需要做任何修改,调用RunTest时就会严格按照你要求的顺序执行:TestStart()→单测试用例→TestEnd(),循环覆盖所有注册的测试用例。
内容的提问来源于stack exchange,提问作者Aryan Firouzian
相关产品推荐
相关产品推荐

