【问题标题】:How to test for things that should not be accepted by the compiler [duplicate]如何测试编译器不应该接受的东西[重复]
【发布时间】:2018-05-23 03:54:39
【问题描述】:

我正在编写一个具有许多适配器的 C++ 库。很容易进行适配器 foo 可以应用于类型 a 的自动化测试,只需编写代码 foo 并检查它是否可以编译。为了增加信心,您甚至可以检查它是否按预期工作;)有许多单元测试框架可以帮助实现这一点。

但同样重要的是某些东西不能编译,例如 foo 不应该接受类型 b。是否有关于以自动化方式进行测试的普遍智慧?一个步骤可能是运行编译器并验证它是否返回错误状态(或不生成输出文件)。但这将需要每个测试一个源文件!一些宏魔法可以将测试合并到一个源文件中,但仍需要多次编译运行。

我不敢相信我是第一个遇到这个问题的人。那么,组织和运行此类测试的好方法是什么?

(在前世我写了一个小型编译器,它有一个命令行选项 -fail 12,这导致编译器返回错误代码除非它遇到错误或第 12 行。也许我应该修补 GCC 以接受类似的东西。)

【问题讨论】:

    标签: c++ unit-testing testing automated-tests


    【解决方案1】:

    事实证明,我想要的东西可以(以有限的方式)用 C++ 概念来完成。一个概念测试它的子句是否格式正确。如果不是,则该概念返回 false。这段代码检查 pin_in_out 有一个 set(bool) 函数,而 pin_in 没有。

    struct pin_in_out { static void set( bool v ){} };
    struct pin_in{ };
    
    template< typename T >
    concept bool test_case = requires( bool v ) {
        { T::set( v ) } -> void;
    };
    
    int main(){
       std::cout << test_case< pin_in_out > << "\n";
       std::cout << test_case< pin_in > << "\n";
    }
    

    打印

    1
    0
    

    所需的代码有点冗长(每个测试都需要一个单独的 conecpt),所以我可能会编写一个 Python testcript-to-C++ 转换器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 2016-02-02
      相关资源
      最近更新 更多