本文是對《測試驅動的嵌入式 C 語言開發(fā)》第二章的實踐。
搭建 VSCode
這部分參考博文《基于Windows 的 VS Code C/C++ 編譯環(huán)境搭建》。
安裝 CMake
安裝 CMake
,在官網(wǎng)下載最新安裝包。安裝時選擇對所有用戶添加 CMake 到系統(tǒng) PATH。
安裝 VSCode 插件
安裝以下插件:
- CMake:VSCode 的 CMake 語言支持插件
- CMake Tools:對插件 CMake 的擴展支持
下載 Unity
Unity
是一個單元測試框架。目標是保持它的小而實用。Unity 測試框架的核心是三個文件:一個 C 文件和幾個頭文件。
這些組合起來提供功能和宏以使測試更容易。
Unity 被設計為跨平臺的。
它努力堅持 C 標準,同時仍為許多違反規(guī)則的嵌入式 C 編譯器提供支持。
Unity 已與許多編譯器一起使用,包括 GCC、IAR、Clang、Green Hills、Microchip 和 MS Visual Studio。
可在在Github拉取或下載源代碼。
使用 Unity
- 創(chuàng)建一個文件夾,這里命名為
TDDUnityExample
。
文件夾內保存你的項目源文件、Unity 測試框架源文件、測試用例等,而現(xiàn)在,它只是一個空文件夾。 - 在
TDDUnityExample
文件夾下再創(chuàng)建一個文件夾,這里命名為Unity
。
這個文件夾內存放 Unity 測試框架源文件:在從下載的 Unity源碼中將src
和extras
兩個文件夾拷貝到Unity
文件夾下。 - 在
TDDUnityExample
文件夾下再創(chuàng)建一個文件夾,這里命名為tests
。
這個文件夾內存放所有測試用例。我們以測試sprintf_s
函數(shù)為例。
在這個文件夾中創(chuàng)建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
文件夾下創(chuàng)建名為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")
#將所有源文件生成一個可執(zhí)行文件
add_executable(TDD_test ${APP_SRC_DIR} ${UNITY_SRC_LIST})
- 使用 VSCode 打開
TDDCppUTestExample
文件夾。單擊下圖所示紅框中的三角形。
第一次執(zhí)行會彈出選擇編譯套件的選項,這里選擇GCC
選擇完畢,VSCode 會調用CMake
根據(jù)CMakeLists.txt
文件內容生成Makefile
文件,然后調用指定編譯器完成源代碼編譯,如果生成可執(zhí)行文件,則執(zhí)行可執(zhí)行文件。Makefile
文件以及編譯生成文件會保存在TDDUnityExample
文件夾下的build
文件夾下,該文件夾由 VSCode 自動創(chuàng)建。
[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
- 在
終端
界面中,可以看到程序執(zhí)行結果,也就是測試輸出結果。
結束語
如果你想使用測試驅動開發(fā),又對本文舉例內容疑惑,可能是因為你還沒看過《測試驅動的嵌入式 C 語言開發(fā)》這本書。
不要被書名欺騙到,這絕不僅僅只是教授你測試驅動方法的,它還教授 C 程序設計模式,如何改善設計、如何寫出干凈利索的代碼,如何封裝和模塊化等等。
另外,本書是這么多年來我看過的嵌入式翻譯書籍中,翻譯最準確最清晰的一本。一股清流,值得大書特書。
文章來源:http://www.zghlxwxcb.cn/news/detail-417072.html
讀后有收獲,資助博主養(yǎng)娃 - 千金難買知識,但可以買好多奶粉 (〃‘▽’〃)
文章來源地址http://www.zghlxwxcb.cn/news/detail-417072.html
到了這里,關于測試驅動的嵌入式開發(fā) 002:VSCode + CMake + Unity 環(huán)境搭建的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!