ฉันเพิ่งถูกขายโดยใช้ CMake สำหรับการรวบรวมโปรเจ็กต์ C ++ ของฉันและตอนนี้ต้องการเริ่มเขียนการทดสอบหน่วยสำหรับรหัสของฉัน ฉันตัดสินใจที่จะใช้ยูทิลิตี้ Google Test เพื่อช่วยในเรื่องนี้ แต่ต้องการความช่วยเหลือในการเริ่มต้นใช้งาน
ทุกวันผมได้อ่านคำแนะนำต่างๆและตัวอย่าง ได้แก่รองพื้นการแนะนำที่ IBMและคำถามบางอย่างเกี่ยวกับ SO ( ที่นี่และที่นี่ ) เช่นเดียวกับแหล่งข้อมูลอื่น ๆ ที่ฉันติดตามของหาย ฉันรู้ว่ามีอะไรมากมายที่นั่น แต่ฉันก็ยังคงประสบปัญหา
ขณะนี้ฉันกำลังพยายามใช้การทดสอบขั้นพื้นฐานที่สุดเพื่อยืนยันว่าฉันได้รวบรวม / ติดตั้ง gtest ถูกต้องแล้วและไม่ได้ผล ไฟล์ต้นฉบับเดียว (testgtest.cpp) ถูกนำมาจากคำตอบก่อนหน้านี้เกือบทั้งหมด:
#include <iostream>
#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
{
EXPECT_EQ(1, 1);
}
และ CMakeLists.txt ที่เกี่ยวข้องของฉันมีดังนี้:
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
)
โปรดทราบว่าฉันเลือกที่จะเชื่อมโยงกับ gtest_main แทนที่จะระบุ main ที่ท้ายไฟล์ cpp เนื่องจากฉันเชื่อว่าสิ่งนี้จะช่วยให้สามารถปรับขนาดการทดสอบไปยังไฟล์หลาย ๆ ไฟล์ได้ง่ายขึ้น
เมื่อสร้างไฟล์. sln ที่สร้างขึ้น (ใน Visual C ++ 2010 Express) ฉันได้รับรายการข้อผิดพลาดจำนวนมากของแบบฟอร์ม
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)
ซึ่งฉันคิดว่าฉันเชื่อมโยงกับไลบรารี gtest ไม่สำเร็จ ฉันได้ตรวจสอบให้แน่ใจว่าเมื่อเชื่อมโยงกับไลบรารีดีบักฉันได้พยายามสร้างในโหมดดีบักแล้ว
แก้ไข
หลังจากทำการขุดค้นเพิ่มเติมแล้วฉันคิดว่าปัญหาของฉันเกี่ยวข้องกับประเภทของไลบรารีที่ฉันกำลังสร้างขึ้น เมื่อสร้าง gtest ด้วย CMake หากBUILD_SHARED_LIBS
ไม่มีการตรวจสอบและฉันเชื่อมโยงโปรแกรมกับไฟล์. lib เหล่านี้ฉันได้รับข้อผิดพลาดที่กล่าวถึงข้างต้น อย่างไรก็ตามหากBUILD_SHARED_LIBS
ตรวจสอบแล้วฉันจะสร้างชุดของไฟล์. lib และ. dll เมื่อตอนนี้เชื่อมโยงกับไฟล์. lib เหล่านี้โปรแกรมจะคอมไพล์ แต่เมื่อรันบ่นว่าไม่พบ gtest.dll
ความแตกต่างระหว่าง a SHARED
และ not SHARED
library คืออะไรและถ้าฉันเลือกไม่แชร์ทำไมมันถึงใช้ไม่ได้ มีตัวเลือกใน CMakeLists.txt สำหรับโครงการของฉันที่ฉันหายไปหรือไม่?
enable_testing()
ทำอย่างไร
ExternalProject_Add
add_subdirectory
ดูรายละเอียดคำตอบนี้