You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:15:02