Qt中的单元测试非返回函数
Unit Testing non returning functions in Qt
您可能记得我或 运行 一种 'Lightroom' 面板,使用 C++ 和 Qt for GUI。
今天我正在阅读关于为我的主要 classes 实施单元测试的内容,但我的问题是,我如何测试一个不 return 任何东西的函数?
例如,我得到了那个函数:
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。
比我更新 UI 以显示修改后的图像,通过在我的 gui class.
中使用另一个专用功能
有人遇到过这样的事情吗?
如果它 returns 是常规方式或通过输出参数的值,则没有区别。无论如何,程序都是一样的。 运行 函数并检查输出参数是否具有预期值。
这是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);
从技术上讲,修改参数被视为副作用。不过只要用心,问题不大。与使用成员变量相比,差异是巨大的。如果你开始修改全局变量,你很快就会很难测试代码。
您可能记得我或 运行 一种 'Lightroom' 面板,使用 C++ 和 Qt for GUI。 今天我正在阅读关于为我的主要 classes 实施单元测试的内容,但我的问题是,我如何测试一个不 return 任何东西的函数?
例如,我得到了那个函数:
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。 比我更新 UI 以显示修改后的图像,通过在我的 gui class.
中使用另一个专用功能有人遇到过这样的事情吗?
如果它 returns 是常规方式或通过输出参数的值,则没有区别。无论如何,程序都是一样的。 运行 函数并检查输出参数是否具有预期值。
这是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);
从技术上讲,修改参数被视为副作用。不过只要用心,问题不大。与使用成员变量相比,差异是巨大的。如果你开始修改全局变量,你很快就会很难测试代码。