单元测试数学C++例程

Unit Testing Mathematical C++ routine

本文关键字:例程 C++ 单元测试      更新时间:2023-10-16

测试数学例程的最佳实践是什么。我正在使用下面的例程,并试图为它编写一个单元测试(我只是在学习单元测试)。我使用的是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;
};
  1. 让您的单元测试从文本文件中读取它们的输入和预期输出。这使得生成和区分值比机制更容易
  2. 显式测试所有边界,如INT_MIN、INT_MIN+1、-1、0、1、INT_MAX-1、INT_MAX。对于浮点,请尝试输入INF和NAN。如果没有其他东西,您的测试可以帮助您记录在这些值存在的情况下您的函数所做的事情
  3. 如果你现在确信你的算法是正确的,那么写一大组随机输入,生成输出,抽查它们的健全性,然后检查它们。如果未来结果发生变化,这会提醒你。这是"黑盒"测试,意味着你不清楚"正确"的值是什么,但如果你相信今天的算法是正确的,你需要确保它不会改变

您预先计算您的预期结果(可能是使用数学应用程序或表格数据),并将该"硬编码"值放入您的Assert:中

AssertEqual(calculatePiFirst6Decimals(), 3.141519);

方法是测试已知值/结果(否则测试某个东西没有意义,无法验证)。然后还应该测试已知的边缘情况(例如,当参数取极值或需要特别小心时)

我不明白。
var a = knownParameter1;
var b = knownParameter2;
var c = knownParameter3;
var ret = knownReturnValue;
Assert(ret == averageGradient(a, b, c));

你不会再写同样的代码了。。。