茶上月 2015-04-10 16:13 采纳率: 45.5%
浏览 4721
已采纳

如何编写一段c++测试代码

如题,我是一位初学者,现有一道题如下:
编一段代码,分别实现插入排序,合并排序和快速排序的算法。然后编写测试代码,设计测试数据集,编写测试程序,测试正确性、算法复杂性和效率。

题目中注明检测正确性的测试程序应该输出一个遍历结果,保证所有分支语句都检测到。不太理解这是要我做什么……以及比较算法复杂性、效率,是需我明确地输出花费时间吗?

希望有大神可以在测试代码这方面指点迷津,谢谢!

  • 写回答

4条回答 默认 最新

  • threenewbee 2015-04-11 01:13
    关注

    "主要是你要准备足够充分的测试数据,这样才能保证代码的覆盖率。"
    这种说法是不对的。测试就是要用尽可能少的测试用例,对代码做尽可能全面的测试。构造测试用例是一个需要技巧的工作。“充分、足够的数据”是一个模糊的概念,如果不加选择的使用大量测试数据,不但大大增加测试花费的时间,而且对于一些代码路径,仍然可能无法覆盖。

    这里举一个例子:

     int foo(int x, int y, int z)
    {
        if (z == 0)
            {
                x = 1;
                    y = -1;
            }
        if (x > 0)
            {
                if (y > 0)
                    {
                        return 1;
                    }
                    else
                    {
                        return 2;
                    }
            }
            else
            {
                if (y > 0)
                    {
                        return 3;
                    }
                    else
                    {
                        return 4;
                    }
            }
    }
    

    对于这样一段代码,要想在测试中覆盖所有的代码路径,需要设计至少多少个测试用例?
    答案是8种:
    x y z
    -1 -1 0
    -1 1 0
    1 -1 0
    1 1 0
    -1 -1 1
    -1 1 1
    1 -1 1
    1 1 1

    可见,覆盖所有代码路径就是,确保程序的所有分支的排列组合都尝试过。

    现在再问你,要覆盖所有的代码分支,又需要多少测试用例?答案是5种
    x y z
    1 1 0
    -1 -1 1
    -1 1 1
    1 -1 1
    1 1 1
    (当然答案不唯一)
    可见,覆盖代码分支,就是确保代码中所有的分支都执行到。但是不覆盖全部的排列组合。

    在真实情况下,覆盖所有路径往往是办不到的,因为程序大一些,那么分支组合的数量是天文数字。一般我们考察的是代码分支的覆盖率。在完备的测试中,要求100%覆盖所有的代码。
    是不是覆盖了所有的路径(如果可能)就能确保程序正确?不一定,因为即便是同一个路径,也可能因为不同的测试数据,而造成不同的行为。

    所以,构造测试用例是一个非常有技巧的事情。测试者必须根据他的经验,尽可能测试到极端的、临界的条件,将从概率上很低发生但是可能导致程序出错的条件提取出来。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥30 Matlab打开默认名称带有/的光谱数据
  • ¥50 easyExcel模板 动态单元格合并列
  • ¥15 res.rows如何取值使用
  • ¥15 在odoo17开发环境中,怎么实现库存管理系统,或独立模块设计与AGV小车对接?开发方面应如何设计和开发?请详细解释MES或WMS在与AGV小车对接时需完成的设计和开发
  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格