Sử dụng CMake, làm cách nào để nhận kết quả dài dòng từ CTest?


109

Tôi đang sử dụng CMake để xây dựng dự án của mình. Tôi đã thêm một nhị phân kiểm tra đơn vị đang sử dụng khung kiểm tra đơn vị Boost. Một nhị phân này chứa tất cả các bài kiểm tra đơn vị. Tôi đã thêm tệp nhị phân đó để được chạy bởi CTest:

ADD_EXECUTABLE( tftest test-main.cpp )
ENABLE_TESTING()
ADD_TEST( UnitTests tftest)

Nhưng đầu ra bản dựng trong Visual Studio chỉ hiển thị kết quả của việc chạy CTest:

      Start 1: UnitTests
  1/1 Test #1: UnitTests ................***Failed    0.05 sec

  0% tests passed, 1 tests failed out of 1

Điều này không hữu ích lắm, vì tôi không thể thấy thử nghiệm nào không thành công. Nếu tôi chạy ctest theo cách thủ công từ dòng lệnh, --verbosetôi nhận được kết quả từ kiểm tra đơn vị Boost cho biết điều gì thực sự không thành công:

1: Test command: tftest.exe
1: Test timeout computed to be: 9.99988e+006
1: Running 4 test cases...
1: test-main.cpp(20): error in "sanity_check3": check 1 == 2 failed
1:
1: *** 1 failure detected in test suite "Master Test Suite"
1/1 Test #1: UnitTests ................***Failed    0.00 sec

Vì vậy, tôi cần thay đổi những gì trong CMakeLists.txt để CTest chạy --verbosemọi lúc? Có cách nào tốt hơn để sử dụng các bài kiểm tra đơn vị Boost với CMake / CTest không?


Câu trả lời:


92

Bạn có thể đặt biến môi trường CTEST_OUTPUT_ON_FAILURE, biến này sẽ hiển thị cho bạn bất kỳ đầu ra nào từ chương trình thử nghiệm bất cứ khi nào thử nghiệm không thành công. Một cách để thực hiện việc này khi sử dụng Makefiles và dòng lệnh sẽ như sau:

env CTEST_OUTPUT_ON_FAILURE=1 make check

Câu hỏi và câu trả lời về Stack Overflow này cho biết cách đặt các biến môi trường trong Visual Studio.


3
Không hoạt động đối với tôi (ctest phiên bản 2.8.12.1). Tôi đã thử SET(CTEST_OUTPUT_ON_FAILURE TRUE)SET(CTEST_OUTPUT_ON_FAILURE ON), nhưng nó không có tác dụng. Các báo cáo khác trên web chứng thực rằng điều này đã bị hỏng.
Joachim W

4
@JoachimWuttke set(CTEST_OUTPUT_ON_FAILURE TRUE)không đặt biến môi trường . Hãy thử điều này trên dòng lệnh: CTEST_OUTPUT_ON_FAILURE=TRUE make test.
thehouse

3
make CTEST_OUTPUT_ON_FAILURE=1 testIMO ngắn hơn và đẹp hơn.
Timmmm

Trên tệp loạt cửa sổ, cách sử dụng CTEST_OUTPUT_ON_FAILURE = 1 trong khi gọi - msbuild /toolsversion:15.0 / p: Configuration = Release / p: Platform = x64 TESTS.vcxproj
Toral

34

Bạn có thể gọi điện ctesttrực tiếp, sau khi chuẩn bị và thực hiện dự án của mình.

ctest --verbose

29
  1. Bạn có thể kiểm tra Testing/Temporarythư mục con. Nó được tạo tự động sau khi chạy thử nghiệm. Thư mục này chứa hai tệp: LastTest.logLastTestsFailed.log. LastTest.logchứa đầu ra mong muốn cho các thử nghiệm chạy. LastTestFailed.logchứa tên của các thử nghiệm thất bại. Vì vậy, bạn có thể kiểm tra chúng theo cách thủ công sau khi thực hiện make test.

  2. Cách thứ hai là để ctest hiển thị cho bạn nội dung của tệp nhật ký sau khi chạy thử nghiệm:

    1. đặt trong tệp build dir (từ đó bạn chạy make test) tệp CTestCustom.ctest (bạn có thể thực hiện bằng lệnh config tệp , chẳng hạn) với nội dung sau

      CTEST_CUSTOM_POST_TEST ("Thử nghiệm mèo / Tạm thời / LastTest.log")

Thay vì mèo, bạn có thể sử dụng bất kỳ lệnh cmd nào của Windows thực hiện những việc tương tự.

  1. chạy make testlại và nhận được lợi nhuận!

thông tin bổ sung về tùy chỉnh ctest bạn có thể tìm thấy ở đây . Chỉ cần bước đến phần "Tùy chỉnh cmake". Chúc may mắn!


