2016-08-11 154 views
2

我有一個項目涉及一些(相當簡單)的C代碼生成作爲構建系統的一部分。實質上,我有一些版本信息與我想在我的二進制文件中公開的項目(嵌入式C)相關聯,以便我可以輕鬆確定將哪些固件版本編程到特定設備以進行調試。單元測試C生成python代碼

我正在寫一些簡單的python工具來做到這一點,我想確保它們經過了徹底的測試。總的來說,這是相當直接的,但我不確定代碼生成部分的最佳策略是什麼。從本質上講,我想確保生成的文件都:

  • 的語法正確
  • 包含必要的信息

第二,我可以(我相信)實現在相當程度上與正則表達式匹配。然而,第一個是更重要的任務。我大概可以使用像pycparser這樣的東西,並檢查產生的AST來完成這兩個目標,但這似乎是一個不必要的重量級解決方案。

編輯:我的構建層次的數據流程圖

dataflow diagram

+2

正則表達式不是答案。 –

+1

請您[編輯您的問題](https:// stackoverflow。com/posts/38905560/edit),以包含C/Python/binary/codegen部分如何組合在一起的數據流圖,以及您試圖驗證哪個階段的輸出?此外,您是否試圖詳盡測試構建過程的某些方面,還是在您刻錄到Flash之前嘗試驗證您即將刻錄的映像是否具有基於C或Python源代碼的信息? (或別的?)謝謝! – cxw

+0

@cxw添加了一個基本圖。這只是代碼生成的單元測試,所以我關心的是頭文件/源文件對中存在所需的信息,而且這個對是有效的C(本身不會導致構建失敗) –

回答

2

謝謝你的圖!既然你沒有測試覆蓋範圍,如果是我,我只需編譯生成的C代碼,看看它是否工作:)。你沒有提到你的工具鏈,但是在類Unix環境中,gcc <whatever build flags> -c generated-file.c || echo 'Oops!'應該足夠了。

現在,它可能是生成的代碼不是一個獨立的編譯單元。沒有問題:寫一個墊片。例如shim.c

#include <stdio.h> 
#include "generated-file.c" 
main() { 
    printf("%s\n", GENERATED_VERSION); //or whatever is in generated-file.c 
} 

然後gcc -o shim shim.c && diff <(./shim) "name of a file holding the expected output" || echo 'Oops!'應該給你一個基本的測試。 (<()是bash process substitution。)持有預期結果的文件可能已經存在於您的git倉庫中,或者您可能可以使用Python例程將其寫入磁盤。

編輯2即使您的實際工具鏈不適合自動化,該方法也可以工作。要測試代碼的語法有效性,即使您爲目標處理器使用不同的編譯器,也可以使用gcc。例如,使用gcc -ansi進行編譯將禁用一些GNU擴展,這意味着與gcc -ansi編譯的代碼更有可能在另一個編譯器上進行編譯,而不是使用GNU擴展的全開啓編譯的代碼進行編譯。請參閱"C Dialect Options"上的gcc頁面,瞭解您可以使用的所有不同口味(ditto C++)。

編輯順便說一句,這是同樣的方法GNU autoconf使用:寫一個小的測試程序到磁盤(autoconf的稱之爲conftest.c),編譯它,並查看是否編譯成功。測試程序(最好)是測試一切是否正常所需的最低限度。根據Python的複雜程度,您可能需要使用各自不同的墊片測試生成的代碼的幾個不同方面。