gpt4 book ai didi

c++ - 单元测试没有失败但卡在子程序调用上

转载 作者:行者123 更新时间:2023-11-28 02:14:42 24 4
gpt4 key购买 nike

我正在使用 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 , 并更改 y1 . iy2没有被修改。
  3. 现在您进入下一个迭代。
    • i没有改变所以i < graph.size()仍然如此。
    • y2没有改变所以(y1 == 0 || y2 == 0)仍然如此。
  4. 因此,您转到行 // 2 : 条件再次为真,因为 x1 都不是也不graph[]值(value)观已经改变。
  5. 执行输入// 3 , y1未修改
  6. 执行在 3 处继续。(无限循环)

如果您的第一次迭代输入 // 4而不是 // 2 , 同样的事情发生了。

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

关于c++ - 单元测试没有失败但卡在子程序调用上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34354498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com