如何在CMake上爲我的Android本機C++代碼設置GoogleTest? Android NDK附帶googletest,但說明僅適用於Android.mk(here)。如何將Android.mk gtest安裝程序移植到我的CMakeLists.txt中?一旦設置完成,是否可以通過Android Studio的測試配置運行測試運行器?GoogleTest for Android NDK C++與CMake
10
A
回答
1
我只能提供對您的第一個和主要問題的答案,但它是一個可行的解決方案。這不是特定於Android的;只要您可以運行CMake和CTest,它就會工作。
我不知道很多關於GoogleTest,但我記得有一個幾個月前,一個非常類似的問題。就我而言,我想用CMake和Boost UnitTestFramework。
我搜索了一下,然後我遇到了a certain tutorial。他們提供的解決方案僅僅是使用正則表達式解析測試文件的內容。好處是,它是可定製的,並允許每個文件進行多個單元測試。我做到了這一點,它工作得非常好。當然,當你添加新的單元測試時,你必須重新運行CMake。
就像我說的,我會在下面發佈是針對升壓UnitTestFramework,但最大的區別是在正則表達式和變量名我使用。如果你不習慣在CMake中使用正則表達式(我不是),here是關於字符串操作的官方文檔頁面。
這裏是CMakeLists.txt
文件我結束了。我使用這個作爲獨立的CMakeLists.txt
文件在test/
目錄下。
# =============================
# = ADDING TESTS =
# =============================
include(CTest)
find_package(Boost COMPONENTS unit_test_framework REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
file(GLOB_RECURSE TEST_SRCS RELATIVE ${TEST_SOURCE_DIR} *.cpp)
set(TEST_EXTRA_LIBS ${Boost_LIBRARIES} ${TEST_MAIN_LIB})
# Function which, given a file name and a test name, yields the
# name of the GoogleTest test case.
# That way, several different files can have the same test name.
# Adapt this to GoogleTest.
function(getTestCase testFileName testName outTestCase)
string(REGEX MATCH "Test([_a-zA-Z][_a-zA-Z0-9]*)" match ${testFileName})
string(REGEX REPLACE ".*Test([_a-zA-Z][_a-zA-Z0-9]*).*" "\\1" testCase ${match})
set(testCase Test${testCase}${testName})
set(${outTestCase} ${testCase} PARENT_SCOPE)
endfunction()
# Function which adds all tests within a certain test file.
function(add_all_tests_in testSrc)
get_filename_component(testFileName ${testSrc} NAME_WE)
add_executable(${testFileName} ${testSrc})
target_link_libraries(${testFileName} ${TEST_EXTRA_LIBS})
set_target_properties(${testFileName} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
file(READ "${testSrc}" testFileContents)
# You should change this Regex for what you need in your case.
# Maybe something like:
# "TEST\\(*([_a-zA-Z][_a-zA-Z0-9]* *, *[_a-zA-Z][_a-zA-Z0-9]*) *\\)"
string(REGEX MATCHALL "DEF_TEST_CASE\\(*([_a-zA-Z][_a-zA-Z0-9]*) *\\)" unitTests ${testFileContents})
foreach(match ${unitTests})
# This replace will also probably need some change.
string(REGEX REPLACE ".*\\(*([_a-zA-Z][_a-zA-Z0-9]*) *\\).*" "\\1" testName ${match})
getTestCase(${testFileName} ${testName} testCase)
# Actually add the test.
# I wanted my CTest test names to be in the form
# <fileName>.<testName>, but you can use any
# format you want. Suit yourself.
#
# Also, in order for CMake to run the tests one by one,
# you have to find how to invoke the test executable.
# In the case of Boost, the option --run_test=<Boost_Test_Name>
# runs only the test called <Boost_Test_Name>. There should be
# an equivalent option for GoogleTest, I'm sure.
add_test(NAME "${testFileName}.${testName}" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${testFileName} --run_test=${testCase} --catch_system_error=yes)
endforeach()
endfunction()
# Actually add all tests in all test files.
foreach(testSrc ${TEST_SRCS})
add_all_tests_in(${testSrc})
endforeach()
適合我。一個build/
目錄下運行CMake的,運行所有測試產量後:
$ cd test && ctest
Test project /home/anthonyd973/Git/Git_Projects/MySweeper/build/test
Start 1: TestFieldMaker.makeFromFile
1/12 Test #1: TestFieldMaker.makeFromFile ........ Passed 0.03 sec
Start 2: TestFieldMaker.make
2/12 Test #2: TestFieldMaker.make ................ Passed 0.01 sec
Start 3: TestFieldMaker._computeFieldDims
3/12 Test #3: TestFieldMaker._computeFieldDims ... Passed 0.01 sec
Start 4: TestFieldMaker._populateField
4/12 Test #4: TestFieldMaker._populateField ...... Passed 0.00 sec
Start 5: TestInputField.InputField
5/12 Test #5: TestInputField.InputField .......... Passed 0.00 sec
Start 6: TestCell.Cell
6/12 Test #6: TestCell.Cell ...................... Passed 0.00 sec
Start 7: TestCell.initNeighbours
7/12 Test #7: TestCell.initNeighbours ............ Passed 0.00 sec
Start 8: TestCell.updateNeighbours
8/12 Test #8: TestCell.updateNeighbours .......... Passed 0.00 sec
Start 9: TestCell._mark
9/12 Test #9: TestCell._mark ..................... Passed 0.00 sec
Start 10: TestMySweeper.MySweeper
10/12 Test #10: TestMySweeper.MySweeper ............ Passed 0.00 sec
Start 11: TestField.Field
11/12 Test #11: TestField.Field .................... Passed 0.01 sec
Start 12: TestField._initNeighbours
12/12 Test #12: TestField._initNeighbours .......... Passed 0.00 sec
100% tests passed, 0 tests failed out of 12
Total Test time (real) = 0.10 sec
希望使用正則表達式不會導致你two problems :)。
相關問題
- 1. cmake失敗與Android ndk
- 2. CMake + GoogleTest
- 3. Android NDK,與其他庫CMake
- 4. libutils for android ndk
- 5. 調試Android Studio 2.2 CMake與NDK-Build
- 6. 使用C與Android ndk
- 7. 使用STL與Android NDK C++
- 8. Android的C++ NDK
- 9. NDK for AndroidStudio
- 10. SQLite與Android NDK
- 11. Android NDK 15c錯誤與python-for-android/kivy python 2
- 12. Android NDK使用llvm-libC++ for APP_STL
- 13. Android NDK與Visual Studio
- 14. Android的NDK與谷歌測試
- 15. android ndk的ndk-gdb與emacs的整合?
- 16. ANDROID NDK錯誤與OPENCV
- 17. cmake for OpenDDS Project
- 18. 使用Android NDK和C++
- 19. Android Studio C++ NDK庫示例
- 20. 在Android中使用SiftGPU(關於ndk,cmake和SSE)
- 21. 轉換gcc的一個命令向CMake的Android NDK
- 22. 未能創建新的Android NDK項目
- 23. Lisp和Android NDK
- 24. Android NDK ndk-build helloJni錯誤
- 25. 使用C和C++文件的Android NDK
- 26. 將CMake和ndk-build外部庫集成到Android Studio項目中
- 27. Android:在CMake中缺少功能vs ndk-build
- 28. 通過Gradle和Android NDK以詳細模式強制CMake
- 29. 如何指定Android NDK CMake構建目錄
- 30. 在Android NDK項目中從命令行運行CMake
@ user740857此答案有用嗎?如果是,請隨時接受並/或獎勵賞金。如果不是,你能否簡要解釋一下爲什麼其他人有機會爲你提供更好的答案? –
非常感謝您的見解。我似乎仍然無法理解如何從您的信息轉到Android設置。 – user740857
@ user740857是的,這是真的,我給你一個相當複雜的解決方案。但我不認爲有沒有簡單的方法可以在不編寫CMake代碼的情況下將GoogleTest移植到CMake。 –