单元测试不会失败,但挂在子例程调用上

Unit testing not failing but hanging on subroutine call

本文关键字:子例程 调用 失败 单元测试      更新时间:2023-10-16

我正在使用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);
    }

代码中有一个无限循环。这与单元测试无关。

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 时继续。(无限循环(

如果你的第一次迭代进入// 4而不是// 2,也会发生同样的事情。

您应该能够通过在调试器下运行代码来轻松分析这一点。