1

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

我正在开发的项目是用于 CubeSat 项目的嵌入式系统,我们需要一种方法来测试我们的代码。

4

2 回答 2

1

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

关于这个主题的最好的书(不完美但仍然很好)是 James W. Grenning 的 Test Driven Development for Embedded C(Pragmatic Programmers)。

我有一个关于在旧Windows下设置的个人 GIST 。主要是对我自己在 Windows 上获取 Ruby 和 GCC 的注释。

在 Linux Ceedling 下安装和运行超级容易。

  1. 确认您有可用的 gcc
  2. 确认你有宝石红宝石
  3. 宝石安装ceedling
  4. 割礼

就是这样。如果你正在适应一个新项目,你将需要摆弄 project.yml 文件来告诉 ceedling 你的源文件和包含文件在哪里,以及你希望你的测试文件去哪里。这在某些项目结构上可能具有挑战性,但如果所有其他方法都失败了,您只需在 project.yml 文件中按名称放置文件夹(不是最好的,但对于疯狂的混乱项目的最终后备)还有其他学习曲线的东西,例如 ceedling test_xxx.c 文件有点神奇,因为它们包含您的测试,但也像链接器控制文件一样。假定 test_xxx.c 文件中的每个包含文件都有一个具有相同基本名称的相应翻译单元(.c 文件)。Ceedling 将搜索它并将其编译到您的测试中。如果您想排除该代码但需要一些依赖项,您可以更改包含文件名以包含单词 mock 以自动模拟接口,因此 foo.h 变为 mock_foo.h 并将为在标题。如果您没有 header/tranalation_unit 名称对,您可以告诉 ceedling 编译和链接文件,方法是将其名称放在名为 TEST_FILE 的宏中。所以如果你没有 foo.h 但需要 foo.c:

TEST_FILE("foo.c")

Throw The Switch页面上还有很多其他很棒的资源。希望有帮助。我从来不需要直接从 github 拉工具,但如果你想向他们发送补丁,我想这是另一种方式,但他们付出了很多努力,使其在设置和开始使用时没有摩擦,我会从 ruby​​ 开始先说方法。

旁注现在 module_generator 插件中有一些很酷的单元测试钩子可以自动生成用于测试的存根,这在目标测试期间可能非常有用。

于 2020-05-05T16:25:50.797 回答
0

有很多方法可以进入它。我的偏好是克隆 ceedling ( git clone https://github.com/ThrowTheSwitch/Ceedling.git && git submodule update --init --recursive) 并运行一个示例来查看它是如何工作的。

要使 examples/temp_sensor 工作,您需要进行三处修改:

  • project.yml - 插件,load_paths 应该是../../plugins
  • rakefile.rb - PROJECT_CEEDLING_ROOT 应该是"../.."
  • lib/ceedling/rakefile.rb - 添加一行引用diy/test

这是我对 master 所做的修改的差异(git commit 09a04cb55a86):

diff --git a/examples/temp_sensor/project.yml b/examples/temp_sensor/project.yml
index ec9a45e..a327f5b 100644
--- a/examples/temp_sensor/project.yml
+++ b/examples/temp_sensor/project.yml
@@ -58,7 +58,7 @@

 :plugins:
   :load_paths:
-    - vendor/ceedling/plugins
+    - ../../plugins
   :enabled:
     - stdout_pretty_tests_report
     - module_generator
diff --git a/examples/temp_sensor/rakefile.rb b/examples/temp_sensor/rakefile.rb
index 1b534d2..82d2e64 100755
--- a/examples/temp_sensor/rakefile.rb
+++ b/examples/temp_sensor/rakefile.rb
@@ -1,4 +1,4 @@
-PROJECT_CEEDLING_ROOT = "vendor/ceedling"
+PROJECT_CEEDLING_ROOT = "../.."
 load "#{PROJECT_CEEDLING_ROOT}/lib/ceedling.rb"

 Ceedling.load_project
diff --git a/lib/ceedling/rakefile.rb b/lib/ceedling/rakefile.rb
index 37001ba..be6b620 100644
--- a/lib/ceedling/rakefile.rb
+++ b/lib/ceedling/rakefile.rb
@@ -9,6 +9,7 @@ CEEDLING_RELEASE = File.join(CEEDLING_ROOT, 'release')
 $LOAD_PATH.unshift( CEEDLING_LIB )
 $LOAD_PATH.unshift( File.join(CEEDLING_VENDOR, 'unity/auto') )
 $LOAD_PATH.unshift( File.join(CEEDLING_VENDOR, 'diy/lib') )
+$LOAD_PATH.unshift( File.join(CEEDLING_VENDOR, 'diy/test') )
 $LOAD_PATH.unshift( File.join(CEEDLING_VENDOR, 'cmock/lib') )
 $LOAD_PATH.unshift( File.join(CEEDLING_VENDOR, 'deep_merge/lib') )

rake test通过从内部运行来运行示例examples/temp_sensor

您需要为 temp_sensor 示例安装 ruby​​(用于 rake)和 gcc。

一旦你确定了example/temp_sensor/rakefile.rbexample/temp_sensor/project.yml文件的格式,关键工作就在examples/temp_sensor/test/Test...文件中。

于 2020-02-13T22:10:46.047 回答