我们有一系列死亡测试,用于检查特定的调试asserts
是否启动。例如,我们构造如下:
LockManager::LockManager(size_t numManagedLocks) :
_numManagedLocks(numManagedLocks)
{
assert(_numManagedLocks <= MAX_MANAGABLE_LOCKS &&
"Attempting to manage more than the max possible locks.");
我们对其失败进行了测试:
EXPECT_DEATH(LockManager sutLockManager(constants::MAX_NUMBER_LOCKS + 1),
"Attempting to manage more than the max possible locks.");
由于assert仅在调试中编译,因此当组件在发布版本中构建时,这些测试将失败。避免这种情况的最佳方法是将EXPECT_DEATH
测试包装在DEBUG
检测宏中:
#ifndef NDEBUG
// DEATH TESTS
#endif
还是有一种更好且特定于Google测试的方法?
答案 0 :(得分:1)
由于assert()宏使用预处理程序逻辑,因此解决方案也应处于此级别-通过条件编译。 您可以使用GoogleTest专用的DISABLED_语法(请参见Temporarily Disabling Tests),并编写类似
的内容#ifdef _DEBUG
#define DEBUG_TEST_
#else
#define DEBUG_TEST_ DISABLED_
#endif
您的原始建议也看起来不错,但是我最好写直接条件:
#ifdef _DEBUG
...
答案 1 :(得分:0)
我们生成了一个有效的MACRO来代替完整的死亡测试或仅用于其他测试中的ASSERT_DEATH
:
#if defined _DEBUG
#define DEBUG_ONLY_TEST_F(test_fixture, test_name) \
TEST_F(test_fixture, test_name)
#define DEBUG_ONLY_ASSERT_DEATH(statement, regex) \
ASSERT_DEATH(statement, regex)
#else
#define DEBUG_ONLY_TEST_F(test_fixture, test_name) \
TEST_F(test_fixture, DISABLED_ ## test_name)
#define DEBUG_ONLY_ASSERT_DEATH(statement, regex) \
std::cout << "WARNING: " << #statement << " test in " << __FUNCTION__ << " disabled becuase it uses assert and fails in release.\n";
#endif
当然,我们将需要覆盖我们使用的任何其他测试类型(例如TEST_P
或EXPECT_DEATH
),但这不是什么大问题。