用catkin_make test触发python rostest

2 投票
1 回答
1347 浏览
提问于 2025-04-28 18:15

目标:

我想通过在包的根目录下调用 catkin_make test 来在 ROS 环境中通过 rostest 触发一个 Python 单元测试。

我使用的 ROS 版本是 hydro,Python 版本是 2.7.3。

有效的部分:

根据 官方说明,我写了一个测试,使用命令 rostest jenkins_test_repro testAll.test 调用时运行得很好,相关的“启动”文件可以在 这里 找到。

直接执行脚本时也能正常工作……

测试输出:

/home/USER/VirtEnvPython/bin/python /home/USER/sandbox/metric_tester/src/jenkins_test_repro/scripts/TestMetricStarter.py
[ROSUNIT] Outputting test results to /home/USER/.ros/test_results/jenkins_test_repro/rosunit-MetricStarter.xml
test_server_feedback ... ok
test_true ... ok
-------------------------------------------------------------
SUMMARY:
 * RESULT: SUCCESS
 * TESTS: 2
 * ERRORS: 0 []
 * FAILURES: 0 []

测试文件:

#!/usr/bin/env python
PKG = 'jenkins_test_repro'
#import roslib; roslib.load_manifest(PKG)  # This line is not needed with Catkin.

import sys
import os
import rostest
import unittest
import requests

class TestMetricStarter(unittest.TestCase):

    def test_server_feedback(self):
        r = requests.get('http://SRV-ADR/MetricServer/default/index/MetricStarter' + os.getcwd())
        self.assertEqual(r.status_code, 200)

    def test_true(self):
        self.assertTrue(True)

if __name__ == '__main__':
    rostest.rosrun(PKG, 'MetricStarter', TestMetricStarter)

“启动”文件:

<launch>
    <test test-name="MetricStarter" pkg="jenkins_test_repro" type="TestMetricStarter.py" />
</launch>

问题:

为了通过 catkin_make test 调用测试,我需要在 CMakeLists.txt 中添加测试。我找到了三种方法来做到这一点,但我仍然不太清楚我到底需要做什么。对于所有方法,我都进行了干净的构建(删除 build / devel 并重新构建 catkin 工作空间)。

  1. 因为使用了 rostest,并且与命令行执行的方式类似。

    add_rostest(test/testAll.test)
    

    但测试似乎没有被执行:

    Running tests...
    Test project /home/USER/sandbox/metric_tester/build
        Start 1: _ctest_jenkins_test_repro_rostest_test_testAll.test
    1/1 Test #1: _ctest_jenkins_test_repro_rostest_test_testAll.test ...   Passed    1.64 sec
    
    100% tests passed, 0 tests failed out of 1
    
    Total Test time (real) =   1.65 sec
    catkin_make test  4.58s user 0.54s system 79% cpu 6.404 total
    

    我也尝试过:

    add_rostest(scripts/TestMetricStarter.py)
    

    这导致了以下错误:

    Running tests...
    Test project /home/USER/sandbox/metric_tester/build
        Start 1: _ctest_jenkins_test_repro_rostest_scripts_TestMetricStarter.py
    1/1 Test #1: _ctest_jenkins_test_repro_rostest_scripts_TestMetricStarter.py ...***Failed    0.46 sec
    
    0% tests passed, 1 tests failed out of 1
    
    Total Test time (real) =   0.47 sec
    
    The following tests FAILED:
          1 - _ctest_jenkins_test_repro_rostest_scripts_TestMetricStarter.py (Failed)
    Errors while running CTest
    make: *** [test] Error 8
    Invoking "make" failed
    
  2. 我只是尝试了一下,觉得这可能与 rostest 有关,

    add_rostest_gtest(jenkins_test_repro test/testAll.test scripts/TestMetricStarter.py)
    

    但由于输出和请求的链接语言,似乎是 C/C++ 的问题。

    CMake Error: CMake can not determine linker language for target:jenkins_test_repro
    CMake Error: Cannot determine link language for target "jenkins_test_repro".
    -- Generating done
    -- Build files have been written to: /home/USER/sandbox/metric_tester/build
    make: *** [cmake_check_build_system] Error 1
    
  3. 官方指南 中有一节关于将 测试作为 make tests 的一部分运行

    这导致的行为与第一种方法类似。

    catkin_add_nosetests(test/testAll.test)
    

    add_rostest(scripts/TestMetricStarter.py) 的结果相同。

    catkin_add_nosetests(scripts/TestMetricStarter.py)
    

    add_rostest(test/testAll.test) 的结果相同。

接下来怎么办?

所以我仍然在想,我该如何在 CMakeLists.txt 中添加测试……对于我来说,如何为用 Python 编写的单元测试做到这一点还不清楚。对于 C/C++ 有一些可行的方法,但 Python 呢?

由于构建农场上的工具链,如果能通过 catkin_make test 触发测试就太好了。其他绕过 CMake 的方法不在这个问题的范围内。

如果需要更多信息,请随时问我 :)。我希望有人能提供帮助或给出正确解决方案的提示。

编辑:我在 http://answers.ros.org 上发布了同样的问题,因为我觉得这仍然是一个非常具体的问题。如果我得到答案,我会在这里发布,以便有类似问题的人参考。

暂无标签

1 个回答

1

还是不太明白到底发生了什么变化,因为之前已经测试过 add_rostest(test/testAll.test)(第一次尝试)……

我只是往 CMakeLists.txt 文件里添加了以下几行:

if (CATKIN_ENABLE_TESTING)
  add_rostest(test/testAll.test)
endif()

撰写回答