测试驱动的嵌入式开发 002:VSCode + CMake + Unity 环境搭建
Posted 研究是为了理解
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测试驱动的嵌入式开发 002:VSCode + CMake + Unity 环境搭建相关的知识,希望对你有一定的参考价值。
本文是对《测试驱动的嵌入式 C 语言开发》第二章的实践。
搭建 VSCode
这部分参考博文《基于Windows 的 VS Code C/C++ 编译环境搭建》。
安装 CMake
安装 CMake
,在官网下载最新安装包。安装时选择对所有用户添加 CMake 到系统 PATH。
安装 VSCode 插件
安装以下插件:
- CMake:VSCode 的 CMake 语言支持插件
- CMake Tools:对插件 CMake 的扩展支持
下载 Unity
Unity
是一个单元测试框架。目标是保持它的小而实用。Unity 测试框架的核心是三个文件:一个 C 文件和几个头文件。
这些组合起来提供功能和宏以使测试更容易。
Unity 被设计为跨平台的。
它努力坚持 C 标准,同时仍为许多违反规则的嵌入式 C 编译器提供支持。
Unity 已与许多编译器一起使用,包括 GCC、IAR、Clang、Green Hills、Microchip 和 MS Visual Studio。
可在在Github拉取或下载源代码。
使用 Unity
- 创建一个文件夹,这里命名为
TDDUnityExample
。
文件夹内保存你的项目源文件、Unity 测试框架源文件、测试用例等,而现在,它只是一个空文件夹。 - 在
TDDUnityExample
文件夹下再创建一个文件夹,这里命名为Unity
。
这个文件夹内存放 Unity 测试框架源文件:在从下载的 Unity源码中将src
和extras
两个文件夹拷贝到Unity
文件夹下。 - 在
TDDUnityExample
文件夹下再创建一个文件夹,这里命名为tests
。
这个文件夹内存放所有测试用例。我们以测试sprintf_s
函数为例。
在这个文件夹中创建sprintf_s_test.c
、sprintf_s_runner.c
和all_test.c
三个文件。其中,sprintf_s_test.c
内容为:
#include <stdio.h>
#include "unity_fixture.h"
TEST_GROUP(sprintf);
TEST_SETUP(sprintf)
TEST_TEAR_DOWN(sprintf)
TEST(sprintf, NoFormatOperations)
char output[5];
TEST_ASSERT_EQUAL(4 , sprintf_s(output,4, "hey"));
TEST_ASSERT_EQUAL_STRING("hey", output);
TEST(sprintf, FormatOperations)
char output[20];
TEST_ASSERT_EQUAL(12, sprintf_s(output, 20, "Hello %s\\n", "World"));
sprintf_s_runner.c
内容为:
#include "unity_fixture.h"
TEST_GROUP_RUNNER(sprintf)
RUN_TEST_CASE(sprintf, NoFormatOperations);
RUN_TEST_CASE(sprintf, FormatOperations);
all_test.c
内容为:
#include "unity_fixture.h"
static void RunAllTests(void)
RUN_TEST_GROUP(sprintf);
int main(int argc, const char *argv[])
return UnityMain(argc, argv, RunAllTests);
- 在
TDDUnityExample
文件夹下创建名为CMakeLists.txt
的文件,该文件给 CMake使用,文件内容为:
# 最低CMake版本要求
cmake_minimum_required(VERSION 3.5.1)
#将src工作目录的绝对路径赋给SRC_DIR
file(GLOB_RECURSE APP_SRC_DIR "tests/*.c")
file(GLOB_RECURSE UNITY_SRC_LIST "Unity/*.c")
# 项目名称
project(TDD_test)
# 头文件路径
include_directories("tests")
include_directories("Unity/src")
include_directories("Unity/extras/fixture/src")
include_directories("Unity/extras/memory/src")
#将所有源文件生成一个可执行文件
add_executable(TDD_test $APP_SRC_DIR $UNITY_SRC_LIST)
- 使用 VSCode 打开
TDDCppUTestExample
文件夹。单击下图所示红框中的三角形。
第一次执行会弹出选择编译套件的选项,这里选择GCC
选择完毕,VSCode 会调用CMake
根据CMakeLists.txt
文件内容生成Makefile
文件,然后调用指定编译器完成源代码编译,如果生成可执行文件,则执行可执行文件。Makefile
文件以及编译生成文件会保存在TDDUnityExample
文件夹下的build
文件夹下,该文件夹由 VSCode 自动创建。
[proc] Executing command: "C:\\Program Files\\CMake\\bin\\cmake.EXE" --no-warn-unused-cli -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_C_COMPILER:FILEPATH=C:\\msys64\\mingw64\\bin\\gcc.exe -DCMAKE_CXX_COMPILER:FILEPATH=C:\\msys64\\mingw64\\bin\\g++.exe -Sc:/Users/jssh/Desktop/TDDUnityExample -Bc:/Users/jssh/Desktop/TDDUnityExample/build -G "Unix Makefiles"
[cmake] Not searching for unused variables given on the command line.
[cmake] -- The C compiler identification is GNU 12.2.0
[cmake] -- The CXX compiler identification is GNU 12.2.0
[cmake] -- Detecting C compiler ABI info
[cmake] -- Detecting C compiler ABI info - done
[cmake] -- Check for working C compiler: C:/msys64/mingw64/bin/gcc.exe - skipped
[cmake] -- Detecting C compile features
[cmake] -- Detecting C compile features - done
[cmake] -- Detecting CXX compiler ABI info
[cmake] -- Detecting CXX compiler ABI info - done
[cmake] -- Check for working CXX compiler: C:/msys64/mingw64/bin/g++.exe - skipped
[cmake] -- Detecting CXX compile features
[cmake] -- Detecting CXX compile features - done
[cmake] -- Configuring done
[cmake] -- Generating done
[cmake] -- Build files have been written to: C:/Users/jssh/Desktop/TDDUnityExample/build
[main] Building folder: TDDUnityExample TDD_test
[build] Starting build
[proc] Executing command: "C:\\Program Files\\CMake\\bin\\cmake.EXE" --build c:/Users/jssh/Desktop/TDDUnityExample/build --config Debug --target TDD_test -j 14 --
[build] [ 14%] [32mBuilding C object CMakeFiles/TDD_test.dir/tests/sprintf_s_runner.c.obj[0m
[build] [ 42%] [32mBuilding C object CMakeFiles/TDD_test.dir/tests/sprintf_s_test.c.obj[0m
[build] [ 42%] [32mBuilding C object CMakeFiles/TDD_test.dir/tests/all_teses.c.obj[0m
[build] [ 71%] [32mBuilding C object CMakeFiles/TDD_test.dir/Unity/extras/memory/src/unity_memory.c.obj[0m
[build] [ 71%] [32mBuilding C object CMakeFiles/TDD_test.dir/Unity/extras/fixture/src/unity_fixture.c.obj[0m
[build] [ 85%] [32mBuilding C object CMakeFiles/TDD_test.dir/Unity/src/unity.c.obj[0m
[build] [100%] [32m[1mLinking C executable TDD_test.exe[0m
[build] [100%] Built target TDD_test
[build] Build finished with exit code 0
- 在
终端
界面中,可以看到程序执行结果,也就是测试输出结果。
结束语
如果你想使用测试驱动开发,又对本文举例内容疑惑,可能是因为你还没看过《测试驱动的嵌入式 C 语言开发》这本书。
不要被书名欺骗到,这绝不仅仅只是教授你测试驱动方法的,它还教授 C 程序设计模式,如何改善设计、如何写出干净利索的代码,如何封装和模块化等等。
另外,本书是这么多年来我看过的嵌入式翻译书籍中,翻译最准确最清晰的一本。一股清流,值得大书特书。
读后有收获,资助博主养娃 - 千金难买知识,但可以买好多奶粉 (〃‘▽’〃)
以上是关于测试驱动的嵌入式开发 002:VSCode + CMake + Unity 环境搭建的主要内容,如果未能解决你的问题,请参考以下文章
测试驱动开发 002:VSCode + CMake + Unity 环境搭建
测试驱动的嵌入式开发 001:VSCode + CMake + CppUTest 环境搭建
测试驱动的嵌入式开发 001:VSCode + CMake + CppUTest 环境搭建