单元测试数学C++例程
Unit Testing Mathematical C++ routine
测试数学例程的最佳实践是什么。我正在使用下面的例程,并试图为它编写一个单元测试(我只是在学习单元测试)。我使用的是Visual Studio内置框架。
每当我开始尝试使用Assert
命令根据已知的正确答案检查实际值时,我都会编写与我正在测试的代码相同的代码来进行比较,这显然根本无法证明什么。处理这个问题的传统方法是什么?
int averageGradient(int x1, int x2, float m) {
int i = 0, y1 = 0, y2 = 0;
while (y1 != 0 && y2 != 0) { //if both y values haven't been solved then keep trying
if (x1 >= graph[0][i] && x1 < graph[1][i] && y1 == 0) { // if x1 lies in the first straight line segment
y1 = (graph[2][i] * x1) + graph[3][i]; // then calculate it's y value (y1)
}
else { i++; } //otherwise incriment i to check the next straight line segment
if (x2 >= graph[0][i] && x2 < graph[1][i]) { //try the same thing for x2
y2 = (graph[2][i] * x2) + graph[3][i]; //calculate its y value (y2)
}
else { i++; }
}
m = (y2 - y1) / (x2 - x1);
return m;
};
- 让您的单元测试从文本文件中读取它们的输入和预期输出。这使得生成和区分值比机制更容易
- 显式测试所有边界,如INT_MIN、INT_MIN+1、-1、0、1、INT_MAX-1、INT_MAX。对于浮点,请尝试输入INF和NAN。如果没有其他东西,您的测试可以帮助您记录在这些值存在的情况下您的函数所做的事情
- 如果你现在确信你的算法是正确的,那么写一大组随机输入,生成输出,抽查它们的健全性,然后检查它们。如果未来结果发生变化,这会提醒你。这是"黑盒"测试,意味着你不清楚"正确"的值是什么,但如果你相信今天的算法是正确的,你需要确保它不会改变
您预先计算您的预期结果(可能是使用数学应用程序或表格数据),并将该"硬编码"值放入您的Assert:中
AssertEqual(calculatePiFirst6Decimals(), 3.141519);
方法是测试已知值/结果(否则测试某个东西没有意义,无法验证)。然后还应该测试已知的边缘情况(例如,当参数取极值或需要特别小心时)
var a = knownParameter1;
var b = knownParameter2;
var c = knownParameter3;
var ret = knownReturnValue;
Assert(ret == averageGradient(a, b, c));
你不会再写同样的代码了。。。
相关文章:
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- c++类声明时,相同的例程,不同的成员变量类型
- C++为线程工作动态地分割例程
- 子例程,不使用 pow,并带有参数和返回
- 直接在RcppArmadillo中调用LAPACK例程
- 如何将C++子例程链接到 x86 程序集程序?
- PX 转换例程编译问题
- 成功完成TLS握手后,服务器关闭时出现错误的SSL例程:SSL3_GET_RECORD:错误的版本号
- 只允许授权代码调用库中的例程
- JNI 不满意链接错误: 动态链接库 (DLL) 初始化例程失败
- 调用子例程时类型不匹配
- 将分配给C++数组传递给 Fortran 子例程
- Android Studio 3.1.2 - 无法运行C++子例程"No implementation found for Java.lang.String..."
- Posix 线程类和启动例程 (pthread)
- OpenBLAS 只为一个例程设置线程数
- 检查并行化 BLAS 例程的结果
- 我们应该测量例程的平均执行时间还是最小执行时间?
- 试图在C 中调用Fortran子例程
- C++ 我的函数在我的 Image 类中工作,但不在主例程中工作
- Visual MSVC C 调用GFORTRAN子例程