2

我对哈德森比较陌生,所以如果这是一个“duh”问题,请原谅我。

我有一个用python(使用pylons和nosetests)编写的项目,其中包括服务器组件和客户端组件。我在服务器层次结构和客户端层次结构中都设置了功能测试,以测试这两个组件。在我的构建脚本(从 hudson 项目配置页面启动的 shell 脚本)中,我连续运行了两个不同的鼻子测试,如下所示:

# Python tests for server
find $WORKSPACE/server/src/project/tests -iname "*test_*.py" | xargs $NOSETESTS --with-coverage --cover-package=project --cover-html --cover-erase --with-pylons="$PYLONS_INI"
echo "SERVER TEST EXIT STATUS: $?"
if [ $? -ne 0 ]; then
    test_status=$test_status+$?
    export TEST_STATUS=$test_status
    exit $?
fi

(然后,启动服务器后)

# Python tests for client
find $WORKSPACE/server/src/project/tests -iname "*test_*.py" | xargs $NOSETESTS --with-coverage --cover-package=projectclient --cover-html --cover-erase --with-pylons="$PYLONS_INI"
echo "CLIENT TEST EXIT STATUS: $?"
if [ $? -ne 0 ]; then
    test_status=$test_status+$?
    export TEST_STATUS=$test_status
    exit $?
fi

然后我关闭了服务器。

第一组测试(服务器测试)始终有效。如果测试失败,则构建报告失败,并且球会变为红色。然而,第二组(客户端测试)永远不会起作用。如果测试失败,STDOUT 会报告失败,并且脚本会显示退出状态 123,但构建永远不会失败。

我试过添加

maven.test.failure.ignore=false
根据我在 stackoverflow 上看到的其他一些问题,我的 hudson 配置,但似乎没有什么不同。我尝试强制脚本以人为的退出值终止,以查看它是否甚至关注退出值,但这并没有改变事情。我还尝试将客户端测试移到服务器测试之上,看看是否有某些原因导致 hudson 只允许一组鼻子测试,但这似乎也没有改变。

如果有人知道我可能做错了什么,我肯定会感谢您的帮助。如果您需要更多信息,请告诉我。

谢谢!

==============================

更新:

我能够让第二组测试像这样工作:

find $WORKSPACE/client/python/src/tests -iname "*test_*.py" | xargs $NOSETESTS --with-coverage --cover-package=projectclient --cover-html --cover-erase --with-pylons="$PYLONS_INI"
client_test_status=$?
if [ $client_test_status -ne 0 ]; then
    echo "Client Test Status = $client_test_status"
    exit $client_test_status
fi

但是,我不必对 SERVER 测试进行此更改。只有客户的。服务器测试仍然有效,并且仍然看起来像这样:

find $WORKSPACE/server/src/project/tests -iname "*test_*.py" | xargs $NOSETESTS --with-coverage --cover-package=project --cover-html --cover-erase --with-pylons="$PYLONS_INI"
if [ $? -ne 0 ]; then
    exit $?
fi

这里有一个假设,是 PIPE 吞咽 $? 可能存在问题,但这并不能解释为什么服务器测试成功(失败时),但客户端测试没有(除非 $? 被捕获) .

4

1 回答 1

2

仅查看您的退出命令就让我想知道为什么当服务器测试失败时您的构建会中断。这可能与构建失败时服务器无法启动有关。实际上,您正在检查echo 的退出状态,而不是测试套件的退出状态。首先捕获您的退出状态my_exit = $?,然后始终使用$my_exit而不是$?.

于 2011-01-06T20:53:22.867 回答