การใช้ CMake ฉันจะรับเอาต์พุต verbose จาก CTest ได้อย่างไร


109

ฉันใช้ CMake เพื่อสร้างโครงการของฉัน ฉันได้เพิ่มไบนารีการทดสอบหน่วยซึ่งใช้กรอบการทดสอบหน่วย Boost ไบนารีเดียวนี้มีการทดสอบหน่วยทั้งหมด ฉันได้เพิ่มไบนารีนั้นให้รันโดย CTest:

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

แต่เอาต์พุตการสร้างใน Visual Studio จะแสดงเฉพาะผลลัพธ์ของการรัน CTest:

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

  0% tests passed, 1 tests failed out of 1

สิ่งนี้ไม่เป็นประโยชน์มากนักเพราะฉันไม่เห็นว่าการทดสอบใดล้มเหลว หากฉันเรียกใช้ ctest ด้วยตนเองจากบรรทัดคำสั่งโดยที่--verboseฉันได้รับผลลัพธ์จากการทดสอบหน่วย Boost ซึ่งจะบอกสิ่งที่ล้มเหลวจริง:

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

ดังนั้นฉันต้องเปลี่ยนอะไรบ้างใน CMakeLists.txt เพื่อให้ CTest ทำงาน--verboseตลอดเวลา มีวิธีที่ดีกว่าในการใช้การทดสอบหน่วย Boost กับ CMake / CTest หรือไม่?


คำตอบ:


92

คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมCTEST_OUTPUT_ON_FAILUREซึ่งจะแสดงผลลัพธ์จากโปรแกรมทดสอบเมื่อใดก็ตามที่การทดสอบล้มเหลว วิธีหนึ่งในการทำเช่นนี้เมื่อใช้ Makefiles และบรรทัดคำสั่งจะเป็นดังนี้:

env CTEST_OUTPUT_ON_FAILURE=1 make check

คำถามและคำตอบ Stack Overflow นี้แสดงวิธีตั้งค่าตัวแปรสภาพแวดล้อมใน Visual Studio


3
ไม่ทำงานสำหรับฉัน (ctest เวอร์ชัน 2.8.12.1) ฉันพยายามSET(CTEST_OUTPUT_ON_FAILURE TRUE)และSET(CTEST_OUTPUT_ON_FAILURE ON)แต่ก็ไม่มีผล รายงานอื่น ๆ ในเว็บยืนยันว่าสิ่งนี้เสีย
Joachim W

4
@JoachimWuttke set(CTEST_OUTPUT_ON_FAILURE TRUE)ไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อม ลองสิ่งนี้ในบรรทัดคำสั่ง: CTEST_OUTPUT_ON_FAILURE=TRUE make test.
thehouse

3
make CTEST_OUTPUT_ON_FAILURE=1 testสั้นกว่าและดีกว่า IMO
Timmmm

ในไฟล์แบตช์ windows วิธีใช้ CTEST_OUTPUT_ON_FAILURE = 1 ขณะโทร - msbuild /toolsversion:15.0 / p: Configuration = Release / p: Platform = x64 TESTS.vcxproj
Toral


30
  1. คุณสามารถตรวจสอบTesting/Temporaryโฟลเดอร์ย่อย มันถูกสร้างขึ้นโดยอัตโนมัติหลังจากเรียกใช้ทำการทดสอบ โฟลเดอร์นี้มีสองไฟล์: LastTest.logและLastTestsFailed.log. LastTest.logมีเอาต์พุตที่ต้องการสำหรับการทดสอบการรัน LastTestFailed.logมีชื่อของการทดสอบที่ล้มเหลว make testเพื่อให้คุณสามารถตรวจสอบได้ด้วยตนเองหลังจากการดำเนินการ

  2. วิธีที่สองคือรับ ctest เพื่อแสดงเนื้อหาของไฟล์บันทึกหลังจากเรียกใช้การทดสอบ:

    1. วางในbuild dir (ซึ่งคุณเรียกใช้make test) ไฟล์ CTestCustom.ctest (คุณสามารถทำได้ด้วยคำสั่งconfig fileเป็นต้น) โดยมีเนื้อหาต่อไปนี้

      CTEST_CUSTOM_POST_TEST ("การทดสอบแมว / ชั่วคราว / LastTest.log")

แทนที่จะเป็น cat คุณสามารถใช้คำสั่ง cmd ของ Windows ที่ทำสิ่งที่คล้ายกัน

  1. วิ่งmake testอีกครั้งรับกำไร!

ข้อมูลเพิ่มเติมเกี่ยวกับการปรับแต่ง ctest คุณสามารถหาได้ที่นี่ เพียงแค่ไปที่ส่วน "Customizing cmake" โชคดี!


1
โอเคขอบคุณ. ฉันหวังว่าจะมีวิธีแก้ไขแฟล็กที่แทรกลงใน project / makefiles สำหรับ ctest แต่ฉันไม่พบอะไรเลยและคำตอบของคุณดูเหมือนจะยืนยันได้ ข้อมูลชื่อไฟล์มีประโยชน์!
Skrymsli

