Googletest参数化测试崩溃 [英] Googletest Parametrized tests crash

查看:310
本文介绍了Googletest参数化测试崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚了解了 googletest中的值参数化单元测试

标题:

  #include< gtest / gtest.h> 

namespace EnsembleClustering {

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

} / * namespace EnsembleClustering * /



  #includeParametrizedGTest.h

namespace EnsembleClustering {

ParametrizedGTest :: ParametrizedGTest (){
// TODO自动生成的构造函数stub

}

ParametrizedGTest ::〜ParametrizedGTest(){
// TODO自动生成destructor stub
}


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


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

} / * namespace EnsembleClustering * /

像往常一样,程序崩溃,没有任何输出。 gdb堆栈跟踪是

  EnsembleClustering-D [C / C ++应用程序] 
EnsembleClustering
Thread [1 ](Suspended:信号:EXC_BAD_ACCESS:无法访问内存)
__gnu_debug :: _ Safe_sequence_base :: _ M_attach_single()在0x100528add
__gnu_debug :: _ Safe_sequence_base :: _ M_attach()在0x100528a74
__gnu_debug :: _Safe_iterator_base :: _M_attach()在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< tests :: 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()在ParametrizedGTest.cpp:22 0x100001d3f
__static_initialization_and_destruction_0()在ParametrizedGTest.cpp:22 0x100001349
_GLOBAL__sub_I_ParametrizedGTest.cpp()在ParametrizedGTest.cpp:32 0x100001424
< ; ... more frames ...>
gdb

我做错了什么或者这是googletest中的错误?您可以重现此错误吗?



编辑:我在Mac OS X 10.8。

解决方案

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

  //我们不支持MSVC 7.1,现在禁用例外。因此
//我们关心的所有编译器都足以支持
//值参数化测试。
#define GTEST_HAS_PARAM_TEST 1

因此,您需要检查您的MinGW的构建并可能更新它?



有关MinGW的更多信息:



在他们的常见问题他们报告,当使用MinGW时,需要以下编译选项来构建gtest: PATH / TO / configure CC =gcc -mno-cygwinCXX = 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上使用以下编译器调用编译此代码: / p>

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

其中 GTEST_INCLUDE_DIR GTEST_LIB_DIR 并存储库文件。当你编译和执行时,会发生什么?


I've just learned about value-parametrized unit tests in googletest and would like to use them in my project.

I wrote a simple parametrized test.

Header:

#include <gtest/gtest.h>

namespace EnsembleClustering {

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

} /* namespace EnsembleClustering */

Source:

#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 */

Now, when I run googletest as usual, the program crashes without any output. The gdb stack trace is

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 

Am I doing something wrong or is this a bug in googletest? Can you reproduce this error?

EDIT: I am on Mac OS X 10.8.

解决方案

From looking at the source code of gtest the only case if there are no parametrized tests available is on Windows using VC7.1 with disabled exceptions:

// 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

So, you'll need to check how your MinGW was built and probably update it? And can you run the gtest unit tests to see if they execute the typed parameters test?

More information on MinGW:

On their FAQ they report that when using MinGW the following compile option for building gtest is required: PATH/TO/configure CC="gcc -mno-cygwin" CXX="g++ -mno-cygwin".

Complete Example:

#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();
}

I compiled this code using the following compiler call on Mac OS X 10.8:

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

Where GTEST_INCLUDE_DIR and GTEST_LIB_DIR are the path where header and library files are stored. When you compile and execute, what happens?

这篇关于Googletest参数化测试崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