Android 라이브러리 프로젝트를 테스트하는 방법


97

나는 유틸리티 클래스 (활동 없음) 만 포함하는 Android Bitmap 클래스 (AndroindLib라고 부름)를 기반으로 Android 라이브러리 프로젝트를 작성하고 있습니다. Android JUnit을 사용하여 테스트하려고했지만 AnroidLib.apk를 찾을 수 없다고 계속 불평합니다.

단위 테스트 Android 라이브러리 프로젝트에 올바른 방법은 무엇입니까?


1
또는 ( 뻔뻔한 플러그 알림 ) 내가 만든 프로젝트 인 Android Library Test Harness ( "Alt H"라고 부르는 것을 좋아함)를 사용할 수 있습니다. git repo로 사용할 수 있습니다 : gitorious.org/alth 이 프로젝트는 아직 개발 중이며 문서가 약간 드물기 때문에 질문이 있으면 언제든지 저에게 연락하십시오.
i41

답변:


75

문서 인용 :

"라이브러리 프로젝트의 코드 및 리소스에 대한 테스트를 설정하는 데 권장되는 두 가지 방법이 있습니다.

  • 라이브러리 프로젝트에 의존하는 애플리케이션 프로젝트를 계측하는 테스트 프로젝트를 설정할 수 있습니다. 그런 다음 라이브러리 별 기능에 대한 테스트를 프로젝트에 추가 할 수 있습니다.

  • 라이브러리에 의존하는 표준 애플리케이션 프로젝트를 설정하고 해당 프로젝트에 계측을 배치 할 수 있습니다. 이를 통해 테스트 / 계측 및 테스트 할 코드를 모두 포함하는 자체 포함 된 프로젝트를 만들 수 있습니다. "


27
따라서 기본적으로 테스트 프로젝트에 라이브러리를 추가하고 테스트 프로젝트를 테스트하기 만하면됩니다.
njzk2

링크가 더 이상 유효하지 않습니다. 현재 링크를 알려줄 수 있습니까?
Abdullah Jibaly 2011


4
다른 사람이 이러한 권장 사항으로 성공했는지 확실하지 않지만 그렇지 않습니다. 두 번째 솔루션을 먼저 시도하고 Eclipse에서 실행하려고하면 다음이 표시됩니다. <ProjectName>이 android.test.InstrumentationTestRunner 계측을 지정하지 않거나 AndroidManifest.xml에서 uses-library android.test.runner를 선언하지 않습니다. 이것은 내가 Manifest에 계측 및 사용 라이브러리 요소를 모두 추가 했음에도 불구하고 그렇습니다.
Bellinghammer

2
두 번째 (그리고 선호하는 방법)를 얻었습니다. 매니페스트의 올바른 위치에 uses-library 및 계측 요소를 가져 오는 것이 매우 중요합니다. 계측 요소는 루트 매니페스트 요소의 자식이고 uses-library 요소는 응용 프로그램 요소의 자식입니다. 사용 라이브러리를 매니페스트 요소 아래에 놓고 테스트를 실행하려고 할 때 위의 오류 메시지로 끝났습니다.
Bellinghammer

17

테스트 프로젝트에서 라이브러리의 패키지와 동일하도록 패키지 이름을 변경하면됩니다. 예를 들어, 패키지가 "com.example.lib". 라이브러리를 대상으로하는 테스트 프로젝트를 만듭니다. 매니페스트 파일에서 package="com.example.lib.test", 및 targetPackage="com.example.lib". 패키지를 "com.example.lib.test"에서 "com.example.lib"로 변경하십시오 ( targetPackage그대로 두십시오).

또한, 라이브러리가 테스트 프로젝트에 참조되어 있는지 확인 하지 Java 빌드 경로에 있지만, 일반적인 안드로이드 라이브러리로 : 이클립스에가있는 라이브러리로 표시되어야 Project->Properties->Android탭하지만, 하지Project->Properties->Java Build Path탭을 선택합니다.

