C++ C++;模板测试

C++ C++;模板测试,c++,unit-testing,templates,C++,Unit Testing,Templates,这一定是个很平常的问题,但我没发现。你能指出我的正确方向还是描述你做什么来确保你的C++模板都被测试了? 在新项目中,所有代码都必须通过单元测试进行测试,以及其他措施,如代码审查。现在开发的过程可以确保没有未经测试的代码 对于C++模板,我看到两种可能性: 不允许使用模板,在持续集成系统中添加一个检查,该系统对所有源执行“grep模板”,并在发现问题时退出。我不想朝那个方向走 需要显式的模板实例化。模板类和函数的非内联部分必须在源文件中实现,而不是在头文件中实现,并显式实例化。Review将检查

这一定是个很平常的问题,但我没发现。你能指出我的正确方向还是描述你做什么来确保你的C++模板都被测试了? 在新项目中,所有代码都必须通过单元测试进行测试,以及其他措施,如代码审查。现在开发的过程可以确保没有未经测试的代码

<>对于C++模板,我看到两种可能性:

  • 不允许使用模板,在持续集成系统中添加一个检查,该系统对所有源执行“grep模板”,并在发现问题时退出。我不想朝那个方向走
  • 需要显式的模板实例化。模板类和函数的非内联部分必须在源文件中实现,而不是在头文件中实现,并显式实例化。Review将检查所有模板类是否在源文件中定义了非内联构造函数,模板函数是否为非内联函数,以及是否在源文件中定义了这些函数。带有模板定义的源文件的末尾将有一个部分,其中完成了所有模板实例化。然后,可以通过审查对照单元测试检查此列表,以确保测试涵盖所有实例化
  • 解决方案2的一个问题是,模板源文件必须包含具有客户端类型定义的头文件。这感觉像是依赖关系的反转

    该项目具有“核心”库部件,这些部件由各种专用模块使用。库标题将位于所有模块包含的中心位置

    如果库将其部分功能实现为模板,并且这些模板由专用模块使用,那么如果在库中定义的某些类用作模板参数,则库源文件必须包含模块的一些专用头

    这是可能的,但感觉像是一团糟。你如何解决这个问题

    编辑1:

    举例说明我的目标:我希望在我的软件开发过程中有严格的规则,以确保没有模板实例化未经监督测试:(上面给出的两个示例规则是实现这一目标的可能规则)

    如果我有

    template <class T>
    class klass {
       ...
       method1()
    };
    
    模板
    克拉斯班{
    ...
    方法1()
    };
    
    我知道我需要模板实例化,比如说,
    klass
    ,或者
    klass
    ,我对这些实例化进行了单元测试

    我想防止的是,一些模块开发人员还使用了从未测试过的
    klass

    我需要显式的模板实例化来实现这一点。问题是,如果您将
    uint16\u t
    uint32\u t
    替换为客户机模块定义的类,例如
    一些由模块后验证定义的数据类,它很快就会变得混乱

    具体地说,让人感觉混乱的是需要在库源文件klass.cpp中包含客户端头,以便能够实例化模板。我并不担心在单元测试中包含这些头文件。在单元测试中,包含测试中的头是标准的业务


    有更好的解决办法吗?或者,我必须生活在混乱中吗?

    难的是,如果你考虑SimeAE,在模板类中的函数(由于某些缺省可构造的需求),对于这个类的一些实例化……我不理解这个问题,模板化的代码可以像其他部分一样进行单元测试。@Jarod42:谢谢你给我们提示了一些其他的东西consider@Melkon:是的,我可以像测试任何其他类一样测试任何模板实例化。如何测试已识别的模板实例化不是我要解决的问题。在编辑1中,我试图让自己更清楚,最困难的部分是,如果考虑到模板类中的sFIFE、无效函数(由于某些缺省可构造性的要求),对于该类的一些实例化……我不理解这个问题,模板化的代码可以像其他部分一样进行单元测试。@Jarod42:谢谢你给我们提示了一些其他的东西consider@Melkon:是的,我可以像测试任何其他类一样测试任何模板实例化。如何测试已识别的模板实例化不是我要解决的问题。我试图在编辑1中让自己更清楚