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 OSX10.8を使用しています。

4

2 に答える 2

1

gtestのソースコードを見ると、利用可能なパラメーター化されたテストがない場合の唯一のケースは、無効な例外を除いてVC7.1を使用しているWindowsです。

// 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の詳細:

彼らのFAQで、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

ここGTEST_INCLUDE_DIRで、GTEST_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などの標準クラステンプレートのサイズと動作を変更するため、2つの変換間でコンテナのインスタンス化が渡されない場合にのみ、デバッグモードでコンパイルされたコードとデバッグモードなしでコンパイルされたコードをリンクできることに注意してください。ユニット。」

  • 「いつ使うか

    イテレータに関連する問題が疑われる場合は、これを使用することをお勧めします。」

vector<testing::internal::ParameterizedTestCaseInfoBase*>ここで、最初に投稿されたスタックトレースを見ると、gtestがbegin()メソッドを使用してこのコンテナーでイテレーターを取得しようとしたためにクラッシュが発生します。

私の場合、gtest libはGLICXX_DEBUGフラグなしでコンパイルされましたが、テストコードはこのフラグ付きでコンパイルされました。このフラグなしでコンパイルしたとき、テストコードは魅力のように機能しました。

于 2017-06-29T07:09:58.640 に答える