QTest 和 void 函数
QTest, and void Functions
我第一次在 QtCreator 中进行单元测试,我想知道如何测试没有 return 类型的函数。
喜欢:
rgb_process.h:
class RGB_process : Process
{
public:
RGB_process(cv::Mat& src, cv::Mat& dst, int exp = 0, double c = 1, int r = 0, int g = 0, int b = 0);
virtual void doProcess() override;
private:
int exposure_Val;
double contrast_Val;
int red_Val;
int green_Val;
int blue_Val;
};
rgb_process.cpp:
#include "rgb_process.h"
RGB_process::RGB_process(cv::Mat& src, cv::Mat& dst, int exp, double c, int r, int g, int b)
: Process (src, dst), exposure_Val(exp), contrast_Val(c), red_Val(r), green_Val(g), blue_Val(b){
}
void RGB_process::doProcess(){
for(int i = 0; i < src.rows; i++)
for(int j = 0; j < src.cols; j++)
for(int k = 0; k < 3; k++){
if(k == 0) //_R
dst.at<cv::Vec3b>(i,j)[k] = cv::saturate_cast<uchar>((src.at<cv::Vec3b>(i,j)[k] + exposure_Val + red_Val )*(259 * (contrast_Val + 255) / (255 * (259 - contrast_Val))));
if(k == 1) //_G
dst.at<cv::Vec3b>(i,j)[k] = cv::saturate_cast<uchar>((src.at<cv::Vec3b>(i,j)[k] + exposure_Val + green_Val )*(259 * (contrast_Val + 255) / (255 * (259 - contrast_Val))));
if(k == 2) //_B
dst.at<cv::Vec3b>(i,j)[k] = cv::saturate_cast<uchar>((src.at<cv::Vec3b>(i,j)[k] + exposure_Val + blue_Val )*(259 * (contrast_Val + 255) / (255 * (259 - contrast_Val))));
}
}
我在网上找不到任何类型的示例,与我的需求类似。
当对一个函数进行单元测试时,您不应该只验证它的 return 值是否符合您的预期,您还必须验证您在函数中使用的对象是否以可预测的方式进行操作,如果可能的。如果您正在测试 const
方法,可能只验证 return 值就足够了。
例如,您正在处理 dst
矩阵,因此您可以验证它是否按预期操作,因为您正在对它应用一个非常清晰的过程。
cv::Mat mySrc;
cv::Mat myDst;
// Here insert some data in mySrc matrix
RGB_process(mySrc, myDst);
// Here verify myDst matrix is still untouched
RGB_process.doProcess();
// Here verify myDst matrix contains processed data from mySrc matrix
您可以这样做,因为您的 RGB_process
构造函数得到一个 cv::Mat&
并且不会复制整个矩阵。
我第一次在 QtCreator 中进行单元测试,我想知道如何测试没有 return 类型的函数。 喜欢:
rgb_process.h:
class RGB_process : Process
{
public:
RGB_process(cv::Mat& src, cv::Mat& dst, int exp = 0, double c = 1, int r = 0, int g = 0, int b = 0);
virtual void doProcess() override;
private:
int exposure_Val;
double contrast_Val;
int red_Val;
int green_Val;
int blue_Val;
};
rgb_process.cpp:
#include "rgb_process.h"
RGB_process::RGB_process(cv::Mat& src, cv::Mat& dst, int exp, double c, int r, int g, int b)
: Process (src, dst), exposure_Val(exp), contrast_Val(c), red_Val(r), green_Val(g), blue_Val(b){
}
void RGB_process::doProcess(){
for(int i = 0; i < src.rows; i++)
for(int j = 0; j < src.cols; j++)
for(int k = 0; k < 3; k++){
if(k == 0) //_R
dst.at<cv::Vec3b>(i,j)[k] = cv::saturate_cast<uchar>((src.at<cv::Vec3b>(i,j)[k] + exposure_Val + red_Val )*(259 * (contrast_Val + 255) / (255 * (259 - contrast_Val))));
if(k == 1) //_G
dst.at<cv::Vec3b>(i,j)[k] = cv::saturate_cast<uchar>((src.at<cv::Vec3b>(i,j)[k] + exposure_Val + green_Val )*(259 * (contrast_Val + 255) / (255 * (259 - contrast_Val))));
if(k == 2) //_B
dst.at<cv::Vec3b>(i,j)[k] = cv::saturate_cast<uchar>((src.at<cv::Vec3b>(i,j)[k] + exposure_Val + blue_Val )*(259 * (contrast_Val + 255) / (255 * (259 - contrast_Val))));
}
}
我在网上找不到任何类型的示例,与我的需求类似。
当对一个函数进行单元测试时,您不应该只验证它的 return 值是否符合您的预期,您还必须验证您在函数中使用的对象是否以可预测的方式进行操作,如果可能的。如果您正在测试 const
方法,可能只验证 return 值就足够了。
例如,您正在处理 dst
矩阵,因此您可以验证它是否按预期操作,因为您正在对它应用一个非常清晰的过程。
cv::Mat mySrc;
cv::Mat myDst;
// Here insert some data in mySrc matrix
RGB_process(mySrc, myDst);
// Here verify myDst matrix is still untouched
RGB_process.doProcess();
// Here verify myDst matrix contains processed data from mySrc matrix
您可以这样做,因为您的 RGB_process
构造函数得到一个 cv::Mat&
并且不会复制整个矩阵。