单元测试不会失败,但挂在子例程调用上
Unit testing not failing but hanging on subroutine call
我正在使用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;
};
- 在循环的第一次迭代中,让我们假设标有
// 2
的行中的条件为真。 - 输入第
// 3
行,然后更改y1
。i
和y2
不会修改。 - 现在你转到下一个迭代。
-
i
没有改变i < graph.size()
所以仍然是真的。 -
y2
没有改变(y1 == 0 || y2 == 0)
所以仍然是真的。
-
- 因此,您转到第
// 2
行:条件再次为真,因为x1
和graph[]
值都没有改变。 - 执行进入
// 3
,y1
不被修改 - 执行在 3 时继续。(无限循环(
如果你的第一次迭代进入// 4
而不是// 2
,也会发生同样的事情。
您应该能够通过在调试器下运行代码来轻松分析这一点。
相关文章:
- 子例程,不使用 pow,并带有参数和返回
- 如何将C++子例程链接到 x86 程序集程序?
- 调用子例程时类型不匹配
- 将分配给C++数组传递给 Fortran 子例程
- Android Studio 3.1.2 - 无法运行C++子例程"No implementation found for Java.lang.String..."
- 试图在C 中调用Fortran子例程
- Visual MSVC C 调用GFORTRAN子例程
- 从C 调用Fortran子例程会产生非法参数值
- 将类对象指针传递给默认构造函数(C 子例程)
- 如何从子例程函数获取到 main 函数的返回值
- 确定未在 Fortran 子例程顶部声明的变量类型
- 子例程在 MIPS 上调用了两次
- 从 C++ 调用 Fortran 子例程
- 将C++函数指针传递到Fortran子例程
- 如何使用传递到当前子例程中的参数调用不同的子例程(用于递归)
- 在主程序或函数子例程中使用数组的差异
- 如何将 fortran 子例程链接到 cpp 主程序
- 将C++数组传递给Fortran子例程会导致nan值出现在结果中
- 单元测试不会失败,但挂在子例程调用上
- 调用子类的子例程后指针消失