2014-07-08 28 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本身内部运行测试时显示漂亮状态指标。