【问题标题】:Issue with examples of decision and statement coverage disadvantage决策和语句覆盖劣势示例的问题
【发布时间】:2013-02-21 07:44:13
【问题描述】:

我正在研究这些之间的区别,但无法理解其中的区别。对我来说似乎是一样的。 他们不一样吗?风险来自短路,不是吗?

语句覆盖不需要测试逻辑运算符。在 C++ 中 和 C 这些运算符是 &&、|| 和 ?:。声明覆盖率不能 将由逻辑运算符分隔的代码与其他代码区分开来 该声明。执行语句中的任何部分代码都会导致 声明覆盖声明整个声明完全覆盖。什么时候 逻辑运算符避免不必要的评估(通过短路), 语句覆盖率给出了一个夸大的覆盖率测量。

void function(const char* string1, const char* string2 = NULL);
...
void function(const char* string1, const char* string2)
{
    if (condition || strcmp(string1, string2) == 0) // Oops, possible null pointer passed to strcmp
    ...
}

决策覆盖率 - 一个缺点是该指标忽略了 由于短路而发生的布尔表达式中的分支 运营商。例如,考虑以下 C/C++/Java 代码 片段:

if (condition1 && (condition2 || function1()))
    statement1;
else
    statement2;

【问题讨论】:

    标签: testing code-coverage logical-operators


    【解决方案1】:

    它们略有不同,但都需要短路操作来证明您正确推测的问题。

    语句覆盖率问题

    if (complex-condition-evaluation-with-short-circuits) 
      doAction(); 
    

    语句覆盖率可能会记录您访问了上述两行,但您可能永远不知道您是否执行了仅评估部分复杂条件的场景。

    即在您的示例中,strcmp(...) 曾经被执行过吗?

    分支机构覆盖率问题

    if (complex-condition-evaluation-with-short-circuits) 
      doAction(); 
    else
      doOtherAction(); 
    

    分支覆盖可能会记录您通过(源)代码中的所有路径,但会忽略作为复杂条件评估一部分的分支(如上所述)。

    即在您的示例中,分支覆盖不将 || 视为备用分支,并将其视为仅通过代码的两条路径,而实际上它是四个。

    path1 (calls doAction) => condition1 == true, condition2 == true, function1() == ?
    path2 (calls doAction) => condition1 == true, condition2 == false, function1() == true
    path3 (calls doOtherAction) => condition1 == true, condition2 == false, function1() == false
    path4 (calls doOtherAction) => condition1 == false, condition2 == ?, function1() == ?
    

    希望对你有帮助

    【讨论】:

    • 谢谢。仅针对分支覆盖范围,我不明白您所说的四个分支是什么意思-我认为它总是对或错。
    • if(...) 将评估为 true/false,但您需要在 4 种情况下对其进行测试,以通过代码全面测试所有分支/路径。即在测试中我可以执行路径,以便我访问 statement1 和 statement2 而无需执行 function1() - 这很糟糕,因为 function1 可能有错误,我们不想在生产中发现它。
    【解决方案2】:

    据我所知,这些示例中的风险来自短路,它们确实是等价的。在其他一些情况下,可能会有所不同。例如考虑以下情况:

    if (a>5)
        b = 6
    if (a<20)
        c = 4 + b
    

    对于语句覆盖率,使用a=10 进行测试就足够了(所有行都将被执行)并且测试将通过。

    对于决策覆盖,有必要评估所有 if 语句的真假。例如,可以通过两个测试 a=30a=0 来实现 100% 的决策覆盖率。后者将失败,因为在这种情况下没有设置变量 b

    因此,决策覆盖更强大;实际上 100% 的决策覆盖率保证了 100% 的语句覆盖率,但反之则不然。但是,仍然可以构建决策覆盖率不足以暴露错误的示例,无论该语言是否存在短路。

    让我们考虑一种不会发生短路的情况

    if (a>0 || b>0)
        c = 5 / b
    

    让我们用输入数据 a=0 来测试一下; b=1; a=0,b=0。第一个足以提供语句覆盖。两者一起提供决策覆盖。但两者都没有在 if 中公开除以零。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2019-12-23
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多