{"id":1489,"date":"2016-07-01T22:51:55","date_gmt":"2016-07-01T13:51:55","guid":{"rendered":"http:\/\/43.203.250.216\/?p=1489"},"modified":"2025-10-01T16:25:01","modified_gmt":"2025-10-01T07:25:01","slug":"android-studio%ec%97%90%ec%84%9c-googletest-%ec%82%ac%ec%9a%a9%ec%9d%84-%ec%9c%84%ed%95%9c-%ec%84%a4%ec%a0%95","status":"publish","type":"post","link":"https:\/\/litcoder.com\/?p=1489","title":{"rendered":"Android Studio\uc5d0\uc11c Googletest \uc0ac\uc6a9\uc744 \uc704\ud55c \uc124\uc815"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Android Studio\ub294 \ub0b4 PC\uc5d0\uc11c \uc880 \ub290\ub9ac\uae34 \ud558\uc9c0\ub9cc, \ub2e4\ub978 IDE\ub4e4\uc5d0 \ube44\ud574\uc11c\ub294 Emacs key binding\uc774 \ube44\uad50\uc801 \uc798\ub418\uc5b4 \uc788\uc5b4\uc11c \ub9cc\uc871 \ud558\uba74\uc11c \uc870\uae08\uc529 \ubc30\uc6cc\uac00\uace0 \uc788\ub2e4. NDK\ub85c JNI\uc5d0\uc11c \ubd88\ub7ec\ub2e4 \uc4f8 native code\ub97c \uad6c\ud604\ud558\ub2e4 \ubcf4\ub2c8 Googletest\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud574 \ub9e4\ubc88 device\ub85c push \ud558\uace0 \uc2e4\ud589\ud558\ub294 \uacfc\uc815\uc774 \uaf64\ub098 \ubc88\uac70\ub85c\uc640\uc11c script\ub85c \ub9cc\ub4e4\uc5b4 \ubcf4\uc558\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 Android Studio\uc5d0\uc11c Googletest\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud55c \uae30\ubcf8\uc801\uc778 \uc124\uc815\uacfc device\uc5d0 push\ud558\ub294 \uacfc\uc815\uc744 \ud3b8\ud558\uac8c \ud574\uc8fc\ub294 script\uc5d0 \ub300\ud574 \uc124\uba85\ud55c\ub2e4.<\/p><\/blockquote>\n\n\n\n<h1 class=\"wp-block-heading\">\ud658\uacbd<\/h1>\n\n\n\n<p>Bash script\ub97c \uc0ac\uc6a9\ud560 \uac83\uc774\ubbc0\ub85c Linux \ud658\uacbd\uc774\ub098&nbsp;<a href=\"http:\/\/www.cygwin.com\/\">Cygwin<\/a>\uc774 \uc124\uce58\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4. \uc0ac\uc2e4 \uc5ec\uae30\uc758 \ub0b4\uc6a9\uc740 Windows + Cygwin\uc5d0\uc11c \uc2dc\ud5d8\ub418\uc5c8\uc73c\ub098 Bash\uac00 \ub3d9\uc791\ud558\ub294 \ud658\uacbd\uc774\ub77c\uba74 \ud2b9\ubcc4\ud788 \ubb38\uc81c\ub294 \uc5c6\uc744 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Googletest<\/h1>\n\n\n\n<p>Google\uc758 C++ testing framework\uc778 Googletest\ub294 <a href=\"https:\/\/github.com\/google\/googletest\">Googletest GitHub<\/a>\uc5d0\uc11c\ub3c4 \ubc1b\uc544\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc73c\ub098, NDK package\uc548\uc5d0\ub3c4 \ub4e4\uc5b4 \uc788\ub2e4. \uc5ec\uae30\uc11c\ub294 NDK\uc548\uc758 \ub2e4\uc74c \uacbd\ub85c\uc5d0 \uc788\ub294 Googletest\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \ud55c\ub2e4. Native test case\ub4e4\uc744 \uc791\uc131\ud560 \uacf5\uac04\uc744 app\/src\/main\/jni \uc544\ub798\uc5d0 &#8216;tests&#8217;\ub77c\ub294 \uc774\ub984\uc73c\ub85c \ub9cc\ub4e4\uace0 \uc774\uacf3\uc73c\ub85c gogoletest\ub97c \ubcf5\uc0ac\ud574 \uc628\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$>mkdir .\/app\/src\/main\/jni\/tests\n$>cp -r $ANDROID_NDK_PATH\/sources\/third_party\/googletest .\/app\/src\/main\/jni\/tests\/<\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Android.mk<\/h1>\n\n\n\n<p>\uae30\uc874\uc5d0 \uc0ac\uc6a9\ud558\ub358 native\uc6a9 Android.mk file\uc5d0 Googletest\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud55c \ucd94\uac00 \uc218\uc815\uc744 \ud574\uc900\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\" data-enlighter-theme=\"eclipse\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"true\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#\n# 1. \uc2dc\ud5d8\ud560 \uae30\ub2a5\uc744 \ud3ec\ud568\ud558\ub294 \ub77c\uc774\ube0c\ub7ec\ub9ac\n#\nLOCAL_PATH := $(call my-dir)\ninclude $(CLEAR_VARS)\n\nLOCAL_MODULE := \ub77c\uc774\ube0c\ub7ec\ub9ac_\uc774\ub984\nLOCAL_SRC_FILES := \uc18c\uc2a4\ud30c\uc77c\ub4e4\n\ninclude $(BUILD_SHARED_LIBRARY)\n\n\n#\n# 2. Googletest static library\n#\n# Google test static library\ninclude $(CLEAR_VARS)\nGTEST_PATH := tests\/googletest\n\nLOCAL_MODULE := googletest_main\nLOCAL_CFLAGS := -Ijni\/tests\/googletest\/include -Ijni\/tests\/googletest\/\n\nLOCAL_SRC_FILES := \\\n    $(GTEST_PATH)\/src\/gtest-all.cc\n\ninclude $(BUILD_STATIC_LIBRARY)\n\n\n#\n# 3. \uc791\uc131\ub41c test case \uc2e4\ud589\ud30c\uc77c\n#\ninclude $(CLEAR_VARS)\n\nLOCAL_MODULE := testcases\nLOCAL_CFLAGS := -Ijni\/tests\/googletest\/include -Ijni\n\nLOCAL_SRC_FILES := \\\n    tests\/Test_Main.cpp \\\n    tests\/\ud14c\uc2a4\ud2b8\ucf00\uc774\uc2a4_\uc18c\uc2a4\ud30c\uc77c\ub4e4\n\nLOCAL_SHARED_LIBRARIES := \ub77c\uc774\ube0c\ub7ec\ub9ac_\uc774\ub984\nLOCAL_STATIC_LIBRARIES := googletest_main\ninclude $(BUILD_EXECUTABLE)\n<\/pre>\n\n\n\n<p>\uc704\uc5d0\uc11c \uccab \ubc88\uc9f8 \ud56d\ubaa9 <em>&#8220;\ub77c\uc774\ube0c\ub7ec\ub9ac_\uc774\ub984<\/em>&#8220;\uc740 \uc2dc\ud5d8 \ub300\uc0c1\uc774 \ub418\ub294 code\ub97c \ud3ec\ud568\ud558\ub294 shared library file\uc774\uace0 \ub450 \ubc88\uc9f8 \ud56d\ubaa9\uc740 Googletest\uc758 \uae30\ub2a5\uc744 static library\ub85c \ucef4\ud30c\uc77c \ud558\ub294 \uacfc\uc815\uc774\ub2e4. \uc0ac\uc2e4 googletest \ub514\ub809\ud1a0\ub9ac \uc548\uc5d0\ub294 \uc774\uac83 \uc678\uc5d0\ub3c4 \ub9ce\uc740 \uc18c\uc2a4\ud30c\uc77c\ub4e4\uc774 \ub4e4\uc5b4 \uc788\ub294\ub370, \uc2dc\ud5d8\ud574 \ubcf8 \ubc14\ub85c\ub294 gtest-all.cc\ub9cc\uc73c\ub85c\ub3c4 \ub3d9\uc791\uc5d0 \ubb38\uc81c\uac00 \uc5c6\ub294\uac83 \uac19\ub2e4.<\/p>\n\n\n\n<p>\uc774\uc81c \ub9c8\uc9c0\ub9c9\uc73c\ub85c \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4\ub4e4\uacfc \uc774 \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4\ub4e4\uc744 \ud638\ucd9c\ud558\ub294 Test_Main.cpp\ub97c \uc791\uc131\ud558\uace0, \uc774 \ub54c \ud544\uc694\ud55c &#8220;\ub77c\uc774\ube0c\ub7ec\ub9ac_\uc774\ub984&#8221;\uacfc googletest_mian static \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ub9c1\ud06c\uc2dc\ucf1c\uc900\ub2e4.<\/p>\n\n\n\n<p>Test_Main.cpp\ub294 \uc608\uc81c\uc5d0 \uc788\ub294\uac83\uc744 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud588\ub294\ub370 \ub0b4\uc6a9\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"eclipse\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"true\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;stdio.h>\n\n#include \"gtest\/gtest.h\"\n\nGTEST_API_ int main(int argc, char **argv) {\n  printf(\"Running main() from gtest_main.cc\\n\");\n  testing::InitGoogleTest(&amp;argc, argv);\n  return RUN_ALL_TESTS();\n}\n<\/pre>\n\n\n\n<p>Gooletest\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4\ub97c \uc791\uc131\ud558\ub294 \ubc29\ubc95\ub4e4\uc740 \uc5ec\ub7ec \uacf3\uc5d0\uc11c \ucc3e\uc744 \uc218 \uc788\uc73c\ubbc0\ub85c \uc5ec\uae30\uc5d0\uc11c\ub294 \uc124\uba85\ud558\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">runtest.sh<\/h1>\n\n\n\n<p>\uc774\uc81c \ube4c\ub4dc\ub97c \uc218\ud589\ud558\uba74 \ub3d9\uc801 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc778 <strong><em>lib\ub77c\uc774\ube0c\ub7ec\ub9ac_\uc774\ub984.so<\/em><\/strong>\uc640 <strong><em>testcases\u00a0<\/em><\/strong>\ud30c\uc77c\uc774 \ub9cc\ub4e4\uc5b4\uc9c4\ub2e4. \uc774\uac83\uc744 \uc2dc\ud5d8\ud558\ub824\uba74 \ub514\ubc14\uc774\uc2a4\uc5d0 push\ud55c \ub2e4\uc74c library \uacbd\ub85c\ub97c \uc124\uc815\ud574\uc8fc\uace0 \uc2e4\ud589\uc2dc\ucf1c\uc11c \uacb0\uacfc\ub97c \ubd10\uc57c \ud558\ub294\ub370, \ub9e4\ubc88 \uc2dc\ud5d8\ud560 \ub54c\ub9c8\ub2e4 \uc774 \uacfc\uc815\uc744 \ubc18\ubcf5\ud558\uae30\ub294 \ub9e4\uc6b0 \uadc0\ucc2e\ub2e4. \uc5ec\ub7ec\uac1c\uc758 so file\ub85c \ub098\ub220\uc11c \uc791\uc131\ud55c \uacbd\uc6b0\ub77c\uba74 \ub354\uc6b1 \uadf8\ub807\ub2e4.<\/p>\n\n\n\n<p>\uadf8\ub798\uc11c \uc774 \uadc0\ucc2e\uc740 \uacfc\uc815\uc744 bash\ub85c \uc791\uc131\ud574 \ub450\uace0 Android Studio\uc758 External Tools \uae30\ub2a5\uc744 \uc774\uc6a9\ud574\uc11c \ubd80\ub97c \uc218 \uc788\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4. (\ub2e8\ucd95\ud0a4 \uae4c\uc9c0 \ub2ec\uc544 \ub450\uba74 \ud6e8\uc52c \ud3b8\ud558\uaca0\uc9c0?)<\/p>\n\n\n\n<p>\uc6b0\uc120, \uadc0\ucc2e\uc740 \uc77c\uc744 \ud574\uc8fc\ub294 bash script\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. \uc2e4\ud589\ud30c\uc77c \uc774\ub984\uacfc \ud568\uaed8 \uc0ac\uc6a9\ud560 \ub77c\uc774\ube0c\ub7ec\ub9ac \ud30c\uc77c\uc758 \ubaa9\ub85d\uc744 \uc778\uc790\ub85c \ubc1b\uc544\uc11c \ub514\ubc14\uc774\uc2a4\uc5d0 push\ud558\uace0 \ub77c\uc774\ube0c\ub7ec\ub9ac path\ub97c \uc7a1\uc544\uc11c \uc2e4\ud589\uc2dc\ud0a8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"eclipse\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"true\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#!\/bin\/bash\n#\n# This script pushes specified gtest related files into devices'\n# \/cache\/xxx directory and runs it.\n#\n\nif [ \"$#\" -eq 0 ]; then\n    echo \"USAGE: ${0} exe_to_push [libs_to_push...]\"\n    exit 1\nfi\n\nexe=$1\nexedir=$exe\nlibs=$@\n\n# A directory at the device where binaries to be pushed.\nremote_dest_dir=\/cache\/${exedir}\n\n# A directory at local where binaries exist.\nlocal_src_dir=app\/src\/main\/libs\/armeabi-v7a\n\nadb wait-for-device\nadb shell rm -rf ${remote_dest_dir}\nadb shell mkdir ${remote_dest_dir}\n\n# Push libraries.\nfor lib in ${libs}\ndo\n    adb push ${local_src_dir}\/${lib} ${remote_dest_dir}\ndone\n\n# Push the executable then run.\nadb push ${local_src_dir}\/${exe} ${remote_dest_dir}\nadb shell chmod 755 ${remote_dest_dir}\/${exe}\nadb shell \"LD_LIBRARY_PATH=${remote_dest_dir} ${remote_dest_dir}\/${exe}\"<\/pre>\n\n\n\n<p>\uc774\uc81c Android Studio\uc758 <em>File -&gt; Settings -&gt; Tools -&gt; External Tools<\/em> \uba54\ub274\uc5d0 runtest.sh\ub97c \ub4f1\ub85d\ud558\uc790.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"849\" height=\"495\" src=\"https:\/\/litcoder.com\/wp-content\/uploads\/2016\/07\/androidstudio_edittool.png\" alt=\"androidstudio_edittool\" class=\"wp-image-1497\" srcset=\"https:\/\/litcoder.com\/wp-content\/uploads\/2016\/07\/androidstudio_edittool.png 849w, https:\/\/litcoder.com\/wp-content\/uploads\/2016\/07\/androidstudio_edittool-300x175.png 300w, https:\/\/litcoder.com\/wp-content\/uploads\/2016\/07\/androidstudio_edittool-768x448.png 768w\" sizes=\"auto, (max-width: 849px) 100vw, 849px\" \/><\/figure>\n\n\n\n<p>Program\uc740 script\ub97c \uc218\ud589 \uc2dc\ucf1c\uc904 bash.exe\uc758 \uc704\uce58\ub97c \uc9c0\uc815\ud574\uc8fc\uace0, Parameters\ub85c \uc2e4\ud589\ud560 script\uc778 runtest.sh\uc640 \u00a0\uc2e4\ud589\ud30c\uc77c\uc778 testcases \uadf8\ub9ac\uace0 \uad00\ub828\ub41c \ub77c\uc774\ube0c\ub7ec\ub9ac \ubaa9\ub85d\uc744 \uc801\uc5b4\uc900\ub2e4. \uc5ec\uae30\uc11c\ub294 lib\ub77c\uc774\ube0c\ub7ec_\uc774\ub984.so\uc5d0\ub9cc \uc758\uc874\ud55c\ub2e4\uace0 \uac00\uc815\ud588\ub2e4.<\/p>\n\n\n\n<p>\uadf8\ub9ac\uace0 \ub9c8\uc9c0\ub9c9\uc73c\ub85c Working directory\ub294 project\uc758 \ucd5c\uc0c1\uc704 \ub514\ub809\ud1a0\ub9ac\ub97c \uc758\ubbf8\ud558\ub294 $ProjectFileDir$\uc744 \uc801\uc5b4 \uc900\ub2e4.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\uc218\ud589\uacb0\uacfc<\/h1>\n\n\n\n<p>\uc9c0\uc815\ud55c \ub2e8\ucd95\ud0a4 \ud639\uc740 \uc704\uc758 \uc124\uc815\ub300\ub85c \ub77c\uba74 <em>Tools -&gt; Android -&gt; Run native test<\/em>\ub97c \uc2e4\ud589\uc2dc\ud0a4\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 test case\ub4e4\uc774 \uc2e4\ud589\ub418\uace0 \uacb0\uacfc\uac00 \ucd9c\ub825\ub41c\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"770\" height=\"404\" src=\"https:\/\/litcoder.com\/wp-content\/uploads\/2016\/06\/androidstudio_runtest_result.png\" alt=\"androidstudio_runtest_result\" class=\"wp-image-1491\" srcset=\"https:\/\/litcoder.com\/wp-content\/uploads\/2016\/06\/androidstudio_runtest_result.png 770w, https:\/\/litcoder.com\/wp-content\/uploads\/2016\/06\/androidstudio_runtest_result-300x157.png 300w, https:\/\/litcoder.com\/wp-content\/uploads\/2016\/06\/androidstudio_runtest_result-768x403.png 768w\" sizes=\"auto, (max-width: 770px) 100vw, 770px\" \/><\/figure>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Android Studio\ub294 \ub0b4 PC\uc5d0\uc11c \uc880 \ub290\ub9ac\uae34 \ud558\uc9c0\ub9cc, \ub2e4\ub978 IDE\ub4e4\uc5d0 \ube44\ud574\uc11c\ub294 Emacs key binding\uc774 \ube44\uad50\uc801 \uc798\ub418\uc5b4 \uc788\uc5b4\uc11c \ub9cc\uc871 \ud558\uba74\uc11c \uc870\uae08\uc529 \ubc30\uc6cc\uac00\uace0 \uc788\ub2e4. NDK\ub85c JNI\uc5d0\uc11c \ubd88\ub7ec\ub2e4 \uc4f8 native code\ub97c \uad6c\ud604\ud558\ub2e4 \ubcf4\ub2c8 Googletest\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud574 \ub9e4\ubc88 device\ub85c push \ud558\uace0 \uc2e4\ud589\ud558\ub294 \uacfc\uc815\uc774 \uaf64\ub098 \ubc88\uac70\ub85c\uc640\uc11c script\ub85c \ub9cc\ub4e4\uc5b4 \ubcf4\uc558\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 Android Studio\uc5d0\uc11c Googletest\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud55c \uae30\ubcf8\uc801\uc778 \uc124\uc815\uacfc device\uc5d0 push\ud558\ub294 \uacfc\uc815\uc744 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[2],"tags":[12,59,61,88],"class_list":["post-1489","post","type-post","status-publish","format-standard","hentry","category-android","tag-androidstudio","tag-googletest","tag-gtest","tag-ndk"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/1489","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1489"}],"version-history":[{"count":7,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/1489\/revisions"}],"predecessor-version":[{"id":3625,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/1489\/revisions\/3625"}],"wp:attachment":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1489"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1489"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1489"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}