1
ที่ไหนสักแห่งรอบ ctest 2.8.10 พวกเขาพังโดยใช้คำสั่งภายนอกที่มีอาร์กิวเมนต์ใน CTEST_CUSTOM_POST_TEST ดูgithub.com/openscad/openscad/issues/260
อย่าสว่าง

@don: บางทีพวกเขายังทำการทดสอบไม่เพียงพอใน ctest ;-)
Joachim W

ปัญหา CMake กับ CTEST_CUSTOM_POST_TEST ได้รับการแก้ไขแล้วใน 2.8.12
Ela782

24

ฉันต้องเพิ่มเป้าหมาย "ตรวจสอบ" ด้วยตัวเอง "ทำการทดสอบ" ไม่ได้ทำอะไรเลยด้วยเหตุผลบางประการ สิ่งที่ฉันทำ (ตามที่แนะนำใน stackoverflow) - ฉันเพิ่มเป้าหมายนี้ด้วยตนเอง เพื่อให้ได้ผลลัพธ์ verbose ฉันเพิ่งเขียนมันเช่น:

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

23

มีวิธีแก้ปัญหาที่ง่ายมาก (ซึ่งด้วยเหตุผลบางประการก็ยากที่จะค้นหาผ่าน Google Search):

ctest --output-on-failure

หากคุณใช้ CMake กับฟังก์ชันเปิดโฟลเดอร์ของ Visual Studio คุณสามารถเพิ่มไฟล์

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

การตั้งค่าการกำหนดค่าการสร้างของคุณ


1
ฉันชอบวิธีแก้ปัญหาของคุณมาก ไม่ใช่รายละเอียดยกเว้นความล้มเหลว
AnthonyD973

19

make check CTEST_OUTPUT_ON_FAILURE=TRUE


6
การโหวตลดลงทั้งหมดค่อนข้างน่าแปลกใจ: เกือบจะเทียบเท่ากับคำตอบที่ยอมรับ แต่สั้นและดีกว่า ยังใช้งานได้ในโครงการที่ฉันทดสอบ
zbyszek

2
ทำ CTEST_OUTPUT_ON_FAILURE = 1 การทดสอบ
Alex Punnen


10

วิธีการของฉันคือการรวมกันของคำตอบจาก ony , จาก zbyszekและจาก TARC ฉันใช้${CMAKE_COMMAND}ตัวแปร (ซึ่งตั้งค่าเป็นพา ธ สัมบูรณ์ไปยังไฟล์ปฏิบัติการ cmake ที่เรียกใช้) พร้อมกับ-E env CTEST_OUTPUT_ON_FAILURE=1อาร์กิวเมนต์เพื่อเรียกใช้คำสั่ง ctest จริงโดยใช้${CMAKE_CTEST_COMMAND} -C $<CONFIG>. เพื่อช่วยชี้แจงสิ่งที่เกิดขึ้นฉันเริ่มต้นด้วยสามcmake -E echoคำสั่งเพื่อแสดงไดเร็กทอรีการทำงานปัจจุบันและคำสั่ง ctest ที่จะเรียกใช้ 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
    )

สิ่งนี้เล่นได้ดีกับ MSVC IDE ซึ่งข้อผิดพลาดในการทดสอบจะแสดงเป็นข้อผิดพลาดในการคอมไพล์ที่คลิกได้ ดูcmake -E envสำหรับเอกสารของcmake -Eโหมดเครื่องมือบรรทัดคำสั่งแบบพกพา ฉันยังเพิ่มการพึ่งพาALL_BUILDเพื่อให้โครงการทั้งหมดถูกสร้างขึ้นก่อนที่จะเรียกใช้checkเป้าหมาย (ในรุ่น Linux อาจต้องเปลี่ยนALL_BUILDด้วยALLฉันยังไม่ได้ทดสอบสิ่งนี้บน Linux)


6

สำหรับคนที่ใช้ Visual Studio นี่คือรูปแบบอื่น (แฮ็ก) ในธีม:

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

1

ctest -VV หรือ ctest --extra-verbose

จากเอกสารประกอบ :

เปิดใช้งานเอาต์พุตแบบละเอียดเพิ่มเติมจากการทดสอบ

โดยปกติเอาต์พุตการทดสอบจะถูกระงับและแสดงเฉพาะข้อมูลสรุปเท่านั้น ตัวเลือกนี้จะแสดงผลลัพธ์การทดสอบเพิ่มเติม


0

เพื่อแสดงผลลัพธ์ด้วยไฟล์ XML คุณต้องดำเนินการทดสอบด้วยคำสั่งต่อไปนี้

~$ ctest -T Test

และเราพบผลลัพธ์ในการทดสอบ / 1234123432 / test.xml และไฟล์อื่น ๆ ก็ถูกสร้างขึ้นเช่นกันในโฟลเดอร์การทดสอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.