OpenCV提供了一套测试, 这里做简要的分析.

我选择的是 cvFindContours对应的测试, cvFindContours 函数本身的说明请参考:

http://wiki.opencv.org.cn/index.php/Cv图像处理#FindContours

cvFindContours 的测试函数对应 OpenCV\tests\cv\src\acontours.cpp 文件.

下面我们来分析一下测试代码的结构, 这样可以方便我们以后向opencv集成自己的代码以及代码测试. 测试对应的类为 CV_FindContourTest:

class CV_FindContourTest : public CvTest
{
public:
    enum { NUM_IMG = 4 };

    CV_FindContourTest();
    ~CV_FindContourTest();
    int write_default_params(CvFileStorage* fs);
    void clear();

protected:
    int read_params( CvFileStorage* fs );
    int prepare_test_case( int test_case_idx );
    int validate_test_results( int test_case_idx );
    void run_func();

    int min_blob_size, max_blob_size;
    int blob_count, max_log_blob_count;
    int retr_mode, approx_method;

    int min_log_img_size, max_log_img_size;
    CvSize img_size;
    int count, count2;

    IplImage *img[NUM_IMG];
    CvMemStorage* storage;
    CvSeq *contours, *contours2, *chain;
};

CV_FindContourTestCvTest 派生, CvTest 位于 OpenCV\tests\cxts\cxts.h. 我们主要关注的是基类CvTest的构造函数:

CvTest::CvTest( const char* _test_name, const char* _test_funcs, const char* _test_descr ) :
    name(_test_name ? _test_name : ""), tested_functions(_test_funcs ? _test_funcs : ""),
    description(_test_descr ? _test_descr : ""), ts(0)
{
    if( last )
        last->next = this;
    else
        first = this;
    last = this;
    test_count++;

...
}

其中 first 等都是 CvTest 中的 static 成员:

protected:
    static CvTest* first;
    static CvTest* last;
    static int test_count;

到这里我们就可以基本断定, CV_FindContourTest 在构造的是被连接到了 CvTest::first 的链表. 我们通过这个链表就可以访问所有从 CvTest 派生的子类, 也就是用户自己实现的测试类.

OpenCV\tests\cv\src\acontours.cpp 文件的末尾有一下代码:

CV_FindContourTest find_contour_test;

find_contour_test 对象的主要功能是在构造的时候将自身串到 CvTest::first 链表.

下面就是测试代码的驱动了. 查看 OpenCV\tests\cv\src\tsysa.cpp 中的 main 函数:

#include "cvtest.h"

CvTS test_system;

int main(int argC,char *argV[])
{
    test_system.run( argC, argV );
    return 0;
}

CvTS::run 的基本功能就是遍历 CvTest::first 链表上的每个测试类, 然后调用测试类的 safe_run函数. safe_run 函数可以包含具体的测试代码, 具体的细节这里这里先不讨论.

C/C++的单元测试框架还有很多, 比如: CppUint, GTest 等.

补充(2014):

还有本人仿造Go语言测试根据而设计的迷你版C++单元测试库: https://github.com/chai2010/cc-mini-test