单元测试数学C ++例程

时间:2015-12-16 13:46:52

标签: c++ unit-testing

测试数学例程的最佳实践是什么?我正在使用下面的例程并尝试为它编写单元测试(我只是在学习单元测试)。我正在使用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;
};

3 个答案:

答案 0 :(得分:3)

  1. 让您的单元测试从文本文件中读取输入和预期输出。这使得生成和区分值更容易,而不是机制。
  2. 显式测试所有边界,例如INT_MIN,INT_MIN + 1,-1,0,1,INT_MAX-1,INT_MAX。对于浮点,请尝试输入INF和NAN。如果没有别的,您的测试可以帮助您记录您的函数在存在这些值时所执行的操作。
  3. 如果你确信你的算法现在是正确的,那么写一大堆随机输入,生成输出,检查它们是否合理,然后检查它们。如果结果将来发生变化,这将提醒你。这是&#34;黑盒子&#34;测试,意味着你没有明确知道&#34;正确的&#34;值是,但如果你相信今天的算法是正确的,你想确保它没有改变。

答案 1 :(得分:1)

您预先计算了预期结果(可能是数学应用程序或表格数据)并将其设置为#34;硬编码&#34;断言中的值:

AssertEqual(calculatePiFirst6Decimals(), 3.141519);

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

答案 2 :(得分:0)

我不明白。

var a = knownParameter1;
var b = knownParameter2;
var c = knownParameter3;
var ret = knownReturnValue;
Assert(ret == averageGradient(a, b, c));

你没有再写相同的代码......