Google Test는 오픈소스이며, Native(C++)의 unit test 라이브러리입니다. Google mock으로 객체를 mocking할 수 있고, Assertion 클래스 등을 제공합니다.
Android Studio에서 NDK를 개발할 때 Google test(gtest)를 사용하여 unit test 코드를 작성할 수 있습니다.
안드로이드 스튜디오의 SDK Manager
에서 NDK, LLDB, CMAKE를 다운받으면 gtest를 사용할 수 있습니다.
(gtest는 소스를 다운받아 사용할 수 있지만 NDK에 기본적으로 소스가 있습니다.)
안드로이드 스튜디오에서 NDK 프로젝트를 만들고 gtest를 설정하는 것에 대해서 알아보겠습니다.
프로젝트 생성
메뉴에서 [New] -> [Project]
를 누르고, Native C++
를 선택합니다.
이제 NDK 프로젝트가 생성되었습니다.
gtest 설정
src/main/cpp
를 보시면 아래와 같은 구조에, 2개의 파일이 있습니다.
CMakeLists.txt
는 CMake의 빌드 설정파일입니다.
native-lib.cpp
는 Java에서 jni로 native를 호출해주는 기본 코드가 있습니다.
└── src
├── androidTest
├── main
│ ├── AndroidManifest.xml
│ ├── cpp
│ │ ├── CMakeLists.txt
│ │ └── native-lib.cpp
gtest를 사용하려면 CMakeLists.txt
에 gtest를 include하도록 설정해야 합니다.
파일의 맨 아래에 다음과 같이 입력합니다. 이 코드는 NDK에 있는 gtest를 라이브러리로 추가한다는 의미입니다.
set(GOOGLETEST_ROOT ${ANDROID_NDK}/sources/third_party/googletest/)
add_library(gtest STATIC ${GOOGLETEST_ROOT}/src/gtest_main.cc ${GOOGLETEST_ROOT}/src/gtest-all.cc)
target_include_directories(gtest PRIVATE ${GOOGLETEST_ROOT})
target_include_directories(gtest PUBLIC ${GOOGLETEST_ROOT}/include)
테스트 코드 구현
이제 테스트 코드를 구현해야 합니다.
main/cpp/
에 다음과 같이 3개의 파일을 추가할 것입니다.
├── CMakeLists.txt
├── foo.cpp
├── foo.h
├── foo_unittest.cpp
└── native-lib.cpp
아래와 같이 파일을 만들고 코드를 입력해주세요.
foo.h
extern int foo(int x, int y);
foo.cpp
int foo(int x, int y) {
return x + y;
}
foo_unittest.cpp
#include <gtest/gtest.h>
#include "foo.h"
TEST(FooTest,ZeroZero) {
EXPECT_EQ(0, foo(0, 0));
}
TEST(FooTest,OneOne) {
EXPECT_EQ(2, foo(1, 1));
}
코드를 모두 입력하였으면, foo_unittest.cpp
를 executable로 만들어야 합니다.
CMakeLists.txt
의 마지막에 다음과 같이 입력합니다.
add_library(foo SHARED foo.cpp) # 1
add_executable(foo_unittest foo_unittest.cpp) # 2
target_link_libraries(foo_unittest gtest foo) # 3
foo.cpp
로 foo 라이브러리를 만듭니다.foo_unittest.cpp
를 executable로 만듭니다.- foo_unittest에 gtest와 foo 라이브러리를 linking합니다.
빌드 및 테스트
구현은 모두 끝났습니다. 이제 빌드를 하면 다음과 같은 파일들이 생성됩니다.
./app/.externalNativeBuild/cmake/debug/x86_64/foo_unittest
./app/build/intermediates/cmake/debug/obj/x86_64/libfoo.so
파일들을 adb
로 디바이스에 넣고 실행시키면 테스트를 수행합니다.
$ adb push app/build/intermediates/cmake/debug/obj/x86_64/libfoo.so /data/local/tmp/
$ adb push app/.externalNativeBuild/cmake/debug/x86_64/foo_unittest /data/local/tmp/
$ adb shell chmod 775 /data/local/tmp/foo_unittest
$ adb shell \"LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/foo_unittest\"
테스트가 완료되면 다음과 같은 결과를 터미널에 출력합니다.
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from FooTest
[ RUN ] FooTest.ZeroZero
[ OK ] FooTest.ZeroZero (0 ms)
[ RUN ] FooTest.OneOne
[ OK ] FooTest.OneOne (0 ms)
[----------] 2 tests from FooTest (0 ms total)
[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (0 ms total)
[ PASSED ] 2 tests.
이 글에서 사용한 예제는 GitHub - GoogleTestWithNDK에서 확인할 수 있습니다.
참고
Related Posts
- Android 14 - 사진/동영상 파일, 일부 접근 권한 소개
- Android - adb push, pull로 파일 복사, 다운로드
- Android 14 - 암시적 인텐트 변경사항 및 문제 해결
- Jetpack Compose - Row와 Column
- Android 13, AOSP 오픈소스 다운로드 및 빌드
- Android 13 - 세분화된 미디어 파일 권한
- Android 13에서 Notification 권한 요청, 알림 띄우기
- Android 13에서 'Access blocked: ComponentInfo' 에러 해결
- 에러 해결: android gradle plugin requires java 11 to run. you are currently using java 1.8.
- 안드로이드 - 코루틴과 Retrofit으로 비동기 통신 예제
- 안드로이드 - 코루틴으로 URL 이미지 불러오기
- Android - 진동, Vibrator, VibrationEffect 예제
- Some problems were found with the configuration of task 에러 수정
- Query method parameters should either be a type that can be converted into a database column or a List
- 우분투에서 Android 12 오픈소스 다운로드 및 빌드
- Android - ViewModel을 생성하는 방법
- Android - Transformations.map(), switchMap() 차이점
- Android - Transformations.distinctUntilChanged() 소개
- Android - TabLayout 구현 방법 (+ ViewPager2)
- Android - 휴대폰 전화번호 가져오는 방법
- Android 12 - Splash Screens 알아보기
- Android 12 - Incremental Install (Play as you Download) 소개
- Android - adb 명령어로 bugreport 로그 파일 추출
- Android - adb 명령어로 App 데이터 삭제
- Android - adb 명령어로 앱 비활성화, 활성화
- Android - adb 명령어로 특정 패키지의 PID 찾기
- Android - adb 명령어로 퍼미션 Grant 또는 Revoke
- Android - adb 명령어로 apk 설치, 삭제
- Android - adb 명령어로 특정 패키지의 프로세스 종료
- Android - adb 명령어로 screen capture 저장
- Android - adb 명령어로 System 앱 삭제, 설치
- Android - adb 명령어로 settings value 확인, 변경
- Android 12 - IntentFilter의 exported 명시적 선언
- Android - adb 명령어로 공장초기화(Factory reset)
- Android - adb logcat 명령어로 로그 출력