2011-08-31 36 views
18

Tôi mới sử dụng CMake và tôi đang sử dụng Khung kiểm tra của Google. Tôi đã tìm kiếm các ví dụ phức tạp hơn về kết hợp CMake và khung kiểm tra của Google, nhưng tôi đã không có nhiều may mắn. Tôi đã hy vọng rằng ai đó có thể cung cấp ý kiến ​​của họ về các thiết lập tôi đã đến và trả lời một câu hỏi cho tôi. Dưới đây là cấu trúc dự án cơ bản:Đầu ra Kiểm tra Đơn vị & Tư vấn Cấu trúc Dự án --- CMake + Khung kiểm tra của Google

ProjectFolder
-CMakeLists.txt
/xây dựng
/include
    -all file .h của tôi
/src
    -CMakeLists.txt
    -tất cả các tệp .cpp của tôi
/test
    -CMakeLists.txt
   /gtest
        -Google của CMakeLists.txt
   /chế giễu
        -CMakeLists.txt
        -cpp và h tệp cho mocks

Tóm lại, tệp gốc cmake thêm src và kiểm tra dưới dạng thư mục con. Tệp src cmake chứa các tệp cpp vào thư viện. Tệp thử nghiệm cmake thêm mocks và gtest làm thư mục con. Các tập tin cmake giả tạo globs tất cả các tập tin cpp của nó vào một thư viện thứ hai. Cuối cùng, tệp cmake trong thư mục kiểm tra sẽ liên kết thư viện src, thư viện google và thư viện mocks với các tệp thực thi thử nghiệm đơn vị.

Những gì tôi cuối cùng đã có được một số thực thi: objA_unittest, objB_unittest, vv

Một vài điều:

  1. Để xây dựng tất cả điều này và vẫn giữ thư mục dự án của tôi khá sạch Tôi cd vào xây dựng thư mục và chạy "cmake .." Điều này dường như làm việc thực sự tốt và tôi đã được lập kế hoạch cấu hình vim để luôn luôn chạy làm cho ra khỏi thư mục này. Có ai có bất kỳ lời khuyên hoặc hoặc xem bất kỳ vấn đề với cách tiếp cận này?

  2. Tôi không thích ý tưởng phải lồng thư viện google vào thư mục dự án của mình (đặc biệt nếu cuối cùng tôi có nhiều dự án sử dụng nó), nhưng dường như bạn không nên biên dịch trước thư viện google Tôi không thể nhìn thấy không có cách nào xung quanh này. Tuy nhiên, nếu có ai biết cách nào tốt hơn, tôi rất thích nghe nó.

  3. Chạy thử nghiệm. Tôi thích rằng tất cả những gì tôi phải làm là chạy "kiểm tra" để thực hiện tất cả các thử nghiệm đơn vị của tôi với ctest. Tuy nhiên, tôi đã phát hiện ra rằng tôi không thích đầu ra rất nhiều. Mỗi bài kiểm tra đơn vị thực thi có chứa một số bài kiểm tra đơn vị khác nhau. Việc chạy những phần này trực tiếp cung cấp phản hồi rất chi tiết của Google. Nếu một trong các bài kiểm tra trong một tập tin thực thi thất bại, tôi biết chính xác những gì kiểm tra thất bại và tại sao. Trước đây, tôi đã sử dụng một makefile và ở phần cuối của makefile, tôi chỉ thực hiện tất cả các bài kiểm tra. Trước tiên, tôi đã cố khắc phục điều này bằng cách tạo mục tiêu xây dựng tùy chỉnh trong cmake.Tuy nhiên, nó chỉ thực hiện lệnh đầu tiên. Tôi cần một cách để có được đầu ra tiết kiệm hơn từ CTEST HOẶC tôi cần một cách để tự động xuất ra một tập lệnh bash hoặc một cái gì đó tương tự từ CMake để thực thi từng thử nghiệm đơn vị thực thi. Nói cách khác, tôi đã cài đặt tệp cmake ngay bây giờ nên tôi chỉ phải thêm kiểm tra đơn vị vào một nơi để tạo tệp thi hành và tôi không muốn phải nhớ thêm nó vào vị trí thứ hai nếu tôi có thể tránh nó. Có ai có kinh nghiệm nào sẽ hữu ích trong thời điểm này không?

