Unit testing 如何使用Ceedling/Unity/Cmock测试嵌入式系统

Unit testing 如何使用Ceedling/Unity/Cmock测试嵌入式系统,unit-testing,cmock,ceedling,Unit Testing,Cmock,Ceedling,我对使用ceedling测试嵌入式系统是新手。我想知道在学习如何使用ceedling方面是否有一个好的起点 我正在做的项目是一个CubeSat项目的嵌入式系统,我们需要一种测试代码的方法 有很多方法可以进入它。我更喜欢克隆ceedling(git clone)https://github.com/ThrowTheSwitch/Ceedling.git &&git子模块update--init--recursive),并运行一个示例来了解它是如何工作的 要使示例/温度传感器正常工作,您需要进行三次

我对使用ceedling测试嵌入式系统是新手。我想知道在学习如何使用ceedling方面是否有一个好的起点


我正在做的项目是一个CubeSat项目的嵌入式系统,我们需要一种测试代码的方法

有很多方法可以进入它。我更喜欢克隆ceedling(
git clone)https://github.com/ThrowTheSwitch/Ceedling.git &&git子模块update--init--recursive
),并运行一个示例来了解它是如何工作的

要使示例/温度传感器正常工作,您需要进行三次修改:

  • project.yml-插件、加载路径应为
    。/../plugins
  • rakefile.rb-PROJECT_CEEDLING_ROOT应该是
    “./…”
  • lib/ceedling/rakefile.rb-添加一行引用
    diy/test
以下是我在master(git commit 09a04cb55a86)上所做修改的差异:

通过从
examples/temp\u sensor
内运行
rake test
来运行示例

您需要为temp_传感器示例安装ruby(用于rake)和gcc


一旦你确定了
example/temp\u sensor/rakefile.rb
example/temp\u sensor/project.yml
文件的格式,关键的工作就在
examples/temp\u sensor/test/test…
文件中。

你首先应该了解的是,Ceedling或任何单元测试框架都是为了测试您的代码并扩展到最终项目。您通常使用某种基于标准的编译器在PC上测试代码,而不一定是嵌入式系统的交叉编译器。您可以在目标上运行ceedling生成的测试,但您可能不想这样做

关于这一主题的最好的书(不是完美的,但仍然很好)是James W.Grenning的嵌入式C测试驱动开发(实用程序员)

我个人有一个关于在老年人的指导下建立的要点。主要是关于在windows上获取Ruby和GCC的自我说明

在Linux下,Ceedling非常容易安装和运行

  • 确认您有gcc可用
  • 确认你有带宝石的ruby
  • gem安装ceedling
  • 塞德林
  • 就这样。 如果您正在适应一个新的项目,您将需要摆弄project.yml文件来告诉ceedling您的源文件和include文件在哪里,以及您希望测试文件去哪里。对于某些项目结构来说,这可能是一个挑战,但如果所有其他方面都失败了,您只需在project.yml文件中按名称放置一个文件夹(这不是最好的,但对于混乱的项目来说是最终的回退) 还有其他学习曲线的东西,比如ceedling test_xxx.c文件,它们有点神奇,它们包含您的测试,但也像链接器控制文件一样。假设test_xxx.c文件中的每个include文件都有一个具有相同基本名称的对应翻译单元(.c文件)。Ceedling将搜索它并将其编译到您的测试中。如果要排除该代码,但需要某些依赖项,请更改include文件名以包含单词mock,从而自动模拟接口,使foo.h变为mock_foo.h,并将为标头中找到的所有声明函数创建模拟函数。如果您没有header/Transalation\u单元名称对,您可以通过将文件名放入名为TEST\u file的宏中来告诉ceedling编译和链接文件。因此,如果您没有foo.h但需要foo.c:

    TEST_FILE("foo.c")
    
    页面上还有许多其他优秀的资源。 希望有帮助。我从不需要直接从github中提取工具,但是如果你想给他们发送补丁,我想这是另一种方式,但是他们花了很多精力来减少设置和开始使用时的摩擦,我会先从ruby方法开始


    旁注:现在模块生成器插件中有一些很酷的单元测试挂钩,可以自动生成测试存根,这在目标测试中可能非常有用

    几年前,使用rake驱动ceedling已被弃用。使用gem简单多了,这是一个对ruby几乎一无所知的人写的。看看我的答案。
    TEST_FILE("foo.c")