测试用例和断言陈述

jan*_*jan 12 defensive-programming

这个问题的代码让我思考

assert(value>0); //Precondition
if (value>0)
{
  //Doit
}
Run Code Online (Sandbox Code Playgroud)

我从不写if语句.断言就足够/你可以做的一切."早点崩溃,经常崩溃"

CodeComplete说明:

  • assert语句使应用程序正确
  • if-test使应用程序更健壮

我不认为您通过更正无效输入值或跳过代码使应用程序更加健壮:

assert(value >= 0 );  //Precondition
assert(value <= 90);  //Precondition
if(value < 0)         //Just in case
  value = 0;
if (value > 90)       //Just in case
  value = 90;
//Doit
Run Code Online (Sandbox Code Playgroud)

这些更正是基于您对外部世界的假设.只有调用者知道你的函数的"有效输入值"是什么,并且他必须在调用你的函数之前检查它的有效性.

CodeComplete来解释:" 当我们依赖于断言时,真实世界的程序会变得太乱."

问题:我错了,顽固,愚蠢,太不防守......

Tni*_*son 10

信任Asserts的问题在于它们可能在生产环境中被关闭.引用维基百科文章:

大多数语言允许在全局启用或禁用断言,有时独立启用或禁用断言.断言通常在开发期间启用,在最终测试期间和向客户发布时禁用.不检查断言,避免评估断言的成本,而假设断言没有副作用,在正常条件下仍然产生相同的结果.在异常情况下,禁用断言检查可能意味着已中止的程序将继续运行.这有时是优选的. 维基百科

因此,如果您的代码的正确性依赖于Asserts,那么您可能会遇到严重的问题.当然,如果代码在测试期间工作,它应该在生产期间工作...现在进入第二个工作代码的人,只是要解决一个小问题......