Niedawno sprzedano mi używanie CMake do kompilowania moich projektów C ++ i teraz chciałbym rozpocząć pisanie testów jednostkowych dla mojego kodu. Zdecydowałem się skorzystać z narzędzia Google Test, aby pomóc w tym, ale potrzebuję pomocy w rozpoczęciu.
Przez cały dzień czytałem różne przewodniki i przykłady, w tym Primer , wprowadzenie w IBM i kilka pytań na temat SO ( tu i tutaj ), a także inne źródła, które straciłem z oczu. Zdaję sobie sprawę, że jest tam wiele, ale jakoś nadal mam trudności.
Obecnie próbuję zaimplementować najbardziej podstawowy test, aby potwierdzić, że poprawnie skompilowałem / zainstalowałem gtest i nie działa. Jedyny plik źródłowy (testgtest.cpp) pochodzi prawie dokładnie z tej poprzedniej odpowiedzi:
#include <iostream>
#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
{
EXPECT_EQ(1, 1);
}
a mój powiązany plik CMakeLists.txt wygląda następująco:
cmake_minimum_required(VERSION 2.6)
project(basic_test)
# Setup testing
enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIR})
# Add test cpp file
add_executable(runUnitTests
testgtest.cpp
)
# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests ${GTEST_LIBRARY_DEBUG} ${GTEST_MAIN_LIBRARY_DEBUG})
add_test(
NAME runUnitTests
COMMAND runUnitTests
)
Zauważ, że zdecydowałem się połączyć z gtest_main zamiast podawać main na końcu pliku cpp, ponieważ uważam, że pozwoli mi to na łatwiejsze skalowanie testów do wielu plików.
Podczas budowania wygenerowanego pliku .sln (w Visual C ++ 2010 Express) otrzymuję niestety długą listę błędów formularza
2>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: virtual __thiscall std::basic_iostream<char,struct std::char_traits<char> >::~basic_iostream<char,struct std::char_traits<char> >(void)" (??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAE@XZ) already defined in gtestd.lib(gtest-all.obj)
co, jak sądzę, oznacza, że nie łączę się pomyślnie z bibliotekami gtest. Upewniłem się, że podczas łączenia się z bibliotekami debugowania próbowałem następnie budować w trybie debugowania.
EDYTOWAĆ
Po dokładniejszym zagłębieniu się, myślę, że mój problem jest związany z rodzajem biblioteki, w której buduję gtest. Podczas budowania gtest z CMake, jeśli BUILD_SHARED_LIBS
jest odznaczone i łączę swój program z tymi plikami .lib, otrzymuję wymienione powyżej błędy. Jeśli jednak BUILD_SHARED_LIBS
jest zaznaczone, tworzę zestaw plików .lib i .dll. Podczas łączenia z tymi plikami .lib program kompiluje, ale po uruchomieniu narzeka, że nie może znaleźć pliku gtest.dll.
Jakie są różnice między biblioteką a SHARED
i nie SHARED
, a jeśli wybiorę opcję nieudostępnianą, dlaczego to nie działa? Czy brakuje opcji w pliku CMakeLists.txt dla mojego projektu?
enable_testing()
?
ExternalProject_Add
zamiastadd_subdirectory
. Zobacz tę odpowiedź, aby uzyskać szczegółowe informacje.