2014-07-08 61 views
1

我在使用生成的Makefiles的NetBeans中有一個C++項目。我在Jenkins(持續集成服務器)中創建了一個工作來運行在NetBeans中配置的測試。現在Jenkins運行測試並捕獲它們的輸出,但即使測試失敗,它也認爲構建成功。NetBeans生成的Makefile忽略測試返回代碼

我正在使用Boost單元測試框架,當然任何正確的* nix程序都會返回一個非零代碼。所以我想知道爲什麼Jenkins在測試失敗時不明白。然後我發現這個通過NetBeans生成的Makefile-Debug.mk:

# Run Test Targets 
.test-conf: 
    @if [ "${TEST}" = "" ]; \ 
    then \ 
     ${TESTDIR}/TestFiles/f1 || true; \ 
     ${TESTDIR}/TestFiles/f2 || true; \ 
    else \ 
     ./${TEST} || true; \ 
    fi 

所以好像他們故意忽略所有測試的返回值。但是這沒有意義,因爲那麼你的測試測試是什麼?

我試圖在NetBeans中找到一個設置來說「讓失敗的測試破壞構建」,但沒有找到任何東西。我也嘗試在NetBeans跟蹤器中找到一個bug,但在我的簡短搜索中沒有看到任何錯誤。

有沒有其他合理的解決辦法?如果有任何測試失敗,我想讓詹金斯失敗。現在只有在測試失敗時纔會失敗build,但是如果它建立並且未能通過運行,則報告成功。

+0

我在NetBeans生成的'nbproject/Makefile-Debug.mk'中看不到這段代碼。在我的系統上沒有關於在這個文件中測試的內容。你是如何得到這個測試規則的? (我在沒有Java EE和服務器的NetBeans 8.0上 - 可能是這個原因嗎?) – HEKTO

+0

我正在使用NetBeans 8.0 for C++。我剛剛測試過創建一個新的C++應用程序,然後添加一個新的C++簡單測試。我用'throw;'替換了main()的底部的'return(EXIT_SUCCESS);'。當我運行測試時,儘管main()返回非零值,並且stderr顯示'Aborted(core dumped)',但NetBeans報告它仍然成功(!)。很明顯,NetBeans測試結果報告通過在標準輸出中對'%TEST_FAILED%'(它顯示在默認生成的C++簡單測試代碼中)中的魔術字符串進行刷新,並忽略返回值。這令人震驚。 –

+0

它看起來像這個「簡單測試」只是一個模板,而不是一個真實的東西。我找到了相當長的教程頁面:https://netbeans.org/kb/docs/cnd/c-unit-test.html。他們說你需要添加「CUnit」測試框架。仍然沒有關於Jenkins的消息...... – HEKTO

回答

1

事實證明,NetBeans(至少到版本8)不能支持這一點。我所做的解決方法是在Jenkins中執行make build-tests而不是make test,然後循環遍歷所有生成的測試文件(構建目錄中的TestFiles/f*)以運行它們。

這是NetBeans的Makefile生成器中的一個主要缺點,因爲它基本上與在NetBeans之外運行測試不兼容。感謝@HEKTO提供的鏈接,這使我想到了編寫NetBeans測試插件的頁面:http://wiki.netbeans.org/CND69UnitTestsPluginTutotial

頁面告訴你的基本內容是,NetBeans依賴解析測試的文本輸出來確定成功或失敗。它沒有告訴你的是,NetBeans生成的缺陷Makefile會忽略測試中的關鍵故障,包括異常終止,分段故障,斷言失敗,未捕獲的異常等等。它假設你將使用它所知道的測試框架CppUnit),或者在測試程序的正確時刻手動編寫魔術字符串。

我考慮花時間爲Boost單元測試框架編寫一個NetBeans單元測試插件,但它根本無助於Jenkins:插件僅用於在NetBeans本身內部運行測試時顯示漂亮狀態指標。