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