单元测试没有失败但挂在子程序调用上

时间:2015-12-18 11:21:20

标签: c++

我使用Visual Studio 2015内置的测试框架对以下C ++代码进行单元测试。当我运行下面的测试时,没有抛出任何错误(代码编译),但测试只是挂起。只有在我已经注释掉哪个调用averageGradient的行时才会执行此操作。这是为什么?

float averageGradient(int x1, int x2) {
    int i = 0, y1 = 0, y2 = 0;
    while (i < graph.size() && (y1 == 0 || y2 == 0)) {     //if both y values haven't been solved then keep trying
        if (x1 >= graph[i][0] && x1 < graph[i][1]) {       // if x1 lies in the first straight line segment
            y1 = (graph[i][2] * x1) + graph[i][2];         // then calculate it's y value (y1)
        }
        else if (x2 >= graph[i][0] && x2 < graph[i][1]) {  //try the same thing for x2
            y2 = (graph[i][2] * x2) + graph[i][3];         //calculate its y value (y2)
        }
        else { i++; }                                      //otherwise incriment i to check the next straight line segment
    }
    float m = (y2 - y1) / (x2 - x1);
    return m;
};

单元测试:

    TEST_METHOD(Average_Gradient) {
        int x1 = 683675;
        int x2 = x1 + 86400;
        //float gradient = averageGradient(x1, x2);
        float answer = 0.0000895684639;
        //Assert::AreEqual(answer, gradient);
    }

1 个答案:

答案 0 :(得分:2)

您的代码中存在无限循环。这与单元测试无关。

float averageGradient(int x1, int x2) {
    int i = 0, y1 = 0, y2 = 0;
    while (i < graph.size() && (y1 == 0 || y2 == 0))    // 1
    {    
        if (x1 >= graph[i][0] && x1 < graph[i][1])      // 2
        {       
            y1 = (graph[i][2] * x1) + graph[i][2];      // 3       
        }
        else if (x2 >= graph[i][0] && x2 < graph[i][1]) // 4   
        { 
            y2 = (graph[i][2] * x2) + graph[i][3];         
        }
        else { i++; }                                      
    }
    float m = (y2 - y1) / (x2 - x1);
    return m;
};
  1. 在循环的第一次迭代中,让我们假设标有// 2的行中的条件为真。
  2. 您输入第// 3行,然后更改y1iy2未被修改。
  3. 现在你进入下一次迭代。
    • i尚未更改,因此i < graph.size()仍然有效。
    • y2尚未更改,因此(y1 == 0 || y2 == 0)仍然有效。
  4. 因此,您转到第// 2行:条件再次成立,因为x1graph[]值均未发生变化。
  5. 执行输入// 3y1未修改
  6. 继续执行3.(无限循环)
  7. 如果您的第一次迭代输入// 4而不是// 2,则会发生同样的事情。

    您应该只需在调试器下运行代码即可轻松分析。