如何仅在调试中运行Google死亡测试?

时间:2018-07-02 11:16:13

标签: c++ googletest

我们有一系列死亡测试,用于检查特定的调试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测试的方法?

2 个答案:

答案 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_PEXPECT_DEATH),但这不是什么大问题。