如何让我的Hudson项目在第二组nosetests时构建失败?

2 投票
1 回答
865 浏览
提问于 2025-04-16 09:30

我对Hudson还比较陌生,所以如果这个问题听起来很简单,请多包涵。

我有一个用Python写的项目(使用了pylons和nosetests),里面有服务器部分和客户端部分。我在服务器和客户端的结构中都设置了功能测试,以测试这两个部分。在我的构建脚本中(这是一个从Hudson项目配置页面启动的shell脚本),我依次运行了两个不同的nosetests,像这样:

# 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

然后我关闭服务器。

第一组测试(服务器测试)总是能通过。如果有测试失败,构建就会报告失败,状态球会变红。然而,第二组测试(客户端测试)却总是失败。如果有测试失败,标准输出会报告失败,脚本显示退出状态为123,但构建从来没有失败过。

我尝试在Hudson配置中添加

maven.test.failure.ignore=false
,这是基于我在StackOverflow上看到的其他问题,但似乎没有什么改变。我还试着强制脚本用一个人为的退出值来结束,以看看它是否在关注退出值,但这也没有改变情况。我还尝试把客户端测试放在服务器测试之前,看看Hudson是否只允许一组nosetests,但这也没有改变任何事情。

如果有人知道我可能做错了什么,我会非常感激。如果你需要更多信息,请告诉我。

谢谢!

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

更新:

我成功让第二组测试工作,像这样:

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

不过,我并没有对服务器测试做出任何更改。只有客户端测试需要这样。服务器测试仍然可以正常工作,仍然是这样的:

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吞掉了$?,但这并不能解释为什么服务器测试(在失败时)能成功,而客户端测试却不能(除非$?被捕获)。

1 个回答

2

光看你的退出命令,我就想知道为什么当服务器测试失败时,你的构建会出错。这可能和你的构建失败时服务器无法启动有关。实际上,你检查的是echo的退出状态,而不是你的测试套件的退出状态。你应该先捕获你的退出状态,使用 my_exit = $?,然后总是用 $my_exit 来代替 $?

撰写回答