3

我刚刚了解了googletest 中的值参数化单元测试,并希望在我的项目中使用它们。

我写了一个简单的参数化测试。

标题:

#include <gtest/gtest.h>

namespace EnsembleClustering {

class ParametrizedGTest: public testing::TestWithParam<int> {
public:
    ParametrizedGTest();
    virtual ~ParametrizedGTest();
};

} /* namespace EnsembleClustering */

资源:

#include "ParametrizedGTest.h"

namespace EnsembleClustering {

ParametrizedGTest::ParametrizedGTest() {
    // TODO Auto-generated constructor stub

}

ParametrizedGTest::~ParametrizedGTest() {
    // TODO Auto-generated destructor stub
}


TEST_P(ParametrizedGTest, testParameter) {
    int n = GetParam();
    EXPECT_EQ(n, GetParam());
}


INSTANTIATE_TEST_CASE_P(ParametrizedGTestInstance,
                        ParametrizedGTest,
                        ::testing::Values(100));

} /* namespace EnsembleClustering */

现在,当我像往常一样运行 googletest 时,程序崩溃而没有任何输出。gdb 堆栈跟踪是

EnsembleClustering-D [C/C++ Application]    
    EnsembleClustering  
        Thread [1] (Suspended : Signal : EXC_BAD_ACCESS:Could not access memory)    
            __gnu_debug::_Safe_sequence_base::_M_attach_single() at 0x100528add 
            __gnu_debug::_Safe_sequence_base::_M_attach() at 0x100528a74    
            __gnu_debug::_Safe_iterator_base::_M_attach() at 0x100528bfe    
            __gnu_debug::_Safe_iterator_base::_Safe_iterator_base() at safe_base.h:90 0x1000016e9   
            __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<testing::internal::ParameterizedTestCaseInfoBase**, std::__cxx1998::vector<testing::internal::ParameterizedTestCaseInfoBase*, std::allocator<testing::internal::ParameterizedTestCaseInfoBase*> > >, std::__debug::vector<testing::internal::ParameterizedTestCaseInfoBase*, std::allocator<testing::internal::ParameterizedTestCaseInfoBase*> > >::_Safe_iterator() at safe_iterator.h:154 0x100002e9c    
            std::__debug::vector<testing::internal::ParameterizedTestCaseInfoBase*, std::allocator<testing::internal::ParameterizedTestCaseInfoBase*> >::begin() at vector:207 0x100001fbe  
            testing::internal::ParameterizedTestCaseRegistry::GetTestCasePatternHolder<EnsembleClustering::ParametrizedGTest>() at gtest-param-util.h:574 0x1000025b0   
            EnsembleClustering::ParametrizedGTest_testParameter_Test::AddToRegistry() at ParametrizedGTest.cpp:22 0x100001d3f   
            __static_initialization_and_destruction_0() at ParametrizedGTest.cpp:22 0x100001349 
            _GLOBAL__sub_I_ParametrizedGTest.cpp() at ParametrizedGTest.cpp:32 0x100001424  
            <...more frames...> 
    gdb 

我做错了什么还是这是googletest中的错误?你能重现这个错误吗?

编辑:我在 Mac OS X 10.8 上。

4

2 回答 2

1

从查看 gtest 的源代码来看,如果没有可用的参数化测试,唯一的情况是在 Windows 上使用 VC7.1 并禁用异常:

// We don't support MSVC 7.1 with exceptions disabled now.  Therefore
// all the compilers we care about are adequate for supporting
// value-parameterized tests.
#define GTEST_HAS_PARAM_TEST 1

那么,您需要检查您的 MinGW 是如何构建的并可能对其进行更新?您可以运行 gtest 单元测试来查看它们是否执行类型化参数测试吗?

有关 MinGW 的更多信息:

在他们的常见问题解答中,他们报告说,在使用 MinGW 时,需要以下编译选项来构建 gtest PATH/TO/configure CC="gcc -mno-cygwin" CXX="g++ -mno-cygwin":.

完整示例:

#include <gtest/gtest.h>
namespace EnsembleClustering {

    class ParametrizedGTest: public testing::TestWithParam<int> {
    public:
        ParametrizedGTest();
        virtual ~ParametrizedGTest();
    };

    ParametrizedGTest::ParametrizedGTest() {
    }

    ParametrizedGTest::~ParametrizedGTest() {
    }

    TEST_P(ParametrizedGTest, testParameter) {
        int n = GetParam();
        EXPECT_EQ(n, GetParam());
    }

    INSTANTIATE_TEST_CASE_P(ParametrizedGTestInstance,
                            ParametrizedGTest,
                            ::testing::Values(100));

} /* namespace EnsembleClustering */


int main(int argc, char* argv[]) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

我在 Mac OS X 10.8 上使用以下编译器调用编译了这段代码:

g++ -IGTEST_INCLUDE_DIR -LGTEST_LIB_DIR -lgtest -o tt2 tt2.cpp

WhereGTEST_INCLUDE_DIRGTEST_LIB_DIR是存储头文件和库文件的路径。当你编译和执行时,会发生什么?

于 2013-01-22T14:29:56.087 回答
0

谢谢@ChristianStaudt 和@grundprinzip

我想向未来的读者指出解释此问题的以下链接。 http://libcwd.sourceforge.net/reference-manual/group__enable__glibcxx__debug.html

这是 GLIBCXX_DEBUG 标志文档的链接。它陈述了以下要点。

  • “请注意,此标志会更改标准类模板(例如 std::vector)的大小和行为,因此如果在两个转换之间没有传递容器的实例化,您只能链接使用调试模式编译的代码和不使用调试模式编译的代码单位。”

  • “什么时候用

    如果您怀疑与迭代器相关的问题,最好使用它。”

现在,如果您查看最初发布的堆栈跟踪,则会发生崩溃,vector<testing::internal::ParameterizedTestCaseInfoBase*>因为 gtest 尝试使用 begin() 方法在此容器上获取​​迭代器。

在我的例子中,gtest lib 是在没有GLICXX_DEBUG 标志的情况下编译的,但是我的测试代码是这个标志编译的。当我在没有这个标志的情况下编译时,测试代码就像一个魅力。

于 2017-06-29T07:09:58.640 回答