2017-04-19 5 views
10

मैं सीएमके के साथ एंड्रॉइड पर अपने मूल सी ++ कोड के लिए GoogleTest कैसे सेटअप करूं? एंड्रॉइड एनडीके googletest के साथ आता है लेकिन निर्देश केवल Android.mk (here) के लिए उपलब्ध हैं। मैं अपने CMakeLists.txt पर Android.mk gtest सेटअप को कैसे पोर्ट करूं? और एक बार यह सेटअप हो जाने पर, एंड्रॉइड स्टूडियो की टेस्ट कॉन्फ़िगरेशन के माध्यम से टेस्ट रनर चलाने के लिए संभव है?एंड्रॉइड एनडीके सी ++ के लिए GoogleTest सीएमके

उत्तर

1

मैं केवल आपके पहले और मुख्य प्रश्न का उत्तर प्रदान कर सकता हूं, लेकिन यह एक कामकाजी समाधान है। यह एंड्रॉइड के लिए विशिष्ट नहीं है; यह तब तक काम करता है जब तक आप सीएमके और सीटीस्ट चला सकते हैं।

मुझे GoogleTest के बारे में बहुत कुछ पता नहीं है, लेकिन मुझे कुछ महीने पहले एक बहुत ही समान प्रश्न याद है। मेरे मामले में, मैं बूस्ट यूनिटटेस्टफ्रेमवर्क के साथ सीएमके का उपयोग करना चाहता था।

मैंने इसके लिए थोड़ी सी खोज की, तो मैं a certain tutorial पर गिर गया। उनके द्वारा प्रदान किया गया समाधान केवल नियमित अभिव्यक्ति का उपयोग करके आपकी परीक्षण फ़ाइलों की सामग्री को पार्स करना था। उल्टा है, यह काफी अनुकूलन योग्य है और प्रति फ़ाइल कई यूनिट परीक्षणों की अनुमति देता है। मैंने यह किया, और यह काफी अच्छी तरह से काम किया। जब आप नए यूनिट परीक्षण जोड़ते हैं तो आपको सीएमके को फिर से शुरू करना होगा।

जैसा कि मैंने कहा, मैं नीचे पोस्ट करूंगा जो बूस्ट यूनिटटेस्ट फ्रेमवर्क के लिए है, लेकिन सबसे बड़ा अंतर नियमित अभिव्यक्तियों में है, और वेरिएबल नाम जो मैं उपयोग करता हूं। यदि आप सीएमके (मैं नहीं हूं) के साथ नियमित अभिव्यक्तियों का उपयोग करने के लिए उपयोग नहीं किया जाता है, तो here स्ट्रिंग ऑपरेशंस के संबंध में एक आधिकारिक दस्तावेज़ीकरण पृष्ठ है।

यहां CMakeLists.txt फ़ाइल है जिसके साथ मैं समाप्त हुआ। मैंने इसे test/ निर्देशिका के तहत एक स्टैंडअलोन CMakeLists.txt फ़ाइल के रूप में उपयोग किया।

# ============================= 
# =  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 का कारण नहीं है :)।

+0

@ user740857 क्या यह उत्तर उपयोगी था? यदि यह था, तो इसे स्वीकार करने के लिए स्वतंत्र महसूस करें और/या बक्षीस का पुरस्कार दें। यदि नहीं, तो क्या आप संक्षेप में समझा सकते हैं कि क्यों किसी और को आपको बेहतर उत्तर देने का मौका मिला है? –

+0

आपकी अंतर्दृष्टि के लिए बहुत बहुत धन्यवाद। मुझे अभी भी यह समझ में नहीं आता है कि आपकी जानकारी से एंड्रॉइड सेटअप में कैसे जाना है। – user740857

+0

@ user740857 हाँ, यह सच है कि मैंने आपको एक विस्तृत समाधान प्रस्तुत किया। लेकिन मुझे नहीं लगता कि सीएमके कोड लिखने के बिना सीएमके को GoogleTest पोर्ट करने का कोई आसान तरीका है। –

संबंधित मुद्दे