对使用RTOS的项目进行单元测试

Nic*_*ick 6 c unit-testing rtos ucos

对于下一个嵌入式系统项目,我希望进行单元测试。从技术上讲,它可能不是测试驱动的开发,但我至少希望预先对单元测试进行测试并进行全面的单元测试。

我正在使用IAR EWARM工具链。我正在考虑使用cmocka,Unity或Cunit。我正在学习将µC / OS-III用作RTOS。

问题是:图片中的RTOS如何进行单元测试?EG:我应该禁用内核并作为单线程应用程序对代码进行单元测试,并对所有/大多数内核调用进行存根,还是有更好的方法?

示例: 在µC / OS-III中,入口仍然是主要入口。从main调用任何初始化代码,然后调用OSStart()开始多任务处理。因此,当我运行测试工具时,我无法调用OSStart()

#ifdef UNIT_TEST
test_runner();
#else
OSStart(&err);
#endif
Run Code Online (Sandbox Code Playgroud)

然后在任务的所有应用程序代码中,我只需要模拟消息传递并延迟对内核的调用。

那是做到这一点的最好方法。还是我更适合启动内核,为我的测试运行者创建任务,并从一个线程中运行所有任务,或者是否有其他好的方法涉及从测试工具中生成其他任务。

小智 3

您似乎对单元测试有误解。您的代码是否使用 RTOS 并不重要,因为单元测试涉及单独测试代码模块(即 C 函数)。RTOS 在测试期间不会运行。

\n\n

单元测试还假设您正在针对定义代码功能的一组需求进行测试。\n大多数单元测试的目标是能够提供各种形式的代码覆盖范围。这包括语句、决策和多条件决策覆盖。

\n\n

语句覆盖率表明您已经执行了函数中的每一行代码。

\n\n

决策覆盖涉及显示所有条件的双方(真/假)都被覆盖。

\n\n

多条件决策覆盖 (MCDC) 用于测试复杂决策,即 if (a && (b || c)) 并确保覆盖所有变化。MCDC 测试通常仅限于非常关键的应用,例如航空电子设备,其中的故障可能会导致灾难性的结果。

\n\n

子例程通常被存根,即拦截和控制,以证明每个子例程都按顺序调用,传递的参数是正确的,并且各种返回值功能正确。

\n\n

我承认我对您提到的工具没有任何经验,但是有许多可用的商业单元测试工具,Cantata、LDRA TestBench、IBM Rational Test Real Time 以及其他适合深度单元测试的工具。

\n\n

RTOS 本身也有商业解决方案。我的公司为 \xc2\xb5C/OS-II 和 \xc2\xb5C/OS-III 提供现成的单元和集成测试包。

\n\n

Scott\n经过验证的软件

\n