在Qt中对非返回函数进行单元测试

时间:2019-06-26 08:16:32

标签: c++ qt unit-testing qt-creator

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

例如,我得到了该功能:

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以显示修改后的图像。

有人已经遇到过类似的事情吗?

1 个答案:

答案 0 :(得分:3)

如果它以常规方式或通过输出参数返回值,则没有区别。无论如何,该过程是相同的。运行该函数并检查输出参数是否具有期望值。

这是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);

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