测试用例VS ASSERTION语句

pop*_*ome 9 c++ tdd defensive-programming

在我的大多数C++项目中,我大量使用ASSERTION语句如下:

int doWonderfulThings(const int* fantasticData)
{
    ASSERT(fantasticData);
    if(!fantasticData)
        return -1;
    // ,,,
    return WOW_VALUE;
}
Run Code Online (Sandbox Code Playgroud)

但TDD社区似乎喜欢这样做:

int doMoreWonderfulThings(const int* fantasticData)
{
    if(!fantasticData)
        return ERROR_VALUE;
    // ...
    return AHA_VALUE;
}

TEST(TDD_Enjoy)
{
    ASSERT_EQ(ERROR_VALUE, doMoreWonderfulThings(0L));
    ASSERT_EQ(AHA_VALUE, doMoreWonderfulThings("Foo"));
}
Run Code Online (Sandbox Code Playgroud)

根据我的经验,第一种方法让我删除了许多微妙的错误.但TDD方法是处理遗留代码的非常聪明的想法.

"谷歌" - 他们将"第一种方法"与"带着救生衣走在岸边,没有任何安全防护的游泳海洋"进行比较.

哪一个更好?哪一个使软件健壮?

Mar*_*ade 0

我不知道您指的是哪个特定的 TDD 子社区,但我遇到的 TDD 模式要么使用 Assert.AreEqual() 来获得积极结果,要么使用 ExpectedException 机制(例如 .NET 中的属性)来声明应注意的错误。