Lir*_*una 7 c++ error-handling unit-testing
如何在单元测试中测试想要引发的编译器错误?
考虑一下代码:
class ErrorTest
{
OtherClass& read_write() {
return other;
}
const OtherClass& read_only() const {
return other;
}
private:
OtherClass other;
};
Run Code Online (Sandbox Code Playgroud)
如何测试read_only()赋值?这非常重要,应该坚定地检查以正确生成编译器错误:
ErrorTest test;
OtherClass other = test.read_only();
test.read_write() = other.modify();
test.read_only() = other.modify(); /* This should error */
Run Code Online (Sandbox Code Playgroud)
我想现在的主要问题是,您现在正在测试您的代码还是编译器?
测试编译器不一定是坏事...我过去曾遇到过编译器升级掩码错误,因此最好确保您获得与您期望的相同的安全检查集。
然而,你必须做很多跑腿的工作。您的单元测试必须生成编译器,捕获其输出,并解析它以在正确的行上找到正确的错误语句。这并非微不足道,而且可以说不值得。
一种稍微简单的方法可能是保留一个包含错误代码的目录,并让脚本一次编译每个文件。那里有一个“#ifdef MAKEFAIL”标志,可以打开应该失败的确切条件。确保编译器在未设置该标志时返回 0,在设置时返回非零。假设编译器在失败时返回非零...我不知道 MSVC 是否遵循该规则。
为了解决可移植性问题,我将抛出的第三个选项是 autoconf。设置起来可能很痛苦,但其部分目的是确保您在编译之前拥有一个健全的开发环境。您可以在其中添加这样的测试,它可以处理查找编译器并尝试它。
| 归档时间: |
|
| 查看次数: |
570 次 |
| 最近记录: |