Saya baru-baru ini dijual menggunakan CMake untuk menyusun proyek C ++ saya, dan sekarang ingin mulai menulis beberapa pengujian unit untuk kode saya. Saya telah memutuskan untuk menggunakan utilitas Google Test untuk membantu hal ini, tetapi memerlukan bantuan untuk memulai.
Sepanjang hari saya telah membaca berbagai panduan dan contoh termasuk Primer , pengenalan di IBM dan beberapa pertanyaan tentang SO (di sini dan di sini ) serta sumber-sumber lain yang saya lupa. Saya menyadari ada banyak hal di luar sana tetapi entah bagaimana saya masih mengalami kesulitan.
Saat ini saya mencoba menerapkan pengujian paling dasar, untuk mengonfirmasi bahwa saya telah mengumpulkan / menginstal hak gtest dan tidak berfungsi. Satu-satunya file sumber (testgtest.cpp) diambil hampir persis dari jawaban sebelumnya ini :
#include <iostream>
#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
{
EXPECT_EQ(1, 1);
}
dan CMakeLists.txt saya yang terkait adalah sebagai berikut:
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
)
Perhatikan bahwa saya telah memilih untuk menautkan ke gtest_main daripada memberikan yang utama di akhir file cpp karena saya yakin ini akan memungkinkan saya untuk meningkatkan pengujian dengan lebih mudah ke beberapa file.
Saat membangun file .sln yang dihasilkan (dalam Visual C ++ 2010 Express) sayangnya saya mendapatkan daftar panjang kesalahan formulir
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)
yang menurut saya berarti saya tidak berhasil menautkan ke pustaka paling besar. Saya telah memastikan bahwa saat menautkan ke pustaka debug, saya kemudian mencoba membangun dalam mode debug.
EDIT
Setelah melakukan penggalian lagi, saya pikir masalah saya ada hubungannya dengan jenis perpustakaan yang saya bangun. Saat membangun gtest dengan CMake, jika BUILD_SHARED_LIBS
tidak dicentang, dan saya menautkan program saya ke file .lib ini, saya mendapatkan kesalahan yang disebutkan di atas. Namun, jika BUILD_SHARED_LIBS
dicentang maka saya menghasilkan satu set file .lib dan .dll. Ketika sekarang menautkan file .lib ini, program mengkompilasi, tetapi ketika dijalankan mengeluh bahwa ia tidak dapat menemukan gtest.dll.
Apa perbedaan antara a SHARED
dan a not SHARED
library, dan jika saya memilih tidak dibagikan, mengapa tidak berfungsi? Apakah ada opsi di CMakeLists.txt untuk proyek saya yang saya lewatkan?
enable_testing()
dilakukannya?
ExternalProject_Add
daripadaadd_subdirectory
. Lihat jawaban ini untuk detailnya.