在 CppUnit 中测试中止断言失败
Test an aborting assertion failure in CppUnit
我想对一个 C++ 函数进行单元测试,该函数在无效输入时抛出中止断言错误。
函数如下:
uint64_t FooBar::ReadTimeStamp(std::string& name) {
auto iter = hash_table_.find(name);
assert(iter != hash_table_.end());
....
}
在单元测试中,我使用CPPUNIT_ASSERT_ASSERTION_FAIL
断言失败:
void FooBarTest::
TestReadNonexistentTimestamp() {
CPPUNIT_ASSERT_ASSERTION_FAIL(ReadTimestamp("NON_EXISTENT"));
}
但是我收到中止消息并且单元测试失败。
我读了this page。我不清楚我是否需要在这里抛出异常,以及对这种情况进行单元测试的正确方法是什么。谢谢!
首先,您的误解是由于术语"assertion"的不同使用方式造成的。测试框架本身谈论断言,但它 而不是 意味着标准库提供的 assert()
宏。由于标准断言失败会导致程序终止,因此您会得到这些结果。
现在,如何解决这个问题:
- 不要使用
assert()
。相反,您可以抛出异常。
- 不要测试此代码路径。由于这是一个无论如何都无法恢复的编程错误,它只能由误用您的代码(即违反先决条件)引起。由于不是您的代码有问题,因此不对其进行测试不会对其质量产生任何负面影响。
- 劫持
assert()
引发 CppUnit 理解的故障。这可能很棘手,因为一方面,assert()
是 C++ 的一部分,不应该粗心地重新定义(也许用不同的宏替换它会更好)。此外,您现在拥有三种不同的行为:投入测试、正常使用 abort()、定义了 NDEBUG
的 UB。
您可以根据自己的用例以及无可否认的个人喜好来决定哪种效果最好。
我想对一个 C++ 函数进行单元测试,该函数在无效输入时抛出中止断言错误。
函数如下:
uint64_t FooBar::ReadTimeStamp(std::string& name) {
auto iter = hash_table_.find(name);
assert(iter != hash_table_.end());
....
}
在单元测试中,我使用CPPUNIT_ASSERT_ASSERTION_FAIL
断言失败:
void FooBarTest::
TestReadNonexistentTimestamp() {
CPPUNIT_ASSERT_ASSERTION_FAIL(ReadTimestamp("NON_EXISTENT"));
}
但是我收到中止消息并且单元测试失败。
我读了this page。我不清楚我是否需要在这里抛出异常,以及对这种情况进行单元测试的正确方法是什么。谢谢!
首先,您的误解是由于术语"assertion"的不同使用方式造成的。测试框架本身谈论断言,但它 而不是 意味着标准库提供的 assert()
宏。由于标准断言失败会导致程序终止,因此您会得到这些结果。
现在,如何解决这个问题:
- 不要使用
assert()
。相反,您可以抛出异常。 - 不要测试此代码路径。由于这是一个无论如何都无法恢复的编程错误,它只能由误用您的代码(即违反先决条件)引起。由于不是您的代码有问题,因此不对其进行测试不会对其质量产生任何负面影响。
- 劫持
assert()
引发 CppUnit 理解的故障。这可能很棘手,因为一方面,assert()
是 C++ 的一部分,不应该粗心地重新定义(也许用不同的宏替换它会更好)。此外,您现在拥有三种不同的行为:投入测试、正常使用 abort()、定义了NDEBUG
的 UB。
您可以根据自己的用例以及无可否认的个人喜好来决定哪种效果最好。