Câu hỏi CMake & CTest: kiểm tra không xây dựng các bài kiểm tra


Tôi đang thử CTest trong CMake để tự động chạy một số thử nghiệm của mình bằng cách sử dụng make test Mục tiêu. Vấn đề là CMake không "hiểu" rằng bài kiểm tra tôi sẵn sàng chạy phải được xây dựng vì nó là một phần của dự án.

Vì vậy, tôi đang tìm một cách để xác định rõ ràng sự phụ thuộc này.


76
2018-04-09 09:22


gốc




Các câu trả lời:


Nó là được cho là một lỗi trong CMake (được theo dõi trước đó đây) điều này không làm việc ra khỏi hộp. Cách giải quyết là thực hiện những việc sau:

add_test(TestName ExeName)
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}
                  DEPENDS ExeName)

Sau đó, bạn có thể chạy make check và nó sẽ biên dịch và chạy thử nghiệm. Nếu bạn có nhiều bài kiểm tra, thì bạn sẽ phải sử dụng DEPENDS exe1 exe2 exe3 ... trong dòng trên.


58
2018-04-10 05:57



câu trả lời hoàn hảo, cảm ơn bạn :) - claf
vì vậy tôi đoán rằng mục tiêu "làm thử nghiệm" sẽ vẫn không được sử dụng vì có vẻ như bạn phải chọn một tên mục tiêu khác trong lệnh add_custom_target? - claf
@rq - nhưng làm thế nào tôi có thể làm điều này với nhiều dự án (khi một CMakeLists.txt là tiểu dự án khác) vì vậy mỗi người sẽ xác định check mục tiêu và họ có thể va chạm - Artyom
@Artyom - trong trường hợp đó bạn có lẽ tốt hơn chỉ bằng cách sử dụng tương đương "làm cho tất cả các thử nghiệm". Trong thực tế, đây là những gì tôi làm anyway. - richq
Trên thực tế, một số người coi nó là một tính năng (không phải là lỗi) của cmake mà bạn có thể chạy "make test" và chỉ chạy các bài kiểm tra như chúng không có bất kỳ bản dựng lại nào trước ... - DLRdave


Có thực sự là một cách để sử dụng make test. Bạn cần xác định việc xây dựng tệp thực thi thử nghiệm làm một trong các thử nghiệm và sau đó thêm các phụ thuộc giữa các thử nghiệm. Đó là:

