PX4的代码测试
写完代码总要测试一下吧,自己先测试一下,怎么用Test呢?
官方关于测试的概括说明:
Platform Testing and Continuous Integration | PX4 User Guide
http://docs.px4.io/master/en/test_and_ci/
单元测试说明:
http://docs.px4.io/master/en/test_and_ci/unit_tests.html#unit-tests
PX4的测试有:
- 飞行测试
- 单元测试
- 集成测试
推荐一些顶级的开源CI/CD工具_云计算_Dan Barker_InfoQ精选文章
https://www.infoq.cn/article/3EsQkqH52bJGVQ*wejFu - ROS集成测试
- MAVSDK集成测试
- Docker
- 维护
单元测试
- 使用Google Test的单元测试,具有最小的,最少的内部依赖
- GTest功能测试——依赖parameters和uORB模块
- SITL单元测试——这适用于需要在完整 SITL 中运行的测试。这些测试运行起来要慢得多,也更难调试,因此建议尽可能使用 GTest。
- 单元测试应该安排在三个部分:设置、运行、检查结果。每个测试都应该测试一个非常具体的行为或设置案例,因此如果测试失败,很明显出了什么问题。请尽可能遵循这些标准。
- 将示例单元测试 AttitudeControlTest (opens new window) 复制并重命名到要测试的代码所在的目录。
- 将新文件添加到目录的 CMakeLists.txt。 它应该类似于 px4_add_unit_gtest(SRC MyNewUnitTest.cpp LINKLIBS <library_to_be_tested>)
- 添加所需的测试功能。 这意味着包括特定测试所需的头文件,添加新测试(每个测试都有一个单独的名称)并放置设置逻辑,运行要测试的代码并验证其行为是否符合预期。
- 如果需要额外的库依赖项,还应将它们添加到 LINKLIBS 之后的 CMakeLists 中,如上所示。
功能测试
当测试或被测试的组件依赖于参数、uORB 消息和/或高级 GTest 功能时,应使用 GTest 功能测试。此外,功能测试可以包含 STL 数据结构的本地使用(尽管要注意 macOS 和 Linux 之间的平台差异)。
创建新功能测试的步骤如下:
- 一般来说(和单元测试类似),功能测试应该分为三个部分:设置、运行、检查结果。每个测试都应该测试一个非常具体的行为或设置案例,因此如果测试失败,很明显出了什么问题。请尽可能遵循这些标准。
- 将示例功能测试 ParameterTest (opens new window) 复制并重命名到要测试的代码所在的目录。
- 将类从 ParameterTest 重命名为更好地代表正在测试的代码的名称
- 将新文件添加到目录的 CMakeLists.txt。它应该类似于 px4_add_functional_gtest(SRC MyNewFunctionalTest.cpp LINKLIBS <library_to_be_tested>)
- 添加所需的测试功能。这将意味着包括特定测试所需的头文件,添加新测试(每个测试都有一个单独的名称)并放置测试设置的逻辑,运行要测试的代码并验证其行为是否符合预期。
- 如果需要额外的库依赖项,还应将它们添加到 LINKLIBS 之后的 CMakeLists 中,如上所示。
可以通过 make 测试运行测试,之后您将在
build/px4_sitl_test/functional-MyNewFunctional
中找到二进制文件。它可以直接在调试器中运行,但是请注意使用
–gtest_filter=
参数在每个可执行调用中只运行一个测试,因为 uORB 和参数库的某些部分不会自行清理如果设置多次,可能会导致未定义的行为。
SITL 单元测试
当您特别需要所有飞行控制器组件(驱动程序、时间等)时,应使用 SITL 单元测试。这些测试运行速度较慢(每个新模块需要 1 秒以上),并且更难调试,因此通常只应在必要时使用它们。
创建新的 SITL 单元测试的步骤如下:
- 检查示例单元测试类(https://github.com/PX4/PX4-Autopilot/blob/master/src/include/unit_test.h)。
- 在测试中(PX4-Autopilot/src/systemcmds/tests/)。创建一个名为 test_[description].cpp 的新 .cpp 文件
- 在 test_[description].cpp 中包含基本的 unittest-class <unit_test.h> 以及为新功能编写测试所需的所有文件。
- 在 test_[description].cpp 中创建一个继承自 UnitTest 的类 [Description]Test。
- 在 [Description]Test 类中声明公共方法 virtual bool run_tests()。
- 在 [Description]Test 类中声明测试相关功能所需的所有私有方法(test1()、test2()、…)。
- 在 test_[description].cpp 中实现 run_tests() 方法,每个 test[1,2,…] 将在其中运行。
- 在 test_[description].cpp 中,实现各种测试。
- 在 test_[description].cpp 的底部声明测试:
ut_declare_test_c(test_[description], [Description]Test)
完整例子如下:
#include <unit_test.h>
#include "[new feature].h"
...
class [Description]Test : public UnitTest
{
public:
virtual bool run_tests();
private:
bool test1();
bool test2();
...
};
bool [Description]Test::run_tests()
{
ut_run_test(test1)
ut_run_test(test2)
...
return (_tests_failed == 0);
}
bool [Description]Test::test1()
{
ut_[name of one of the unit test functions](...
ut_[name of one of the unit test functions](...
...
return true;
}
bool [Description]Test::test2()
{
ut_[name of one of the unit test functions](...
ut_[name of one of the unit test functions](...
...
return true;
}
...
ut_declare_test_c(test_[description], [Description]Test)
请注意,ut_[name of one of the unit test functions]对应于 unit_test.h 中定义的单元测试函数之一
10. 在 tests_main.h(打开新窗口)中定义新测试:
extern int test_[description](int argc, char *argv[]);
- 在tests_main.c 中添加描述名称、测试功能和选项
...
} tests[] = {
{...
{"[description]", test_[description], OPTION},
...
}
OPTION 可以是 OPT_NOALLTEST、OPT_NOJIGTEST 或 0,如果在 px4 shell 中调用了两个命令之一,则考虑:
pxh> tests all
或者:
pxh> tests jig
如果测试具有选项 OPT_NOALLTEST,则在调用所有测试时将排除该测试。调用命令test jig时,OPT_NOJITEST 也是如此。选项 0 意味着永远不会排除测试,这是大多数开发人员想要使用的。
本地测试
make tests
直接从 bash 运行 GTest 单元测试、GTest 功能测试和 SITL 单元测试的完整列表:
make tests
各个 GTest 测试二进制文件位于 build/px4_sitl_test/ 目录中,可以直接在大多数 IDE 的调试器中运行。
make tests TESTFILTER=<regex filter expression>
使用以下命令过滤以使用 ctest 名称的正则表达式仅运行一部分测试:
make tests TESTFILTER=<regex filter expression>
例如:
- make tests TESTFILTER=unit only run GTest unit tests
- make tests TESTFILTER=sitl only run simulation tests
- make tests TESTFILTER=Attitude only run the AttitudeControl test
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)