用catkin_make test触发python rostest
目标:
我想通过在包的根目录下调用 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 工作空间)。
因为使用了
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
我只是尝试了一下,觉得这可能与 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
在 官方指南 中有一节关于将 测试作为
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 个回答
还是不太明白到底发生了什么变化,因为之前已经测试过 add_rostest(test/testAll.test)
(第一次尝试)……
我只是往 CMakeLists.txt 文件里添加了以下几行:
if (CATKIN_ENABLE_TESTING)
add_rostest(test/testAll.test)
endif()