测试

时间:2015-08-26 10:07:05

标签: c++ unit-testing templates

这一定是一个普通的问题,但我找不到。你能指出我正确的方向或描述你做了什么来确保你的C ++模板都经过测试。

在新项目中,所有代码都必须使用单元测试进行测试,以及代码审查等其他措施。现在开发的程序确保没有代码可以不经过测试。

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

  1. 禁止模板,将检查添加到执行" grep模板的持续集成系统"在所有来源和纾困,如果它发现。我不想朝那个方向前进。
  2. 需要显式模板实例化。模板类和函数的非内联部分必须在源文件中实现,而不是在头文件中实现,并且必须显式实例化。 Review将检查所有模板类是否在源文件中定义了非内联构造函数,并且模板函数是非内联的,并且还在源文件中定义。具有模板定义的源文件的末尾将具有完成所有模板实例化的部分。然后,可以通过审核来检查此列表,以确保所有实例都包含在测试中。
  3. 解决方案2的一个问题是模板源文件必须包含具有客户端类型定义的头文件。这感觉就像是依赖的倒置。

    该项目有"核心"各种专用模块使用的库部件。库标题将存在于所有模块包含的中心位置。

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

    这是可能的,但感觉就像一团糟。你是怎么解决的?

    编辑1:

    示例澄清我的目标:我希望在我的软件开发过程中有严格的规则,确保没有模板实例化因疏忽而未经测试:(上面给出的两个示例规则是实现此目的的可能规则)

    假设我有

    template <class T>
    class klass {
       ...
       method1()
    };
    

    我知道我需要模板实例化,例如klass<uint16_t>klass<uint32_t>,我对这些实例化进行了单元测试。

    我想用我的流程阻止的是某些模块开发人员还使用了从未测试过的klass<uint8_t>

    要求显式模板实例化为我实现这一目标。如果用客户端模块定义的类替换uint16_tuint32_t,问题就是它会很快变得混乱。 some_data_class_defined_by_module_posterize_t

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

    有更好的解决方案吗?或者我必须忍受这个混乱?

0 个答案:

没有答案