2013-02-27 46 views
16

Tôi muốn thử nghiệm của mình được khởi chạy mỗi khi dự án của tôi được xây dựng thành công. Và nếu một số bài kiểm tra bị hỏng, tôi cũng muốn bản dựng của tôi bị hỏng. Theo mặc định, tôi cần chạy thử nghiệm theo cách thủ công bằng cách chạy lệnh ctest. CTest thực sự có thể xây dựng dự án nhưng tôi sử dụng IDE để gọi make để xây dựng các nguồn. Và make không chạy thử nghiệm.Làm thế nào để chạy ctest sau khi xây dựng dự án của tôi với cmake

Tôi thêm lệnh này vào tệp gốc CMakeLists.txt nhưng nó không hoạt động.

add_custom_command(OUTPUT tests.txt 
        POST_BUILD 
        COMMAND ctest --output-on-failure) 

CMake không trả lại bất kỳ lỗi nào và mọi thứ được xây dựng tốt nhưng lệnh tùy chỉnh của tôi không gọi. Làm thế nào tôi có thể chạy một cái gì đó sau mỗi lần xây dựng thành công trong CMake?

Cập nhật:

giải pháp cuối cùng của tôi là chức năng này:

macro(add_unit_test target target_test) 
    set(UNIT_TEST_TARGETS ${UNIT_TEST_TARGETS} ${target_test} PARENT_SCOPE) 
    add_test(target ${CMAKE_CURRENT_BINARY_DIR}/target_test) 
endmacro(add_unit_test) 

nó gọi add_test và nhớ mục tiêu thử nghiệm trong một danh sách. Mỗi thử nghiệm trong một dự án được thêm vào bởi hàm này. Trong thư mục gốc CMakeLists.txt, tôi có mã này:

add_custom_target(all_tests ALL 
        DEPENDS ${UNIT_TEST_TARGETS} 
) 
add_custom_command(TARGET all_tests 
        COMMENT "Run tests" 
        POST_BUILD COMMAND ctest ARGS --output-on-failure 
        WORKING_DIRECTORY ${CMAKE_BINARY_DIR} 
) 

Nó tạo mục tiêu tùy chỉnh phụ thuộc vào tất cả các thử nghiệm đơn vị trong một dự án. Lệnh tùy chỉnh được chạy sau khi mục tiêu all_tests được tạo.

+1

Cảm ơn cho câu trả lời - trong macro của bạn, trong 'add_test', tôi nghĩ rằng bạn cần' $ {target_test} 'thay vì' target_test' – experquisite

Trả lời

12

Biểu mẫu add_custom_command này sẽ chỉ thực thi nếu một mục tiêu CMake khác có phụ thuộc vào "tests.txt". Tôi giả định rằng không có mục tiêu nào khác có "tests.txt" làm tệp đầu vào, do đó lệnh tùy chỉnh không bao giờ chạy.

Tôi nghĩ bạn có thể sử dụng dạng thứ hai là add_custom_command để đạt được mục tiêu của mình; cái gì đó như:

add_custom_command(TARGET MainTest 
        POST_BUILD 
        COMMAND ctest -C $<CONFIGURATION> --output-on-failure) 
+0

Cảm ơn cho câu trả lời, đánh giá cao này! Tôi tìm thấy giải pháp tương tự. Tôi tạo mục tiêu tùy chỉnh phụ thuộc vào mọi thử nghiệm đơn vị trong dự án và hơn tôi sử dụng 'add_custom_command' với mục tiêu tùy chỉnh của tôi làm thông số TARGET. Điều này là cần thiết vì tôi không muốn chạy thử nghiệm cũ. Và tôi cũng khám phá ra rằng không thể liệt kê tất cả các mục tiêu trong dự án 'cmake' để danh sách các mục tiêu cần được duy trì thủ công. – Lazin

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