如何对用OpenCV开发的API进行测试
假设你想测试一个使用OpenCV开发的图像处理API,例如一个图像滤波函数。以下是一种测试方法的示例:
-
准备测试环境:首先,需要安装OpenCV库,并设置好C++开发环境。
-
编写测试代码:创建一个新的C++文件,引入必要的OpenCV头文件和测试框架头文件(如Google Test)。
#include <opencv2/opencv.hpp> #include <gtest/gtest.h> // 测试函数原型声明 cv::Mat customImageFilter(const cv::Mat &inputImage); TEST(ImageFilterTest, BasicFiltering) { // 准备测试数据 cv::Mat inputImage = cv::Mat::ones(100, 100, CV_8UC1) * 255; // 创建一个100x100的全白图像 cv::Mat expectedResult = ...; // 根据你的滤波逻辑定义预期结果 // 调用待测试的图像处理API cv::Mat result = customImageFilter(inputImage); // 验证结果 EXPECT_EQ(expectedResult.size(), result.size()); for (int i = 0; i < result.rows; ++i) { for (int j = 0; j < result.cols; ++j) { EXPECT_EQ(expectedResult.at<uchar>(i, j), result.at<uchar>(i, j)); } } } int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
-
编译和运行测试:使用合适的编译器编译测试代码,并运行测试。测试框架会自动执行所有测试用例,并报告测试结果。
断言介绍
断言
gtest 使用一系列断言的宏来检查值是否符合预期,主要分为两类:ASSERT 和 EXPECT。区别在于 ASSERT 不通过的时候会认为是一个 fatal 的错误,退出当前函数(只是函数)。而 EXPECT 失败的话会继续运行当前函数,所以对于函数内几个失败可以同时报告出来。通常我们用 EXPECT 级别的断言就好,除非你认为当前检查点失败后函数的后续检查没有意义。
基础的断言
Fatal assertion | Nonfatal assertion | Verifies |
---|---|---|
ASSERT_TRUE( condition) ; | EXPECT_TRUE( condition) ; | condition is true |
ASSERT_FALSE( condition) ; | EXPECT_FALSE( condition) ; | condition is false |
数值比较
Fatal assertion | Nonfatal assertion | Verifies |
---|---|---|
ASSERT_EQ( val1, val2); | EXPECT_EQ( val1, val2); | val1 == val2 |
ASSERT_NE( val1, val2); | EXPECT_NE( val1, val2); | val1 != val2 |
ASSERT_LT( val1, val2); | EXPECT_LT( val1, val2); | val1 < val2 |
ASSERT_LE( val1, val2); | EXPECT_LE( val1, val2); | val1 <= val2 |
ASSERT_GT( val1, val2); | EXPECT_GT( val1, val2); | val1 > val2 |
ASSERT_GE( val1, val2); | EXPECT_GE( val1, val2); | val1 >= val2 |
字符串比较
Fatal assertion | Nonfatal assertion | Verifies |
---|---|---|
ASSERT_STREQ( str1, str2); | EXPECT_STREQ( str1, _str_2); | the two C strings have the same content |
ASSERT_STRNE( str1, str2); | EXPECT_STRNE( str1, str2); | the two C strings have different content |
ASSERT_STRCASEEQ( str1, str2); | EXPECT_STRCASEEQ( str1, str2); | the two C strings have the same content, ignoring case |
ASSERT_STRCASENE( str1, str2); | EXPECT_STRCASENE( str1, str2); | the two C strings have different content, ignoring case |
异常检查
Fatal assertion | Nonfatal assertion | Verifies |
---|---|---|
ASSERT_THROW( statement, exception_type); | EXPECT_THROW( statement, exception_type); | statement throws an exception of the given type |
ASSERT_ANY_THROW( statement); | EXPECT_ANY_THROW( statement); | statement throws an exception of any type |
ASSERT_NO_THROW( statement); | EXPECT_NO_THROW( statement); | statement doesn’t throw any exception |