1

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

#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))

请帮助我。提前致谢。

4

1 回答 1

0

这是为什么代码覆盖率有点灰色的一个例子。它作为一个指标很有用,但它并不透明。

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

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

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

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

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

if (b<10 && b>0 && a!=1 && a!=4)
于 2015-06-24T10:36:47.783 回答