我是测试嵌入式系统的新手。我想知道在学习如何使用 ceedling 方面是否有一个好的起点。
我正在开发的项目是用于 CubeSat 项目的嵌入式系统,我们需要一种方法来测试我们的代码。
我是测试嵌入式系统的新手。我想知道在学习如何使用 ceedling 方面是否有一个好的起点。
我正在开发的项目是用于 CubeSat 项目的嵌入式系统,我们需要一种方法来测试我们的代码。
您应该了解的第一件事是 Ceedling 或任何单元测试框架首先旨在测试您的代码并扩展您的最终项目。您通常使用某种基于标准的编译器在您的 PC 上测试您的代码,而不一定是您的嵌入式系统的交叉编译器。您可以在目标上运行 ceedling 生成的测试,但您可能不想这样做。
关于这个主题的最好的书(不完美但仍然很好)是 James W. Grenning 的 Test Driven Development for Embedded C(Pragmatic Programmers)。
我有一个关于在旧Windows下设置的个人 GIST 。主要是对我自己在 Windows 上获取 Ruby 和 GCC 的注释。
在 Linux Ceedling 下安装和运行超级容易。
就是这样。如果你正在适应一个新项目,你将需要摆弄 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 插件中有一些很酷的单元测试钩子可以自动生成用于测试的存根,这在目标测试期间可能非常有用。
有很多方法可以进入它。我的偏好是克隆 ceedling ( git clone https://github.com/ThrowTheSwitch/Ceedling.git && git submodule update --init --recursive
) 并运行一个示例来查看它是如何工作的。
要使 examples/temp_sensor 工作,您需要进行三处修改:
../../plugins
"../.."
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.rb
和example/temp_sensor/project.yml
文件的格式,关键工作就在examples/temp_sensor/test/Test...
文件中。