C++ 单元测试数学C++;常规

C++ 单元测试数学C++;常规,c++,unit-testing,C++,Unit Testing,测试数学例程的最佳实践是什么。我正在使用下面的例程,并试图为它编写一个单元测试(我正在学习单元测试)。我正在使用VisualStudio内置框架 每当我开始尝试使用Assert命令根据已知的正确答案检查实际值时,我都会编写与我测试的代码相同的代码来进行比较,这显然不能证明任何事情。处理这个问题的常规方法是什么 int averageGradient(int x1, int x2, float m) { int i = 0, y1 = 0, y2 = 0; while (y1 !=

测试数学例程的最佳实践是什么。我正在使用下面的例程,并试图为它编写一个单元测试(我正在学习单元测试)。我正在使用VisualStudio内置框架

每当我开始尝试使用
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平均梯度(int-x1,int-x2,浮点m){
int i=0,y1=0,y2=0;
而(y1!=0&&y2!=0){//如果两个y值都未求解,则继续尝试
如果(x1>=图[0][i]&&x1<图[1][i]&&y1==0){//如果x1位于第一条直线段中
y1=(图[2][i]*x1)+图[3][i];//然后计算它的y值(y1)
}
else{i++;}//否则我将检查下一条直线段
如果(x2>=graph[0][i]&&x2
您预先计算了预期结果(可能是数学应用程序或表格数据),并将“硬编码”值放入断言中:

AssertEqual(calculatePiFirst6Decimals(), 3.141519);

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

您预先计算了预期结果(可能是使用数学应用程序或表格数据),并将“硬编码”值放入断言中:

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

  • 让单元测试从文本文件中读取输入和预期输出。这使得生成和区分值比机制更容易
  • 显式测试所有边界,例如INT_MIN、INT_MIN+1、-1、0、1、INT_MAX-1、INT_MAX。对于浮点,请尝试输入INF和NAN。如果没有其他方法,您的测试可以帮助您记录在存在这些值的情况下函数所做的操作
  • 如果您现在确信您的算法是正确的,那么编写一大组随机输入,生成输出,抽查它们的合理性,然后将它们检入。如果结果在将来发生变化,这将提醒您。这是“黑盒”测试,意味着您不明确知道“正确”值是什么,但如果您认为今天的算法是正确的,您需要确保它不会改变
  • 让单元测试从文本文件中读取输入和预期输出。这使得生成和区分值比机制更容易
  • 显式测试所有边界,例如INT_MIN、INT_MIN+1、-1、0、1、INT_MAX-1、INT_MAX。对于浮点,请尝试输入INF和NAN。如果没有其他方法,您的测试可以帮助您记录在存在这些值的情况下函数所做的操作
  • 如果您现在确信您的算法是正确的,那么编写一大组随机输入,生成输出,抽查它们的合理性,然后将它们检入。如果结果在将来发生变化,这将提醒您。这是“黑盒”测试,意味着您不明确知道“正确”值是什么,但如果您认为今天的算法是正确的,您需要确保它不会改变
  • 我不明白

    var a = knownParameter1;
    var b = knownParameter2;
    var c = knownParameter3;
    var ret = knownReturnValue;
    Assert(ret == averageGradient(a, b, c));
    
    你不再写同样的代码了…

    我不明白

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

    您不再编写相同的代码了…

    您通常有一组固定的参数值,这些值是您知道结果的。然后只需检查函数的结果是否是您期望的特定参数的结果。测试是否显示您只返回y1?哦,您确实需要阅读,因为我敢打赌
    return
    语句不会执行您期望它执行的操作。@JoachimPileborg:我会继续复制并粘贴您的注释作为答案,因为我真的认为这是值得拥有的。@JoachimPileborg:哦,roberto更快:)你通常有一组固定的参数值,这些值你知道结果。然后只需检查函数的结果是否是您期望的特定参数的结果。测试是否显示您只返回y1?哦,您确实需要阅读,因为我敢打赌
    return
    语句不会执行您期望它执行的操作。@JoachimPileborg:我会继续复制并粘贴您的注释作为答案,因为我真的认为这是值得拥有的东西。@JoachimPileborg:哦,罗伯托跑得更快:)