通过C++中的合同和单元测试进行设计

rio*_*ter 2 c++ unit-testing design-by-contract c++builder googletest

我正在尝试将基本的Design by Contract(由宏实现,它使用内置的assert函数)和Google Test单元测试结合在一个应用程序中.

所以,例如,我有以下代码:

AppFavorite* AppFavorites::Add(const UnicodeString& link)
{
    REQUIRE(!link.IsEmpty());

    ...
}
Run Code Online (Sandbox Code Playgroud)

现在,我无法在单元测试中进行以下测试,因为IDE在到达断言时中止(REQUIRE(!link.IsEmpty());):

TEST(AppFavoritesTest, AddEmpty)
{
    AppFavorites favorites;
    ASSERT_THROW(favorites.Add(L""), std::invalid_argument);
}
Run Code Online (Sandbox Code Playgroud)

那么,我的问题是我应该:

  1. 永远不要测试合同所涵盖的条件,或
  2. 在单元测试期间以某种方式禁用合同检查?

je4*_*e4d 5

您需要确定将空字符串传递给该函数是否是未定义的行为,或者它的合同是否保证如果传递空字符串则抛出异常.

听起来你的意图是它是未定义的行为,即合同没有说明如果传递空字符串会发生什么.在这种情况下,测试合同验证的最简单方法是将负面测试的单元测试构建为特殊构建,并REQUIRE修改为抛出一些"先决条件违反"异常,然后您将测试ASSERT_THROW

我强烈建议观看John Lakos在ACCU 2011上关于防守编程的演讲,它涵盖了这个问题