我使用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);
}
答案 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;
};
// 2
的行中的条件为真。 // 3
行,然后更改y1
。 i
和y2
未被修改。i
尚未更改,因此i < graph.size()
仍然有效。y2
尚未更改,因此(y1 == 0 || y2 == 0)
仍然有效。// 2
行:条件再次成立,因为x1
和graph[]
值均未发生变化。// 3
,y1
未修改如果您的第一次迭代输入// 4
而不是// 2
,则会发生同样的事情。
您应该只需在调试器下运行代码即可轻松分析。