Recentemente, vendi o CMake para compilar meus projetos C ++ e agora gostaria de começar a escrever alguns testes de unidade para o meu código. Decidi usar o utilitário de teste do Google para ajudar com isso, mas preciso de ajuda para começar.
Durante todo o dia, li vários guias e exemplos incluem o Primer , uma introdução na IBM e algumas perguntas sobre SO ( aqui e aqui ), além de outras fontes que perdi de vista. Sei que há muito por aí, mas de alguma forma ainda estou tendo dificuldades.
Atualmente, estou tentando implementar o teste mais básico, para confirmar se compilei / instalei o gtest corretamente e não está funcionando. O único arquivo de origem (testgtest.cpp) é obtido quase exatamente nesta resposta anterior:
#include <iostream>
#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
{
EXPECT_EQ(1, 1);
}
e meu CMakeLists.txt associado é o seguinte:
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
)
Observe que eu escolhi vincular o gtest_main em vez de fornecer o principal no final do arquivo cpp, pois acredito que isso me permitirá escalar os testes com mais facilidade para vários arquivos.
Ao criar o arquivo .sln gerado (no Visual C ++ 2010 Express), infelizmente, recebo uma longa lista de erros do formulário
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)
o que acho que significa que não estou vinculando com êxito às bibliotecas gtest. Eu verifiquei que, ao vincular as bibliotecas de depuração, tentei criar no modo de depuração.
EDITAR
Depois de pesquisar um pouco mais, acho que meu problema está relacionado ao tipo de biblioteca na qual estou construindo o gtest. Ao criar o gtest com o CMake, seBUILD_SHARED_LIBS
estiver desmarcado, e vinculo meu programa a esses arquivos .lib, obtenho os erros mencionados acima. No entanto, se BUILD_SHARED_LIBS
estiver marcado, produzo um conjunto de arquivos .lib e .dll. Quando agora vincula esses arquivos .lib, o programa é compilado, mas quando executado reclama que não foi possível encontrar o gtest.dll.
Quais são as diferenças entre uma biblioteca SHARED
e uma não SHARED
e, se eu optar por não compartilhar, por que não funciona? Existe uma opção no CMakeLists.txt para o meu projeto que está faltando?
enable_testing()
faz?
ExternalProject_Add
vez deadd_subdirectory
. Veja esta resposta para detalhes.