AndroidアプリでGoogle Testを使ってみる
AOSPの extarnal/gtest にGoogle Testが存在します。
MakeFileなどビルドに必要なファイルもAndroid用にカスタマイズされており、すぐに使用できる状態です。
今回は、このGoogle Testを使ってみようと思います。
サンプルプロジェクトをGoogle DocsにUploadしました。
ご参考に。
https://docs.google.com/open?id=0BwdCdBWuE_7cb2ZzVGt3eHhSOEtEbGVxNnRCSkFJdw
確認バージョン
Android-4.0.3_r1
Google Test用Android.mk
extarnal/gtest/test/Android.mkをもとに、アプリケーション用Android.mkを作成しました。
C++ソースとgtestを実行するソースは、
extarnal/gtestのサンプルコードを利用しました。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Gtest depends on STLPort which does not build on host/simulator. ifeq ($(BUILD_WITH_ASTL),true) libgtest_test_includes := \ bionic/libstdc++/include \ external/astl/include \ external/gtest/include \ $(LOCAL_PATH)/../test \ $(LOCAL_PATH)/.. libgtest_test_static_lib := libgtest_main libgtest libastl libgtest_test_shared_lib := libgtest_test_host_static_lib := libgtest_main_host libgtest_host libastl_host libgtest_test_host_shared_lib := else # BUILD_WITH_ASTL could be undefined, force it to false (for the guard # before the test-target call). BUILD_WITH_ASTL := false libgtest_test_includes := \ bionic \ external/stlport/stlport \ external/gtest/include \ $(LOCAL_PATH)/../test \ $(LOCAL_PATH)/.. libgtest_test_static_lib := libgtest_main libgtest libgtest_test_shared_lib := libstlport libgtest_test_host_static_lib := libgtest_test_host_shared_lib := endif LOCAL_MODULE_TAGS := TestAppGtest LOCAL_C_INCLUDES := $(libgtest_test_includes) LOCAL_SHARED_LIBRARIES := \ libcutils \ libutils \ libandroid_runtime \ $(libgtest_test_shared_lib) \ $(libgtest_test_host_shared_lib) LOCAL_STATIC_LIBRARIES := \ $(libgtest_test_static_lib) \ $(libgtest_test_host_static_lib) # if LOCAL_SRC_FILES is .cc #LOCAL_CPP_EXTENSION := .cc # YOUR Source and Test Source LOCAL_SRC_FILES := \ sample1.cpp \ sample1_unittest.cpp LOCAL_MODULE := gtest_mytest LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) include $(BUILD_EXECUTABLE)
以下のように記述することで、/data/appに実行ファイルを生成するように指定しました。
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) include $(BUILD_EXECUTABLE)
ビルド
はじめにAndroid-4.0.3_r1の環境をmakeし、その後にGoogle Testの対象となるアプリケーションのmakeを実行しました。
$ cd "YOUR_BUILD_DIRECTORY" $ . build/envsetup.sh $ lunch "YOUR_BUILD_LUNCH" $ make
Google Testを行うTestAppをpackages/apps/に展開、mmでビルド実行。
$ cd packages/apps/ $ cd TestApp $ mm -B
ビルドに成功すると、以下のようなログが出力されます。
target thumb C++: gtest_mytest <= packages/apps/TestApp/jni/test/sample1.cpp target thumb C++: gtest_mytest <= packages/apps/TestApp/jni/test/sample1_unittest.cpp target Executable: gtest_mytest (out/target/product/maguro/obj/EXECUTABLES/gtest_mytest_intermediates/LINKED/gtest_mytest) target Symbolic: gtest_mytest (out/target/product/maguro/symbols/data/app/gtest_mytest) target Strip: gtest_mytest (out/target/product/maguro/obj/EXECUTABLES/gtest_mytest_intermediates/gtest_mytest) Install: out/target/product/maguro/data/app/gtest_mytest
Google Testの実行
Android-4.0.3_r1を焼きこんだGalaxy Nexus上でGoogle Testを実行してみました。
Google Testの実行ファイル、gtest_mytestを端末にコピーします。
/data/appへコピーしました。
cd out/target/product/maguro/ $ adb push data/app/gtest_mytest /data/app 2870 KB/s (48728 bytes in 0.016s)
"adb shell"で入って、gtest_mytestを実行します。
$ adb shell root@android:/ # cd data/app root@android:/data/app # ./gtest_mytest
実行に成功すると、以下のようにテスト結果が表示されます。
root@android:/data/app # ./gtest_mytest Running main() from gtest_main.cc [==========] Running 6 tests from 2 test cases. [----------] Global test environment set-up. [----------] 3 tests from FactorialTest [ RUN ] FactorialTest.Negative [ OK ] FactorialTest.Negative [ RUN ] FactorialTest.Zero [ OK ] FactorialTest.Zero [ RUN ] FactorialTest.Positive [ OK ] FactorialTest.Positive [----------] 3 tests from IsPrimeTest [ RUN ] IsPrimeTest.Negative [ OK ] IsPrimeTest.Negative [ RUN ] IsPrimeTest.Trivial [ OK ] IsPrimeTest.Trivial [ RUN ] IsPrimeTest.Positive [ OK ] IsPrimeTest.Positive [----------] Global test environment tear-down [==========] 6 tests from 2 test cases ran. [ PASSED ] 6 tests.
アプリケーションのNativeやライブラリのUnitテストに使えそうです!