그런 다음 테스트를 실행하십시오.


당신의 아이디어는 나에게 의미가 있었기 때문에 테스트가 (앱으로) 자신을 표적으로 삼았고 앱이 라이브러리와 연결되었습니다 .... 그러나 나는 그것을 ant build 또는 IntelliJ를 통해 작동시킬 수 없었습니다 .... .apk (테스트중인 앱에 대해 예상 됨)가 "test / bin /.- debug.apk"로 컴파일되고 있기 때문에 설치하려고 할 때 존재하지 않았습니다.
Andrew Mackenzie

라이브러리 프로젝트의 패키지 이름과 일치하지 않도록 매니페스트 (및 테스트중인 패키지-동일해야 함)에서 테스트 프로젝트의 패키지 이름을 변경하고 대상 테스트에 대한 참조를 제거하여 작동하도록했습니다. ant.properties 파일의 프로젝트.
Andrew Mackenzie

1
나는 이것이 허용되는 것보다 더 나은 대답이라고 생각합니다. IMHO라는 문서를 반영합니다.
Andrew Mackenzie


5

문서 :

라이브러리 모듈 테스트는 앱 테스트와 동일합니다. 가장 큰 차이점은 라이브러리와 해당 종속성이 테스트 APK의 종속성으로 자동 포함된다는 것입니다. 즉, 테스트 APK에는 자체 코드뿐만 아니라 라이브러리의 AAR 및 모든 종속성도 포함됩니다. 별도의 '테스트중인 앱'이 없기 때문에 androidTest 작업은 테스트 APK 만 설치 (및 제거)합니다. 여러 매니페스트 파일을 병합 할 때 Gradle은 기본 우선 순위를 따르고 라이브러리의 매니페스트를 테스트 APK의 기본 매니페스트에 병합합니다.


테스트를 실행할 작업은 무엇입니까? gradle 테스트 또는 gradle androidTest? androidTest는 작업이 아닙니다.
Sunnyday

하지만 Firebase Test Lab과 같은 도구에는 APK 또는 AAB가 필요하며 라이브러리의 어셈블 작업의 출력 인 AAR 파일을 허용하지 않습니다
Mustafa Berkay Mutlu

1

참고 : 이 솔루션은 Eclipse Indigo (3.8.2) 사용을 기반으로하며 기본 원칙은 동일하지만 다른 IDE에 대해 약간 다르게 구현해야 할 수 있습니다.

비슷한 문제가 있었고 다음 작업이 항상 작동한다는 것을 알았습니다.

