Gần đây tôi đã được bán về việc sử dụng CMake để biên dịch các dự án C ++ của mình và bây giờ tôi muốn bắt đầu viết một số bài kiểm tra đơn vị cho mã của mình. Tôi đã quyết định sử dụng tiện ích Kiểm tra của Google để trợ giúp việc này, nhưng cần một số trợ giúp để bắt đầu.
Cả ngày tôi đã đọc nhiều hướng dẫn và ví dụ khác nhau bao gồm Primer , phần giới thiệu tại IBM và một số câu hỏi về SO ( ở đây và ở đây ) cũng như các nguồn khác mà tôi đã mất. Tôi nhận ra có rất nhiều thứ ngoài kia nhưng không hiểu sao tôi vẫn gặp khó khăn.
Tôi hiện đang cố gắng thực hiện thử nghiệm cơ bản nhất, để xác nhận rằng tôi đã biên dịch / cài đặt đúng gtest và nó không hoạt động. Các chỉ nguồn tập tin (testgtest.cpp) được thực hiện gần như chính xác từ này câu trả lời trước:
#include <iostream>
#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
{
EXPECT_EQ(1, 1);
}
và CMakeLists.txt được liên kết của tôi như sau:
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
)
Lưu ý rằng tôi đã chọn liên kết chống lại gtest_main thay vì cung cấp chính ở cuối tệp cpp vì tôi tin rằng điều này sẽ cho phép tôi mở rộng quy mô thử nghiệm dễ dàng hơn với nhiều tệp.
Khi xây dựng tệp .sln được tạo (trong Visual C ++ 2010 Express), tôi không may nhận được một danh sách dài các lỗi của biểu mẫu
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)
mà tôi nghĩ có nghĩa là tôi không liên kết thành công đến các thư viện gtest. Tôi đã đảm bảo rằng khi liên kết chống lại các thư viện gỡ lỗi, sau đó tôi đã cố gắng xây dựng ở chế độ gỡ lỗi.
BIÊN TẬP
Sau khi đào thêm, tôi nghĩ vấn đề của tôi là liên quan đến loại thư viện mà tôi đang xây dựng gtest. Khi xây dựng gtest với CMake, nếu BUILD_SHARED_LIBS
không được chọn và tôi liên kết chương trình của mình với các tệp .lib này, tôi gặp các lỗi được đề cập ở trên. Tuy nhiên, nếu BUILD_SHARED_LIBS
được chọn thì tôi tạo một tập hợp các tệp .lib và .dll. Khi bây giờ liên kết với các tệp .lib này, chương trình biên dịch, nhưng khi chạy thì phàn nàn rằng nó không thể tìm thấy gtest.dll.
Sự khác biệt giữa thư viện a SHARED
và SHARED
thư viện không phải là gì , và nếu tôi chọn không được chia sẻ, tại sao nó không hoạt động? Có tùy chọn nào trong CMakeLists.txt cho dự án của tôi mà tôi đang thiếu không?
enable_testing()
?
ExternalProject_Add
thay vì sử dụngadd_subdirectory
. Xem câu trả lời này để biết chi tiết.