Qt中的单元测试非返回函数[关闭]

Posted

技术标签:

【中文标题】Qt中的单元测试非返回函数[关闭]【英文标题】:Unit Testing non returning functions in Qt [closed] 【发布时间】:2019-06-26 08:16:32 【问题描述】:

您可能还记得我或运行一种“Lightroom”面板,使用 C++ 和 Qt 作为 GUI。 今天我正在阅读有关为我的主类实现单元测试的内容,但我的问题是,如何测试一个不返回任何内容的函数?

例如,我得到了那个功能:

void ImgProcessing::processMaster(cv::Mat& img, cv::Mat& tmp, int brightness, int red, int green, int blue, double contrast)

for(int i = 0; i < img.rows; i++)
    for(int j = 0; j < img.cols; j++)
        for(int k = 0; k < 3; k++)
            if(k == 0)  //_R
                tmp.at<cv::Vec3b>(i,j)[k] = cv::saturate_cast<uchar>((img.at<cv::Vec3b>(i,j)[k] + brightness + red )*(259 * (contrast + 255) / (255 * (259 - contrast))));
            if(k == 1)  //_G
                tmp.at<cv::Vec3b>(i,j)[k] = cv::saturate_cast<uchar>((img.at<cv::Vec3b>(i,j)[k] + brightness + green )*(259 * (contrast + 255) / (255 * (259 - contrast))));
            if(k == 2)  //_B
                tmp.at<cv::Vec3b>(i,j)[k] = cv::saturate_cast<uchar>((img.at<cv::Vec3b>(i,j)[k] + brightness + blue )*(259 * (contrast + 255) / (255 * (259 - contrast))));
                    

这个函数只取 obj 'mat img',并修改 'mat tmp' obj。 而不是通过在我的 gui 类中使用另一个专用函数来更新 UI 以显示修改后的图像。

有人遇到过这样的事情吗?

【问题讨论】:

这是一个正常的返回函数。它修改了tmpimg,即这些参数用于存储返回的结果。 前置条件和后置条件是什么?这就是您要测试的内容。函数是否返回某些东西是次要的。即使是void foo();,要么有可以检查的后置条件,要么一开始就无法测试 为了比较:void f() for(;;) 将是一个非返回函数,来自现实世界的示例是 exit 函数或 execve 系列的函数(不返回 除非 有一些错误)。 【参考方案1】:

如果它以常规方式或通过输出参数返回值,则没有区别。反正程序是一样的。运行函数并检查输出参数是否具有预期值。

这是 C 代码,但对于理解这个概念并没有什么不同。考虑这些函数:

int addOne1(int x)  return x+1; 

void addOne2(int x, int* ret)  *ret = x+1; 

现在可以用这种方式测试这些:

const int x = 3;
int ret1, ret2;

ret1 = addOne1(x);
addOne2(x, &ret2);

assert(ret1 == 4);
assert(ret2 == 4);

如果输出参数也是输入参数,那么你当然需要确保你知道初始值。

void inc(int *x)  (*x)++; 

int x=3;
inc(&x);
assert(x == 4);

从技术上讲,修改参数被认为是副作用。但只要你小心,这不是什么大问题。与使用成员变量相比,差异是巨大的。如果你开始修改全局变量,你很快就会很难测试代码。

【讨论】:

感谢克鲁特!我明白这一点,所以在我的情况下,我主要需要比较图像 obj,就像在 Qt 中有 QCOMPARE(x,y) 在这种情况下,但它会处理我的必需品吗?我的意思是,对于我的相关功能,为了测试它,我必须将我的“mat tmp”obj 与另一个已经修改了一些值的“mat xxx”obj 进行比较? @AlessandroCerro 现在去吃午饭了。稍后再联系您。 @AlessandroCerro 您可以只比较单个成员:QCOMPARE(mat.whatever, 7) 将答案概括一下:您可以对 any 函数进行单元测试,该函数会在系统中产生一些可观察到的变化。这可能包括更改全局变量、发出信号、调用其他函数(您可能需要交换这些函数以便能够适当地观察;交换后的函数可能只是增加您在另一个地方评估的一些计数器)。 @AlessandroCerro 我对用于单元测试的 Qt 框架一无所知。但原则上是的。使用预期值创建一个Mat 对象,然后将结果与之进行比较。

以上是关于Qt中的单元测试非返回函数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何对非导出函数进行单元测试?

python单元测试之unittest框架

Qt单元测试工具 QTestlib(QVERIFY, QFETCH, QCOMPARE等)

python单元测试之unittest框架使用总结

Django中的单元测试以及Python单元测试

开玩笑单元测试返回“MongoError:拓扑被破坏”