c++ - 如何测试编译器不应该接受的东西

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

<分区>

我正在编写一个包含许多适配器的 C++ 库。自动测试适配器 foo 可以应用于类型 a 很容易,只需编写代码 foo 并检查它是否编译。为了获得额外的信心,您甚至可以检查它是否按预期工作;) 有许多单元测试框架可以对此提供帮助。

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

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

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

最佳答案

原来我想要的东西可以(以有限的方式)用 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

所需的代码有点冗长(每个测试都需要一个单独的连接器),所以我可能会编写一个 Python 测试脚本到 C++ 的转换器。

关于c++ - 如何测试编译器不应该接受的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47722210/

相关文章:

java - WireMock - 在 POST stub 工作正常时, stub GET 与 body 不工作

performance - 如何在 Fiddler 运行时使用 Jmeter 运行负载测试?

c++ - 谷歌日志滚动文件

c# - 从非托管 C++ 调用 C# 代码?

c# - 从 Visual Studio UI 运行测试类别

node.js - 使用 Mocha 进行测试之前清除集合

mongodb - Scalamock:模拟通用案例类会导致类型不匹配

.net - 不正确的互操作签名导致内存泄漏

c++ - 为什么模板只能在头文件中实现?

java - 模拟或构建 Jersey InboundJaxrsResponse