【问题标题】:unit testing Coverage Issue单元测试覆盖问题
【发布时间】:2015-06-24 08:11:18
【问题描述】:

我的最终目标是覆盖下面的代码(使完整的代码变成绿色)。我正在使用康塔塔工具。

#define CHECK1 ((a == 1) || (a == 4))


void check_fun(int a, int b)
{
                if((!CHECK1)&&(b>0)&&(b<10))
                {
                }
}

我写了5个测试用例如下

    void test_check_fun(int doIt){
if (doIt) {
    /* Test case data declarations */
    int a;
    int b;


    START_TEST("test_check_fun_001",
               "<Entry condition: True check for if((!((a == 1) || (a == 4)))&&(b>0)&&(b<10)) ((!(F||F))&&(T)&&(T)) equalent to (T&&T&&T)>");

        /* Expected Call Sequence  */
        EXPECTED_CALLS("");

                /* Set global data */
                initialise_global_data();
                a = 3;
                b = 5;

                /* Set expected values for global data checks */
                initialise_expected_global_data();

            /* Call SUT */
            check_fun(a, b);

            /* Test case checks */
            /* Checks on global data */
            check_global_data();
        END_CALLS();
    END_TEST();

        START_TEST("test_check_fun_002",
               "<Entry condition: False check for if((!((a == 1) || (a == 4)))&&(b>0)&&(b<10)) ((!(T||F))&&(T)&&(T)) equalent to (F&&T&&T)>");

        /* Expected Call Sequence  */
        EXPECTED_CALLS("");

                /* Set global data */
                initialise_global_data();
                a = 1;
                b = 5;

                /* Set expected values for global data checks */
                initialise_expected_global_data();

            /* Call SUT */
            check_fun(a, b);

            /* Test case checks */
            /* Checks on global data */
            check_global_data();
        END_CALLS();
    END_TEST();

        START_TEST("test_check_fun_003",
               "<Entry condition: False check for if((!((a == 1) || (a == 4)))&&(b>0)&&(b<10)) ((!(F||T))&&(T)&&(T)) equalent to (F&&T&&T)>");

        /* Expected Call Sequence  */
        EXPECTED_CALLS("");

                /* Set global data */
                initialise_global_data();
                a = 4;
                b = 5;

                /* Set expected values for global data checks */
                initialise_expected_global_data();

            /* Call SUT */
            check_fun(a, b);

            /* Test case checks */
            /* Checks on global data */
            check_global_data();
        END_CALLS();
    END_TEST();

        START_TEST("test_check_fun_004",
               "<Entry condition: False check for if((!((a == 1) || (a == 4)))&&(b>0)&&(b<10)) ((!(F||F))&&(F)&&(T)) equalent to (T&&F&&T)>");

        /* Expected Call Sequence  */
        EXPECTED_CALLS("");

                /* Set global data */
                initialise_global_data();
                a = 3;
                b = -1;

                /* Set expected values for global data checks */
                initialise_expected_global_data();

            /* Call SUT */
            check_fun(a, b);

            /* Test case checks */
            /* Checks on global data */
            check_global_data();
        END_CALLS();
    END_TEST();

        START_TEST("test_check_fun_005",
               "<Entry condition: False check for if((!((a == 1) || (a == 4)))&&(b>0)&&(b<10)) ((!(F||F))&&(T)&&(F)) equalent to (T&&T&&F)>");

        /* Expected Call Sequence  */
        EXPECTED_CALLS("");

                /* Set global data */
                initialise_global_data();
                a = 3;
                b = 11;

                /* Set expected values for global data checks */
                initialise_expected_global_data();

            /* Call SUT */
            check_fun(a, b);

            /* Test case checks */
            /* Checks on global data */
            check_global_data();
        END_CALLS();
    END_TEST();
}}

结果显示为

===========================================================================
= Cantata Test Harness v6.2                                               =
= (c) 2012 QA Systems GmbH                                                =
=-------------------------------------------------------------------------=
= Test Description: check                                                 =
=         Log File: test_check.ctr                                        =
=     Test Started: Wed Jun 24 12:10:56 2015                              =
===========================================================================
===========================================================================
= Test Finished: Wed Jun 24 12:10:56 2015                                 =
=-------------------------------------------------------------------------=
= Test                 Script  Checks  Checks  Checks  Call Seq     TEST  =
= Case                 Errors  Failed  Passed  Warned  Failures    RESULT =
=-------------------------------------------------------------------------=
= test_check_fun_001        0       0       0       3         0      PASS =
= test_check_fun_002        0       0       0       3         0      PASS =
= test_check_fun_003        0       0       0       3         0      PASS =
= test_check_fun_004        0       0       0       3         0      PASS =
= test_check_fun_005        0       0       0       3         0      PASS =
= Other                     0       0       4       0         0      PASS =
=-------------------------------------------------------------------------=
= TOTALS                    0       0       4      15         0      PASS =
===========================================================================

我的问题是某些代码没有显示为绿色。所以请告诉我我错过了哪些测试用例来涵盖以下条件

if((!((a == 1) || (a == 4)))&&(b>0)&&(b<10))

请帮助我。提前致谢。

【问题讨论】:

  • 我不禁觉得如果你的测试有有意义的名字,你会更容易理解你在测试什么。 1,2,3,4,5 不完全是描述性的..
  • 好吧抱歉我会编辑
  • 我已经编辑了描述

标签: c unit-testing code-coverage white-box white-box-testing


【解决方案1】:

这是为什么代码覆盖率是一个灰色度量的示例。作为指标有用,但不透明。

如果我将代码剪切并粘贴到 C# 中并运行相同的测试,我将获得 100% 的代码覆盖率,那么有什么区别?

根据您的编译器设置(您应该在关闭所有编译器优化的情况下测试覆盖率),C 编译器实际上可能会创建额外代码以优化某些流程,因此即使在您的逻辑中 (b&lt;10) 是只有一次检查,它可能会导致两个单独的代码指令被不同的流程使用通过其余的逻辑。如何报告这将取决于您的代码覆盖率工具如何评估覆盖率。

如果您真的想找出导致覆盖率下降的原因,那么您可以尝试删除检查的不同元素,以查看它有什么影响。您也可以尝试重新排列您的公式。在所有条件相同的情况下,最好先在逻辑中出现简单的故障,因为它减少了通过代码的流数。所以在下面的版本中,虽然结果应该是一样的,但是由于&amp;&amp;s在||之前,代码可能会有所不同。

if((b>0)&&(b<10)&&(!((a == 1) || (a == 4))))

您还可以删除括号,看看是否可以提高覆盖率。以下返回相同的结果,同时使您正在测试的内容更加明确。

if (b<10 && b>0 && a!=1 && a!=4)

【讨论】:

  • 我已经用 if (b0 && a!=1 && a!=4) 条件替换了我的条件,然后它显示完整的绿色。在这种情况下,我还将条件替换为 if((b>0)&&(b
猜你喜欢
  • 2013-04-16
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多