【问题标题】:How can I run google death tests in debug only?如何仅在调试中运行谷歌死亡测试?
【发布时间】:2018-07-03 14:42:41
【问题描述】:

我们有一系列的死亡测试来检查特定的调试 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 只在 debug 中编译,当组件在 release 中构建时,这些测试将失败。避免这种情况的最佳方法是将EXPECT_DEATH 测试包装在DEBUG 检测宏中:

#ifndef NDEBUG
     // DEATH TESTS
#endif

或者是否有更好的特定于 Google 测试的方法?

【问题讨论】:

  • 您可以使用--gtest_filter 命令行参数排除这些测试。
  • @Thomas,是的,但这很痛苦,因为您必须禁用来自不同测试用例的一系列测试。我们可以将它添加到我们的运行脚本中,但我觉得更好的解决方案是一个特殊的扩展宏或其他东西。
  • 您可以使用命名约定,例如以 Death 这个词结束所有这些测试。

标签: c++ googletest


【解决方案1】:

由于 assert() 宏使用预处理器逻辑,因此解决方案也应该在这个级别 - 通过条件编译。 您可以使用 GoogleTest 特定的 DISABLED_ 语法(参见Temporarily Disabling Tests)并编写类似

#ifdef _DEBUG
#define DEBUG_TEST_ 
#else
#define DEBUG_TEST_ DISABLED_
#endif 

你原来的建议看起来也不错,但我最好写直接条件:

#ifdef _DEBUG 
 ...

【讨论】:

    【解决方案2】:

    我们生成了一个工作宏来代替完整的死亡测试或只是出现在其他测试中的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),但这应该不是什么大问题。

    【讨论】:

      猜你喜欢
      • 2021-08-24
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-22
      • 1970-01-01
      相关资源
      最近更新 更多