8

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

我正在使用 IAR EWARM 工具链。我正在考虑使用 cmocka、unity 或 cunit。我正在学习使用 µC/OS-III 作为 RTOS。

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

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

#ifdef UNIT_TEST
test_runner();
#else
OSStart(&err);
#endif

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

这是最好的方法吗?或者我是否更适合启动内核,为我的测试运行程序创建一个任务,并将所有任务作为一个线程运行,或者是否有其他一些好的方法涉及从测试工具中产生其他任务。

4

2 回答 2

3

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

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

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

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

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

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

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

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

Scott 验证软件

于 2015-05-04T23:35:44.813 回答
0

通常最好将某个抽象层的特定于 RTOS 的函数调用从您自己的软件堆栈中隐藏起来。如果您在哪里更改平台,包括 RTOS,这将为您提供更好的可移植性。只需在一处更改 API 调用即可。

进行额外抽象的这一步还有一个优势,这与这个答案相关:它使进行单元测试变得更加容易!为了使代码可链接,您可以模拟所有对 RTOS 函数的调用,以便在开发系统上运行测试,并使用 API 的一些简约实现!根据您的需要,这些模拟对象可以仅验证传递的参数是否符合预期。或者对于简单的 API 调用,您甚至可以实现一些功能来进一步扩展您自己的代码的测试。

显然,这仍然不能让您测试包含所有依赖项的整个代码。我想对于嵌入式系统来说,这根本是不可能的。但与不对使用 RTOS API 调用的模块进行任何单元测试相比,它已经走了很长一段路。

于 2020-11-26T14:58:20.233 回答