使用C++编译错误的单元测试

问题描述:

我已经编写了一个Matrix类,并且检查了它不允许使用C++异常来增加不兼容大小的矩阵的乘法。我编写了单元测试来检查这种行为,并且他们期待抛出异常。使用C++编译错误的单元测试

现在我将Matrix大小从运行时变量更改为模板参数。如果我能够正确地做到这一点,那么将会尝试乘以错误大小的矩阵的代码将不会编译。

现在看来,这些单元测试是多余的。但是,由于我不知道将来如何更改我的代码,什么会中断,我仍然希望为此执行测试。如果在我希望我的测试在特定位置抛出特定异常之前,现在我想让我的测试在特定位置抛出特定的编译错误。

这样做的最佳方法是什么?我会想象某种基于Makefile和shell脚本的机制,它会等待特定的错误代码 - 或者我应该尝试其他的东西吗?这个想法是普遍的做法还是疯狂?

编辑:当然,“单元测试”是不是这种机制的一个合适的名字,我知道,但现在,我想不出更好的办法。已经有三位评论作者花费宝贵的时间和精力向我解释单元测试是什么,什么不是。不幸的是,虽然在技术上是正确的,但这并没有帮助解决这里的实际问题。

编辑2:这是BDD的场景,我想测试:

  • 由于尺寸的2x2和3x3的两个矩阵
  • 用户试图将它们相乘
  • Then他得到一个错误

之前,错误是运行时错误,并且测试它是微不足道的。但是现在我变成了一个编译时错误,而且我看不到如何自动测试这个场景并确认每次提交(我在git钩子中都有单元测试),它仍然给我一个错误。

+4

单元测试是用于检测运行时错误:如果你想检查出来

这里的文档。编译器用于检测编译时错误。 – RPGillespie 2015-02-23 21:39:15

+0

单元测试不检测运行时错误。单元测试检查程序本身或运行时检测到预期的运行时错误。我找的工具(你是对的,单元测试不是最好的名字)不会检测到编译错误,但会检查编译器是否检测到它们。 – 2015-02-23 21:43:40

+2

单元测试应测试其实现内部可以更改的黑盒函数,以便您可以验证修改内部函数是否未破坏其功能。我会建议为您的基础设施制作与实施无关的API。像'bool canMultiply(Matrix&a,Matrix&b)'这样的函数可以在内部使用任何内容,并且可以通过单元测试进行验证。 – RPGillespie 2015-02-23 21:46:14

即使新的template代码风格使得它在运行时不可能与矩阵不匹配,保持“单元”测试是无害的。您可能仍然会遇到一个运行时间的错误,如您所说,代码可能会再次发生变化。

如果您使用gcc,gcc使用DejaGnu来测试自己。这应该足够强大,以检测gcc编译错误。

+0

但是,如果我保持原样,运行时错误就会变成编译错误,而且我根本无法运行我的单元测试,因为它们不能编译。虽然编译错误是我想要检查的结果,但我想检查它是否仍然有能力运行我所有的单元测试。我怎样才能实现它? – 2015-02-24 14:50:51

+0

将您的单元测试转换为期望编译错误的脚本。使用Python或make/bash – 2015-02-24 14:53:26

+0

期待C++编译错误有点难 - 您可能知道一些框架来实现一些测试吗? – 2015-02-24 14:55:10

我还没有足够的代表评论@Paul Evans的回答,所以请告诉我,如果我应该没有回答。

@Paul Evans建议DejaGnu和我支持该选择。 但是,如果你想产生更多可理解的编译错误(模板编译错误往往会变得混乱),你可以使用static_asserts

他们是因为C++ 11(虽然你应该检查你的编译器可以使用它们)标准,是类似于传统的断言,只有他们在编译时检查,可以显示自定义错误消息。 http://en.cppreference.com/w/cpp/language/static_assert