發表文章

目前顯示的是有「cpp」標籤的文章

unit testing 的第一步:使用 gcov/lcov 統計 c++ project 的 testing coverage

圖片
在寫 unit testing 時偶爾會不小心漏掉了一些 case 導致測試不完整,coverage report 可以幫我們做初步的檢查,確保測試程式有一定程度的品質,還可以順便抓出沒有用到的 code gcc --coverage 為了產生分析 coverage 必要的資料,我們必須在 compiler 時加上 --coverage 的參數,才能夠在程式執行時,得知每行程式碼是否有被跑到,在 link 時也要加上 --coverage 。重要的是還要將最佳化關掉,避免最佳化影響統計的結果,可以參考 CMakeLists.txt ,我使用的 gcc 版本為 7.4.0。 SET (GCC_COVERAGE_COMPILE_FLAGS "-g -O0 --coverage" ) SET (GCC_COVERAGE_LINK_FLAGS "--coverage" ) SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" ) SET (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}" ) 透過這樣的參數來 compile 後,可以發現所有 *.o 的旁邊都多出了 *.gcno 的檔案,可以想成他記錄了每一行的程式碼,之後要用來比對是否有哪一行沒有被執行到 範例 完整的 code 一樣放在 github 這次的範例包含了一個 TestClass 在 libarary 中,裡面有 private function 和會被測試到與不會被測試到的 function 各一個 void TestClass::TestedFunction( bool cond1, bool cond2) const { PrivateFunction(cond1, cond2); } void TestClass::UntestedFunction() const { PrivateFunction( false , false ); } void Tes...

在 python 中透過 ctypes 執行 C++ library 的 class

圖片
動機 目前大部份的程式都是用 C++ 來實作,不過有時候會有使用 python 比較方便的時候(例如做 API 的整合測試),這時候可能會在 python 實作一些和 C++ unit test 中一樣的邏輯,但直接重寫一次很容易在日後修改時發生行為不一致的狀況,因此讓 python 能夠直接使用 C++ 的 library 就是比較好的選擇 解法選擇 Boost.Python Python ctypes library 除非本來的 project 就有使用到 boost,否則要將 Boost.Python compile 起來是需要花一些工夫的,這邊會比較建議使用 ctypes library,但是 ctypes 只能夠支援 C 的 interface,這篇文章會教你如何將 C++ 的 class 透過 wrapper 的方法轉到 python 上,這方法是幾個月前從 stackoverflow 上看到的,我覺得比較容易讓 python 和 C++ 上對該 class 的使用體驗一致,分享給大家 Example 完整的 範例程式碼 都有放在 github 上 程式解說 每個檔案的說明如下: library.h library.cpp: 實作 class main.cpp: 使用 library.cpp 提供的 class 做 demo library-python.cpp: 提供介面給 ctypes library.py: 透過 ctype 提供 python 版本的 class ctypes-demo.py: 如同 main.cpp,使用 library.py 提供的 class 由於 cytpes 只支援 C 的介面,因此我們需要將 class 的每個操作都寫成 function 的形式(包括 constructor、destructor),並透過指標來 access member,這邊列出一部份的 code TestClass* TestClass_new() { return new TestClass(); } int TestClass_member(TestClass* ptr) { return ptr->member(); } 接著在 python 端,就可以透過 ...