【问题标题】:How to test inside a for loop (unit testing)如何在 for 循环中进行测试(单元测试)
【发布时间】:2015-01-25 11:18:32
【问题描述】:

我正在使用 VectorCAST 进行单元测试,使用 Green Hills 编译器和 Renesas v850e2v3 微控制器,VectorCAST 表明我在以下 for 循环中有两个分支要测试。

typedef enum
{
    MIN_ENUM_VAL = 0x00,
    ENUM_VAL_1   = 0x01,
    ENUM_VAL_2   = 0x02,
    MAX_ENUM_VAL
} Enumeration_T;

void myFunction (void)
{
    int counter;
    for(counter = MIN_ENUM_VAL; counter < MAX_ENUM_VAL; counter++)
    {
        //Do something.
    }

    //Do something else.
}

如何测试这些分支?真的我不知道如何在 for 循环中进行测试。

【问题讨论】:

    标签: unit-testing greenhills


    【解决方案1】:

    如果您在 myFunction() 下插入一个测试用例并运行它,它应该会自动通过两个分支,因为小于 MAX_ENUM_VAL 的枚举值满足“真”分支,而 MAX_ENUM_VAL 满足“假”分支。 VectorCAST 将 for 循环中的分支理解为相对于中间子语句的条件分支。可以通过插入基础路径测试用例,然后阅读生成的测试用例的注释部分看到。

    【讨论】:

      【解决方案2】:

      你的定义看起来很可疑:

      typedef enum
      {
          MIN_ENUM_VAL = 0x00,
          ENUM_VAL_1   = 0x01,
          ENUM_VAL_2   = 0x02,
          MAX_ENUM_VAL
      } Enumeration_T;
      

      你真的是说第一个enum 值是10 呢?这是法律价值吗? MIN_ENUM_VAL 真的是 0 吗?还是1?我已经预料到了:

      MIN_ENUM_VAL = 0x00,
      ENUM_VAL_1   = MIN_EUM_VAL,
      

      MAX_ENUM_VAL 是一个更常规的定义。不正确,但有规律。正确的“最大值”是2 - 你所拥有的“正常”定义是LAST_ENUM_VAL,它比真正的“最大值”或“最后一个”多一个(虚伪,我知道。但是谁定义了这些约定无论如何?)。

      【讨论】:

      • 我不能修改代码,我只是在做单元测试。但是,我理解你的意思,你提到的是常规方法。
      【解决方案3】:

      根据您选择的代码覆盖率和选项,您可以启用或禁用循环控制变量的分支条件。测量循环代码覆盖率背后的想法是确保循环内的语句执行到最后,即不执行。迭代以确保表达式按照设计进行评估。它可能发生在循环进行到一半之后,会产生一些异常,并且在指定的循环迭代完成之前控制将退出 for 循环。

      查看您的 for 循环示例,如果循环执行 counter=MIN_ENUM_VAL 到 counter=MAX_ENUM_VAL,那么该工具将显示您已涵盖条件 counter 的 True 和 False 分支除非循环体有一些条件会在 counter=MAX_ENUM_VAL 之前调用中断。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-05
        • 2012-01-08
        • 2012-09-11
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 2019-11-02
        • 1970-01-01
        相关资源
        最近更新 更多