( 참고 :이 지침은 처음부터 새 프로젝트 그룹을 빌드하기위한 것입니다. 프로젝트 그룹의 일부를 이미 빌드 한 경우 동일한 방식으로 연결되도록 프로젝트를 수정해야 할 수 있습니다. )

  1. 생성 중에 "Is Library"체크 박스를 선택하여 새 Android 라이브러리 프로젝트를 생성합니다. (예 : "RemingtonAndroidTools"라는 Android 프로젝트).
  2. Android 라이브러리 프로젝트를 빌드하고 bin 폴더에 jar 파일이 생성되었는지 확인합니다. (예 : "RemingtonAndroidTools.jar"라는 jar 파일)
  3. Android 테스트 앱으로 사용할 Android 앱을 테스트하기 위해 빈 Android 프로젝트를 만듭니다. (예 : "RemingtonAndroidToolsTestApp"이라는 Android 프로젝트). 테스트를 위해 추가해야하는 것이 없으면 Android 테스트 앱 프로젝트의 소스 코드 나 리소스를 수정할 필요가 없습니다. Android 테스트 앱 프로젝트를 수정하지 않고도 많은 것을 테스트 할 수 있습니다. Android Test App 프로젝트는 Android 라이브러리 프로젝트와 Android Junit 프로젝트를 연결하여 Android Junit을 통해 Android 라이브러리 프로젝트를 테스트 할 수 있도록합니다.
  4. Android 테스트 앱 프로젝트 (이 예에서는 "RemingtonAndroidToolsTestApp")에 대한 Java 빌드 경로의 라이브러리 탭으로 이동합니다.
  5. "Add Jars ..."버튼을 통해 Android 라이브러리 프로젝트 (이 예에서는 "RemingtonAndroidTools")의 jar 파일 (이 예에서는 "RemingtonAndroidTools.jar")을 추가합니다.
  6. Android 라이브러리 테스터 역할을 할 새 Android 테스트 프로젝트 (예 : 'RemingtonAndroidToolsTester')를 만들고 Android 테스트 앱 프로젝트 (이 예에서는 'RemingtonAndroidToolsTestApp')를 대상으로 선택합니다.
  7. Android 라이브러리 테스터 프로젝트 (이 예에서는 "RemingtonAndroidToolsTester")에 대한 Java 빌드 경로의 라이브러리 탭으로 이동합니다.
  8. "Add Jars ..."버튼을 통해 Android 라이브러리 프로젝트 (이 예에서는 "RemingtonAndroidTools")의 jar 파일 (이 예에서는 "RemingtonAndroidTools.jar")을 추가합니다.
  9. Android Library Tester 프로젝트에서 Android 패키지의 마지막 폴더 (예 : "danny.remington.remington_android_tools_test_app.test")를 찾고 ActivityInstrumentationTestCase2에서 상속되는 테스트 클래스 (예 : "MainActivityTest")를 추가합니다.
  10. Android 테스트 앱 (이 예에서는 'RemingtonAndroidToolsTestApp')의 활동 (예 : 'TestActivity')을 ActivityInstrumentationTestCase2의 매개 변수로 사용하도록 테스트 클래스 (이 예에서는 "TestActivityTest")를 편집합니다.
  11. 테스트 클래스 (이 예에서는 "TestActivityTest")를 편집하고 super (Class)를 호출하고 Android 테스트 앱의 클래스 (예 : "TestActivity.class")를 전달하는 기본 생성자를 만듭니다.

다음과 유사한 3 개의 프로젝트 (Android 라이브러리, Android 테스트 앱, Android 라이브러리 테스터)가 있어야합니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

여기에 이미지 설명 입력

다음과 유사한 Android 라이브러리를 테스트하기위한 클래스로 끝나야합니다.

package danny.remington.remington_android_tools_test_app.test;

import android.test.ActivityInstrumentationTestCase2;
import danny.remington.remington_android_tools_test_app.TestActivity;

/**
 * 
 */
public class TestActivityTest extends
      ActivityInstrumentationTestCase2<TestActivity> {

   public TestActivityTest() {
      super(TestActivity.class);
   }

}

그런 다음 원하는 테스트를 추가 할 수 있습니다. Android 특정 구성 요소 (예 : Assets 폴더)에 액세스해야하는 경우가 아니면 테스트를 실행하기 위해 Android 테스트 앱 (이 예에서는 'RemingtonAndroidToolsTestApp')을 추가로 참조 할 필요가 없습니다. Android 특정 구성 요소에 액세스해야하는 경우 Android 테스트 앱 (이 예에서는 'RemingtonAndroidToolsTestApp')을 수정 한 다음 표준 Android Junit API에서 제공하는 도구를 통해 참조하면됩니다. (여기에서 자세한 내용을 읽을 수 있습니다 : http://developer.android.com/tools/testing/testing_android.html )


0

ulitiy 클래스가 Android 특정 코드에 의존하지 않는 경우 표준 JUnit 단위 테스트를 사용할 수 있습니다. Android 버전을 사용할 필요가 없습니다.


2
표준 JUnit은 표준 JVM으로 컴파일되고 Android Java 파일은 Dalvik VM으로 컴파일되기 때문에 작동하지 않습니다.
Danny Remington-OMS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.