Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 单元测试使用RTOS的项目_C_Unit Testing_Rtos_Ucos - Fatal编程技术网

C 单元测试使用RTOS的项目

C 单元测试使用RTOS的项目,c,unit-testing,rtos,ucos,C,Unit Testing,Rtos,Ucos,对于我的下一个嵌入式系统项目,我想拥抱单元测试。从技术上讲,它可能不是测试驱动的开发,但我至少希望预先测试单元测试,并进行全面的单元测试 我正在使用IAR温热工具链。我正在考虑使用cmocka、unity或cunit。我正在学习使用µC/OS-III作为RTO 这里有一个问题:单元测试如何与图中的RTO协同工作?例如:我应该禁用内核并将代码作为单线程应用程序进行单元测试,并存根所有/大多数内核调用,还是有更好的方法 示例: 在µC/OS-III中,入口点仍然是主要的。从main调用任何init代

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

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

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

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

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


这是最好的方法吗。或者我更适合启动内核,为我的测试运行程序创建一个任务,并以此作为一个线程运行所有任务,或者是否有其他好的方法,包括从测试工具生成其他任务。

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

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

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

决策覆盖范围包括显示所有条件的双方(对/错)都被覆盖

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

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

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

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

斯科特
经过验证的软件

从您自己的软件堆栈中隐藏某个抽象层的特定于RTOS的函数调用通常是一个好主意。这为您提供了更好的可移植性,如果您需要在任何地方更改平台,包括RTO。只要在一个地方更改API调用,就可以开始了

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

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

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