单元测试未失败,但挂起子例程调用 我使用VisualStudio 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; };

单元测试未失败,但挂起子例程调用 我使用VisualStudio 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; };,c++,C++,代码中有一个无限循环。这与单元测试无关 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

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

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;
};
浮点平均梯度(int-x1,int-x2){
int i=0,y1=0,y2=0;
而(i=图[i][0]&&x1<图[i][1])//2
{       
y1=(图[i][2]*x1)+图[i][2];//3
}
else如果(x2>=图[i][0]&&x2<图[i][1])//4
{ 
y2=(图[i][2]*x2)+图[i][3];
}
else{i++;}
}
浮点数m=(y2-y1)/(x2-x1);
返回m;
};
  • 在循环的第一次迭代中,假设标有
    //2
    的行中的条件为真
  • 输入第
    /3行
    ,然后更改
    y1
    <代码>i和
    y2
    不被修改
  • 现在进入下一个迭代。
    • i
      没有改变,因此
      i
      仍然为真
    • y2
      没有改变,所以
      (y1==0 | | y2==0)
      仍然正确
  • 因此,转到第
    //2行:条件再次为真,因为
    x1
    graph[]
    值均未更改
  • 执行进入
    /3
    y1
    未修改
  • 3点继续执行。(无限循环)
  • 如果第一次迭代输入的是
    //4
    ,而不是
    //2
    ,则会发生同样的情况


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

    与单元测试无关。简单地说,您的平均梯度计算函数挂起。@YeldarKurmangaliyev好的,我将更改标记-我不确定,因为我对单元测试真的很陌生。但是,代码确实在运行,那么为什么在测试时它会挂起?在单元测试之外调用的函数是否正常工作?为什么函数末尾有分号?@GeorgeEdwards尝试使用相同的值运行您的方法。它也应该挂起来。谢谢你发现了这个!
    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;
    };