Recentemente sono stato convinto dell'utilizzo di CMake per la compilazione dei miei progetti C ++ e ora vorrei iniziare a scrivere alcuni unit test per il mio codice. Ho deciso di utilizzare l'utilità di test di Google per aiutare con questo, ma ho bisogno di aiuto per iniziare.
Per tutto il giorno ho letto varie guide ed esempi includono il Primer , un'introduzione all'IBM e alcune domande su SO ( qui e qui ) così come altre fonti di cui ho perso le tracce. Mi rendo conto che c'è molto là fuori, ma in qualche modo ho ancora difficoltà.
Attualmente sto cercando di implementare il test più semplice, per confermare che ho compilato / installato gtest correttamente e non funziona. L'unico file sorgente (testgtest.cpp) è preso quasi esattamente da questa risposta precedente:
#include <iostream>
#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
{
EXPECT_EQ(1, 1);
}
e il mio CMakeLists.txt associato è il seguente:
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
)
Nota che ho scelto di collegarmi a gtest_main invece di fornire il main alla fine del file cpp poiché credo che questo mi permetterà di scalare il test più facilmente a più file.
Durante la creazione del file .sln generato (in Visual C ++ 2010 Express) purtroppo ottengo un lungo elenco di errori del modulo
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)
che penso significhi che non mi sto collegando con successo alle librerie gtest. Mi sono assicurato che quando mi collegavo alle librerie di debug, ho provato a compilare in modalità di debug.
MODIFICARE
Dopo aver approfondito ulteriormente, penso che il mio problema abbia a che fare con il tipo di libreria in cui sto costruendo gtest. Quando creo gtest con CMake, se BUILD_SHARED_LIBS
non è selezionato e collego il mio programma a questi file .lib ottengo gli errori sopra menzionati. Tuttavia, se BUILD_SHARED_LIBS
è selezionato, produco un set di file .lib e .dll. Quando ora si collega a questi file .lib il programma compila, ma quando viene eseguito si lamenta di non riuscire a trovare gtest.dll.
Quali sono le differenze tra una SHARED
e una SHARED
libreria non e se scelgo non condivisa, perché non funziona? C'è un'opzione nel CMakeLists.txt per il mio progetto che mi manca?
enable_testing()
?
ExternalProject_Add
invece diadd_subdirectory
. Vedi questa risposta per i dettagli.