軟件測試覆蓋率在軟件開發中至關重要。測試確保軟件按預期運行,而測試覆蓋率則確保您檢查了代碼的所有可能性,兩者相輔相成。許多現代語言在 50% 的情況下都具有生成覆蓋率摘要的庫或工具,但您知道 C 語言也有一個“原生”工具嗎?
讓我們從一個簡單的只返回 ±42 的代碼開始:
<code class="language-c">#include <stdbool.h> int return_42(bool ret_neg) { if (ret_neg) return -42; return 42; }</code>
現在是簡單的測試文件:
<code class="language-c">#include <assert.h> #include <stdbool.h> #include <stdio.h> int return_42(bool ret_neg); int main() { assert(return_42(false) == 42); assert(return_42(true) == -42); puts("Nice"); return 0; }</code>
現在,我們可以使用 gcc/cc 編譯器和 -fprofile-arcs
和 -ftest-coverage
標記編譯代碼。
這將生成一個可執行文件和擴展名為 .gcno
的文件。
創建這些文件後,我們運行測試,運行結束後將創建擴展名為 .gcda
的文件。
有了這些新創建的文件,我們可以使用gcov 工具處理它們(請先安裝gcov),然後執行gcov 並傳入.gcda
和.gcno
文件名(通常它們與.c
文件同名,但也可能不同)。這將生成擴展名為 .gcov
的文件。 gcov 將提供一個關於覆蓋率的小型摘要,但是對於超過一個簡單的測試(例如,我在一個庫中超過 120 個測試),我們需要更直觀的顯示結果。
接下來,我們將使用 lcov(請先安裝 lcov),使用 -c
、-d .
和 -o foobar.info
標記運行 lcov。它將生成一個名為 foobar.info
的文件,並打印覆蓋率摘要。不幸的是,這個摘要沒有說明哪些函數被檢查到,但是有了創建的 .info
文件,我們可以使用 -l foobar.info
標記運行 lcov,它將打印一個更易讀的表格摘要。然而,我們仍然只得到一個百分比,無法看到哪些行被檢查到,因此讓我們進入最後一步,使結果更易於可視化。
只需使用 genhtml,傳入 foobar.info
和 -o bar_html
標記。 genhtml 將生成一個包含更易讀的覆蓋率摘要的文件夾(您可以隨意打開此 html 文件,我個人最喜歡的打開方式是使用 python -m http.server -d bar_html
)。
您也可以使用 clang,但標記會發生變化。由於我不太喜歡 clang,並且覺得最終結果不太美觀,所以我沒有深入研究,但據我嘗試,所有功能都可以使用 llvm 運行,您只需安裝兩個 llvm 工具即可。
最後,genhtml 具有許多可定制的標記,我的常用標記如下:
好了,今天就到這裡,下次再見!
以上是C IS中的C測試覆蓋範圍會教您如何使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!