ADD_TEST(ctest_build_test_code
         "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target test_code)
ADD_TEST(ctest_run_test_code test_code)
SET_TESTS_PROPERTIES(ctest_run_test_code
                     PROPERTIES DEPENDS ctest_build_test_code)

43
2018-05-30 21:32



Đây là một trong những chỉ có quy mô lên và không buộc bạn phải xây dựng các mục tiêu "làm cho tất cả" chỉ để chạy thử nghiệm. Nhược điểm có thể có: chi tiết về lỗi xây dựng trên các tệp nhị phân chỉ hiển thị trong tệp LastTest.log được tạo và không hiển thị trên stdout / stderr - Dave Abrahams
Câu trả lời tốt! Bạn nên thêm cấu hình vào mục tiêu xây dựng. Nếu không, bạn không thể chạy thử nghiệm trong tất cả các cấu hình. add_test (NAME "$ {ARGV0} _BUILD" COMMAND "$ {CMAKE_COMMAND}" - xây dựng $ {CMAKE_BINARY_DIR} - mục tiêu $ {target} "--config" "$ <CONFIG>") - Daniel
Điều này làm tắc nghẽn các phóng viên thử nghiệm với một loạt các bài kiểm tra giả mạo. - Barry


Tôi sử dụng một biến thể của câu trả lời của richq. Ở cấp cao nhất CMakeLists.txt, Tôi thêm mục tiêu tùy chỉnh, build_and_test, để xây dựng và chạy tất cả các thử nghiệm:

find_package(GTest)
if (GTEST_FOUND)
    enable_testing()
    add_custom_target(build_and_test ${CMAKE_CTEST_COMMAND} -V)
    add_subdirectory(test)
endif()

Trong tiểu dự án khác nhau CMakeLists.txt tệp dưới test/, Tôi thêm mỗi tệp thực thi thử nghiệm dưới dạng sự phụ thuộc của build_and_test:

include_directories(${CMAKE_SOURCE_DIR}/src/proj1)
include_directories(${GTEST_INCLUDE_DIRS})
add_executable(proj1_test proj1_test.cpp)
target_link_libraries(proj1_test ${GTEST_BOTH_LIBRARIES} pthread)
add_test(proj1_test proj1_test)
add_dependencies(build_and_test proj1_test)

Với cách tiếp cận này, tôi chỉ cần make build_and_test thay vì make test (hoặc là make all test), và nó chỉ có lợi ích của việc xây dựng mã thử nghiệm (và các phụ thuộc của nó). Đó là một sự xấu hổ tôi không thể sử dụng tên mục tiêu test. Trong trường hợp của tôi, nó không quá tệ vì tôi có một kịch bản cấp cao nhất thực hiện việc gỡ lỗi và phát hành ngoài cây (và được biên dịch chéo) bằng cách gọi cmake và sau đó makevà nó dịch test vào build_and_test.

Rõ ràng, các công cụ GTest là không cần thiết. Tôi chỉ tình cờ sử dụng / như Google Test và muốn chia sẻ một ví dụ hoàn chỉnh về việc sử dụng nó với CMake / CTest. IMHO, cách tiếp cận này cũng có lợi ích cho phép tôi sử dụng ctest -V, hiển thị kết quả Thử nghiệm của Google trong khi các thử nghiệm chạy:

1: Running main() from gtest_main.cc
1: [==========] Running 1 test from 1 test case.
1: [----------] Global test environment set-up.
1: [----------] 1 test from proj1
1: [ RUN      ] proj1.dummy
1: [       OK ] proj1.dummy (0 ms)
1: [----------] 1 test from proj1 (1 ms total)
1:
1: [----------] Global test environment tear-down
1: [==========] 1 test from 1 test case ran. (1 ms total)
1: [  PASSED  ] 1 test.
1/2 Test #1: proj1_test .......................   Passed    0.03 sec

11
2018-02-25 05:53



Trong ví dụ này, có cách nào để thực hiện kiểm tra để làm những gì ctest -V thay vì ctest? Đầu ra ctest trông rất không đầy đủ và chỉ nói rằng có một thử nghiệm duy nhất. - Rajiv


Nếu bạn đang cố gắng thi đua make check, bạn có thể thấy mục wiki này hữu ích:

http://www.cmake.org/Wiki/CMakeEmulateMakeCheck

Tôi vừa kiểm tra đó là những gì nó nói với thành công (CMake 2.8.10).


5
2018-03-12 16:08



Điều này sẽ xây dựng tất cả các tệp thực thi khi chạy make check. Đối với các bài kiểm tra với thời gian biên dịch thống trị, điều này làm cho ctest -R vô ích. - usr1234567


Tự cứu mình nhức đầu:

make all test

Làm việc ra khỏi hộp cho tôi và sẽ xây dựng các phụ thuộc trước khi chạy thử nghiệm. Với cách đơn giản này, nó gần như làm cho người bản xứ make test chức năng thuận tiện vì nó cung cấp cho bạn tùy chọn chạy thử nghiệm biên dịch cuối cùng ngay cả khi mã của bạn bị hỏng.


4
2018-04-04 08:48



Không hoạt động với CDash. Bạn phải gọi điện cho tất cả && ctest và sau đó tòa nhà không phải là một phần của thử nghiệm được tải lên. Vì vậy, việc xây dựng cảnh báo hoặc lỗi không hiển thị. - usr1234567
Cũng không hoạt động tốt nếu bạn muốn xây dựng song song, vì cả hai sẽ chạy song song: bạn cần make -j4 all && make test. Và nó cũng flaky bằng cách sử dụng một công cụ không xây dựng. - poolie


Tất cả các câu trả lời trên đều hoàn hảo. Nhưng thực ra CMake sử dụng CTest làm công cụ kiểm thử của nó, vì vậy phương pháp chuẩn (tôi nghĩ đó là) để thực hiện nhiệm vụ là:

enable_testing ()
add_test (TestName TestCommand)
add_test (TestName2 AnotherTestCommand)

Sau đó chạy cmake và chế tạo để xây dựng các mục tiêu. Sau đó, bạn có thể chạy làm bài kiểm trahoặc chỉ chạy

ctest

bạn sẽ nhận được kết quả. Điều này được thử nghiệm theo CMake 2.8.

Kiểm tra chi tiết tại: http://cmake.org/Wiki/CMake/Testing_With_CTest#Simple_Testing


-2
2017-08-24 14:20



đây là câu trả lời đúng! - jopasserat
Downvoted vì đôi khi bạn chỉ muốn xây dựng các mục tiêu cần thiết cho các bài kiểm tra thực sự đang chạy. - Dave Abrahams
Câu trả lời này dường như hiểu sai câu hỏi: OP đã thực hiện chính xác như câu trả lời này đề xuất: Sử dụng CTest, enable_testing(), add_test(), vv Vấn đề là anh ta phải tự phát hành lệnh xây dựng trước khi chạy thử nghiệm. Anh ta muốn make test nhắm mục tiêu tự động xây dựng các tệp thi hành thử nghiệm khi cần thiết. - bames53


Tất cả các câu trả lời đều tốt, nhưng chúng hàm ý một sự vi phạm truyền thống để chạy thử nghiệm bằng lệnh make test. Tôi đã thực hiện thủ thuật này:

add_test(NAME <mytest>
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND sh -c "make <mytarget>; $<TARGET_FILE:<mytarget>>")

Điều này có nghĩa là thử nghiệm bao gồm xây dựng (tùy chọn) và chạy mục tiêu thực thi.


-4
2018-05-20 13:25



Quy tắc # 1: Không sử dụng mã shell trong cmake :-) - Igor
:-D Quy tắc # 1: Không sử dụng hệ thống không có sh. Bạn có biết hệ thống như vậy không? - dyomas
Vâng, Windows là một trong số đó. - David Faure
Điều này cũng được mã hóa thành make và mất tính năng tạo tập lệnh của CMake cho các công cụ xây dựng khác. - poolie