Cảm ơn rất nhiều trước.

Trả lời

11
  1. Nó thực sự là một thực tế cmake đề nghị gọi out-of-source build
  2. AFAIK nó không được khuyến khích để cài đặt biên dịch lại thư viện googletest trong hệ thống. Vì vậy, không nên có bất kỳ vấn đề nếu bạn biên dịch nó như là thư viện chia sẻ hoặc tĩnh như là một phần của dự án xây dựng của bạn. Tôi đã sử dụng googletest 1.6.0 theo cách này mà không gặp sự cố nào trên Windows, Linux, OSX và Android.
  3. Tôi không chắc chắn về CTest nhưng mục tiêu tùy chỉnh chắc chắn có thể chạy tất cả các thử nghiệm cho bạn. Đây là một giải pháp ngắn tôi có thể đề nghị:

Add sau dòng vào cấp cao nhất của bạn CMakeLists.txt (trước khi thêm bất kỳ thử nghiệm):

add_custom_target(test) 
macro(run_test test_target) 
    add_custom_target(${test_target}_runtest 
     COMMAND ${test_target} #cmake 2.6 required 
     DEPENDS ${test_target} 
     WORKING_DIRECTORY "${CMAKE_BINARY_DIR}") 
    add_dependencies(test ${test_target}_runtest) 
endmacro() 

Tiếp theo cho mỗi bài kiểm tra thêm một dòng duy nhất để nối thêm thử nghiệm của bạn mục tiêu test:

#add_executable(mytest ${mysources}) 
run_test(mytest) 
+3

Hãy cẩn thận: có một mục tiêu CMake được xác định trước có tên 'thử nghiệm'. Việc thêm mục tiêu tùy chỉnh có cùng tên đó thường không được khuyến nghị. Bạn cũng có thể gọi "ctest -V" hoặc "ctest -VV" trong cùng thư mục mà bạn đang gọi "thực hiện kiểm tra" ngay bây giờ và nó sẽ chạy toàn bộ bộ thử nghiệm * và * cho bạn thấy kết quả của tất cả các thử nghiệm. (-V == verbose, -VV == rất tiết) – DLRdave

+0

Chỉ cần FYI, tôi thực sự đánh giá cao phản hồi nhanh (và câu trả lời dưới đây). Tôi vừa bận rộn với trường học và chưa có thời gian để kiểm tra một trong những điều này. Ngay khi tôi làm, tôi sẽ chọn câu trả lời phù hợp nhất. Chỉ muốn cho bạn biết tôi đã không quên. :) – Landon

11

Ở đây, example của tôi. Tôi đã làm cho nó như là hướng dẫn ngắn cho nhóm dev của tôi. Có lẽ bạn cũng sẽ thấy nó hữu ích.

+0

Tôi thích rằng ví dụ này rất đơn giản. Tuy nhiên, hướng dẫn hiện tại từ nhóm gtest là bao gồm nguồn gtest với gói. Bất kỳ ví dụ về làm điều đó xung quanh? –

+0

Có. Tôi biết về sự thay đổi này. Sẽ kiểm tra nó và sớm và sẽ cập nhật nó cho phù hợp. –

+0

@KurtSchwehr Tôi đã bắt đầu triển khai cách mới và cuối cùng tìm thấy giải pháp tại đây http://stackoverflow.com/questions/9689183/cmake-googletest. Sẽ cập nhật như được đề xuất trong câu trả lời ở trên. –

Các vấn đề liên quan