繁体   English   中英

单元测试数学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;
};
  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));

您不会再写相同的代码了...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM