通过一些GTest TEST_F挂起的CLion执行挂起,逐步调试倒退?

时间:2016-04-16 17:48:31

标签: c++ opencv googletest clion

我正在调试我在CLion中使用C ++编写的应用程序,并使用Google Test对其进行测试。它是我发现的计算机视觉论文的一个实现,我使用OpenCV作为它的Mat类和图像处理函数。

我的三个测试功能表现得非常不稳定;这是一个。

/**
 * Create a flat point cloud and flip it horizontally
 */
TEST_F(PointCloudTest, FlipHorizontal) {
    // load image & set constants
    cv::Mat image = omar::imreadAsGrayDouble(dirname + "uttower.png");
    cv::Mat flippedImage = omar::imreadAsGrayDouble(dirname + "uttower_horz.png");
    double fLength = 200.0; // for this, the flength is arbitrary as long as it's the same.

    // build point cloud
    omar::PointCloud pc(image, fLength);

    /* Build the other camera pose
     * Specifically, rotated pi over Y
     * and 2 focal lengths out into Z+ space.
     * It's written as 2.001 to test whether small variations affect point placement*/
    omar::Pose otherCamera(0.0, 0.0, 2.001, 0.0, M_PI, 0.0);

    // flip horizontally
    omar::PointCloud newPc = pc.viewPoints(otherCamera);
    cv::Mat newImage = newPc.renderToImage(fLength, image.rows, image.cols);
    omar::assertMatEquals(flippedImage, newImage, 10 * DBL_EPSILON);
}

并且GTest调试系统将提供输出,就好像它已完成:

[ OK ] PointCloudTest.FlipHorizontal (205 ms)

但是图标从未改变为表明测试结束的信号。

image showing OK and ! but stalled wheels for three tests

当我去调试它时,如果我在函数的底部设置一个断点,它会停止,然后每次我按下" Step Over,"它会一个接一个地跳过 up 其余行,然后完成。这结果证明是所有测试的调试行为。

悬挂测试与通过的不同测试略有不同。具体来说,该行是viewPoints行。以下是相关代码:

PointCloud::PointCloud(const PointCloud& other) {
    pointsAndIntensities = other.pointsAndIntensities.clone();
}
PointCloud PointCloud::viewPoints(omar::Pose otherCameraPose) {
    PointCloud otherPointCloud = PointCloud(*this);
    otherPointCloud.transform(otherCameraPose);
    return otherPointCloud;
}

void PointCloud::transform(omar::Pose otherCameraPose) {
    cv::Mat transformedPoints = otherCameraPose.world2camera(pointsAndIntensities(cv::Range(0, 3), cv::Range::all()));
    cv::Mat replaceablePoints(pointsAndIntensities, cv::Range(0, 3));
    transformedPoints.copyTo(replaceablePoints);
}

我想了解这种排序的原因,但它可能与真正的问题有关,也可能与此无关,即悬挂测试。从技术上讲,所有三项测试都通过了,但我认为这个问题将会导致很多问题。我在我的智慧结束。感谢帮助和跟进问题!

1 个答案:

答案 0 :(得分:1)

TL; DR:确保用新行结束打印报表。

当我描述问题时,我遗漏了一个非常非常重要的细节。我决定在这里删除我用来调试描述中的一些信息的cout行。原始代码是:

void PointCloud::transform(omar::Pose otherCameraPose) {
    //cv::Mat oldPoints(pointsAndIntensities, cv::Range(0, 3));

    cv::Mat transformedPoints = otherCameraPose.world2camera(pointsAndIntensities(cv::Range(0, 3), cv::Range::all()));
    cv::Mat replaceablePoints(pointsAndIntensities, cv::Range(0, 3));
    std::cout << "Transformed: " << transformedPoints.col(3) << std::endl;
    std::cout << "Original: " << replaceablePoints.col(3) << std::endl;
    transformedPoints.copyTo(replaceablePoints);
    std::cout << "Replaced?: " << pointsAndIntensities.col(3);
}

我决定在代码中挖掘更多内容,以找到导致挂起的确切行,以防内存中出现错误。我将其跟踪到上面的transform方法,结果证明是我在那里的std::cout行。我不知道使用流中测试是否会造成一些问题。事实证明,我没有用std::endl结束我的最后一次打印声明。

我的预感是,CLion依赖于GTest的cout输出来查找测试是通过还是失败,并且因为[ OK ] PointCloudTest.FlipHorizontal (205 ms)不在新行上,所以它无法识别测试成功完成。