1
Được rồi, cảm ơn. Tôi đã hy vọng sẽ có một cách để sửa đổi các cờ được chèn vào dự án / makefiles cho ctest, nhưng tôi không tìm thấy bất cứ điều gì và câu trả lời của bạn dường như xác nhận điều đó. Thông tin tên tệp rất hữu ích!
Skrymsli

1
ở đâu đó xung quanh ctest 2.8.10 họ đã bị hỏng bằng cách sử dụng các lệnh bên ngoài với các đối số trong CTEST_CUSTOM_POST_TEST xem github.com/openscad/openscad/issues/260
don

@don: có thể họ không chạy đủ các xét nghiệm trên ctest ;-)
Joachim W

Sự cố CMake với CTEST_CUSTOM_POST_TEST đã được khắc phục trong 2.8.12.
Ela782

23

Tôi đã phải thêm mục tiêu "kiểm tra" của chính mình. "làm cho các bài kiểm tra" không làm gì bởi một số lý do. Vì vậy, những gì tôi đã làm (như được đề xuất ở đâu đó trên stackoverflow) - Tôi đã thêm mục tiêu này theo cách thủ công. Để có được đầu ra dài dòng, tôi chỉ cần viết nó như sau:

add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)

21

Có một giải pháp rất đơn giản (vì một số lý do rất khó tìm thấy qua Google Tìm kiếm):

ctest --output-on-failure

Nếu bạn sử dụng CMake với chức năng thư mục mở của Visual Studio, bạn có thể thêm

"ctestCommandArgs": "--output-on-failure"

thiết lập cấu hình bản dựng của bạn.


1
Tôi thích giải pháp của bạn rất nhiều; nó không dài dòng ngoại trừ thất bại.
AnthonyD973

19

make check CTEST_OUTPUT_ON_FAILURE=TRUE


6
Tất cả các phiếu giảm giá đều khá bất ngờ: điều này gần như tương đương với câu trả lời được chấp nhận, nhưng ngắn hơn và đẹp hơn. Cũng hoạt động trong dự án tôi đã thử nghiệm.
zbyszek

2
thực hiện CTEST_OUTPUT_ON_FAILURE = 1 bài kiểm tra
Alex Punnen

11

Điều này làm cho đầu ra thử nghiệm dài dòng hơn:

make test ARGS="-V"

10

Cách tiếp cận của tôi là sự kết hợp của các câu trả lời từ ony , từ zbyszektừ tarc . Tôi sử dụng ${CMAKE_COMMAND}biến (được đặt thành đường dẫn tuyệt đối đến tệp thực thi cmake được gọi) với -E env CTEST_OUTPUT_ON_FAILURE=1đối số để gọi lệnh ctest thực sự bằng cách sử dụng ${CMAKE_CTEST_COMMAND} -C $<CONFIG>. Để giúp làm rõ những gì đang xảy ra, tôi bắt đầu với ba cmake -E echolệnh để hiển thị thư mục làm việc hiện tại và lệnh ctest sẽ được gọi. Đây là cách tôi gọi add_custom_target.

add_custom_target(check 
        ${CMAKE_COMMAND} -E echo CWD=${CMAKE_BINARY_DIR}
        COMMAND ${CMAKE_COMMAND} -E echo CMD=${CMAKE_CTEST_COMMAND} -C $<CONFIG>
        COMMAND ${CMAKE_COMMAND} -E echo ----------------------------------
        COMMAND ${CMAKE_COMMAND} -E env CTEST_OUTPUT_ON_FAILURE=1
            ${CMAKE_CTEST_COMMAND} -C $<CONFIG>
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    DEPENDS ALL_BUILD
    )

Điều này hoạt động tốt với MSVC IDE nơi bất kỳ lỗi kiểm tra nào được hiển thị dưới dạng lỗi biên dịch có thể nhấp. Xem cmake -E env để biết tài liệu về cmake -Echế độ công cụ dòng lệnh di động. Tôi cũng thêm một phụ thuộc vào ALL_BUILDđể tất cả các dự án sẽ được xây dựng trước khi gọi checkmục tiêu. (Trên các bản dựng Linux, một bản có thể cần phải thay thế ALL_BUILDbằng ALL; Tôi chưa thử nghiệm điều này trên Linux.)


6

Đối với những người sử dụng Visual Studio, đây là một biến thể khác (hack) về chủ đề:

cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target RUN_TESTS

0

để hiển thị kết quả bằng tệp XML, bạn phải thực hiện kiểm tra bằng lệnh sau

~$ ctest -T Test

và chúng tôi đã tìm thấy kết quả trong Thử nghiệm / 1234123432 / test.xml và các tệp khác cũng được tạo trong Thư mục Thử nghiệm


0

ctest -VV hoặc là ctest --extra-verbose

Từ tài liệu :

Cho phép đầu ra dài dòng hơn từ các bài kiểm tra.

Đầu ra kiểm tra thường bị tắt và chỉ thông tin tóm tắt được hiển thị. Tùy chọn này sẽ hiển thị nhiều đầu ra thử nghiệm hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.