【问题标题】:Unit testing template code单元测试模板代码
【发布时间】:2016-10-26 05:36:15
【问题描述】:

想象一下,我有很多可以用static_asserts 测试的模板代码,例如

template <typename Help>
class SomeUtil { ... };

static_assert(std::is_same<SomeUtil<Type>::type, int>::value, "message");

是通过创建一个仅包含此标头并编译它的main.cpp 来测试它的唯一方法吗? -fsyntax-only 似乎不起作用。

【问题讨论】:

  • 好吧,我可以想到像 autotools 这样的方法。尝试编译一段特定的代码,看看正在运行的编译器是否在它上面失败。
  • @πάνταῥεῖ 我有一个小脚本可以做到这一点,但不知何故这并不让我开心..
  • 您到底关心什么?您介意向我们展示您目前的方法吗?
  • @πάνταῥεῖ 我正在寻找本地人(当我说本地人时,我的意思是gccclang 我猜也可以)。当前的方法是使用 bash 函数来检查当前工作目录并生成一个具有随机名称的文件,包括作为参数传入的标头,编写一个小的 main 并编译它。

标签: c++ unit-testing templates constraints template-meta-programming


【解决方案1】:

使用事实gccclang 都可以读取stdin

clang -c -o /dev/null -xc++ - <header.h

一步一步:

  • -c - 编译但不链接

  • -o /dev/null - 不生成任何输出文件

  • -xc++ - 源类型为 C++

  • - - 以标准输入形式给出的源

  • &lt;header.h - 提供你的头文件作为输入

请注意,您还必须传递任何与您的项目相关的-D-I 标志。

要修复有关 #pragma once in main file 的警告,您可以:

  • 禁止它,如果你的编译器支持-Wpragma-once-outside-header

  • 使用echo间接提供标题:

    echo '#include "header.h"' | clang -c -o /dev/null -xc++ -

不要忘记结尾的-

【讨论】:

  • -o /dev/null 看起来不错。如果您允许的话,我一直在采用它;-)。
  • 我赞成您的回答,但这似乎使编译器认为这是主文件。例如,当我使用模板头文件执行此操作时,我从g++ 得到的输出是warning: #pragma once in main file [enabled by default]。有什么办法吗?
【解决方案2】:

好吧,免得我们假设你有一个像 gtest 这样的测试框架,我会试着写一个像

这样的测试
TEST_F(MyTestClass,CheckSomeUtilCompiles) {
    std::string codeInQuestion = R"(
    #include "MyTemplate.h"
    int main() {
        // instantiate SomeUtil with some invalid condition:
        SomeUtil<int> x;
    }
    )";
    std::ofstream testFile("testcode.cpp");
    testfile << codeInQuestion;
    testfile.close();

    EXPECT_EQ(?,system("$CPP -c $CPPFLAGS testcode.cpp -o /dev/null"));
           // ^ Something other than zero
}

【讨论】:

  • 我从来没有尝试过,所以也许这在实践中效果很好,但它看起来相当脆弱和矫枉过正。我更喜欢使用 shell 脚本语言的测试工具来尝试编译代码 sn-ps。您必须为此编写自己的测试工具,但它应该非常简单(它是,我已经完成了)。
  • @KonradRudolph “我更喜欢使用 shell 脚本语言的测试工具”嗯,我更喜欢在我的常规单元测试中测试这些东西。跨度>
  • 其实你已经说服了我。
猜你喜欢
  • 2013-10-01
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 2015-11-10
相关资源
最近更新 更多