Android Studio에서 테스트를 생성하려면 어떻게해야합니까?


109

Intellij Idea를 기반으로 한 Android Studio를 방금 다운로드했습니다.

어떻게 테스트를 만들까요?

테스트 모듈을 만드는 옵션이 있지만 이것은 아무것도하지 않는 것 같으며 src로 새 프로젝트를 만듭니다.

또한 기존 클래스에 대한 단위 테스트를 만들 수있는 단축키 CTRL + AlT + T를 눌러 보았지만 현재 프로젝트에 배치하려는 것 같습니다. 물론 이것은 TDD에 도움이되지 않습니다

누구든지 여기에 경험이 있습니까?


2
나는 또한 테스트 프로젝트를 만들려고 노력했다. Eclipse 프로젝트에서와 같이 Android 명령 줄 도구로 수행하면 AndroidManifest.xml 파일을 찾을 수 없기 때문에 오류가 발생합니다. Google이 Grundle 프로젝트를 처리하기 위해 Android 도구를 업데이트해야하는 것 같습니다. 그러나 저는 Android 테스트를 처음 사용하므로 도와 드릴 수 없습니다 = (
Kage

답변:


56

이 답변은 Android 테스트를 막 시작하는 사람들을위한 것입니다. 테스트가 어떻게 작동하는지 확인하는 데 도움이되는 두 가지 간단한 예를 제공하겠습니다. 다음 10 분 동안 계속 진행하면 자신의 앱에 테스트를 추가 할 준비가 된 것입니다. 얼마나 쉬운 지 놀랄 것입니다. 나는 확실히했다.

Android 테스트 소개

수행 할 테스트에는 두 가지 유형이 있습니다.

  • 로컬 단위 테스트. 이는 JVM (Java Virtual Machine)에서 로컬로 실행됩니다. 그들은 현지이기 때문에 빠릅니다. 이를 사용하여 Android API가 아닌 Java 만 필요한 코드 부분을 테스트 할 수 있습니다. (때때로 로컬에서 더 많은 것을 테스트하기 위해 가짜 API 객체를 만들 수 있습니다. 이것을 mocking 이라고합니다 . mock Context이 예시입니다.)
  • 계측 테스트. 이러한 테스트는 실제 기기 또는 에뮬레이터에서 실행됩니다. 그것은 로컬 테스트보다 느리게 만듭니다. 그러나 전체 Android API를 사용할 수 있기 때문에 더 유연합니다.

새 프로젝트를 생성하면 다음과 같은 기본 폴더가 표시됩니다.

여기에 이미지 설명 입력

모든 것이 이미 거기에 있으며 테스트를 만들기를 기다리고 있습니다. 이미 모든 설정이 완료되었습니다!

로컬 단위 테스트를 만드는 방법

ExampleUnitTest위 이미지에 표시된 파일을 엽니 다 . 다음과 같이 보일 것입니다.

public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

모든 테스트를 실행하려면 이중 녹색 화살표를 누르고 하나만 실행하려면 단일 녹색 화살표를 누릅니다. (이 경우 하나의 테스트 만 있으므로 둘 다 동일한 작업을 수행합니다.)

여기에 이미지 설명 입력

통과해야합니다 ( 이 답변을 읽을 때 2 + 2여전히있는 한 4). 축하합니다. 첫 번째 테스트를 실행했습니다!

나만의 테스트 만들기

우리 자신의 테스트를 작성합시다. 먼저 테스트 할 내용이 있도록이 클래스를 기본 앱 프로젝트에 추가합니다.

public class MyClass {
    public int add(int a, int b) {
        return a + b;
    }
}

이제 addition_isCorrect()테스트 클래스 의 메서드를 다음 코드와 같이 변경 하거나 다른 이름을 가진 다른 메서드를 추가합니다.

public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        MyClass myClass = new MyClass();
        int result = myClass.add(2, 2);
        int expected = 4;
        assertEquals(expected, result);
    }
}

다시 실행하면 통과하는 것을 볼 수 있습니다. 축하합니다. 첫 번째 테스트를 만들었습니다! (글쎄요, 기술적으로는 제 것이었지만, 충분히 가까워요. 제 것은 당신 것입니다.)

계측 테스트를 만드는 방법

ExampleInstrumentedTest파일을 엽니 다 . 다음과 같이 보일 것입니다.

@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.example.myapp", appContext.getPackageName());
    }
}

녹색 버튼 중 하나를 다시 누르십시오.

여기에 이미지 설명 입력

실제 장치가 연결되어 있거나 에뮬레이터가 설정되어있는 한, 장치를 시작하고 앱을 실행해야합니다. 축하합니다. 첫 번째 계측 테스트를 실행했습니다!

나만의 테스트 만들기

계측 테스트는 Espresso 를 사용 하여 테스트를 실행합니다. 앱을 테스트 할 수있는 작은 로봇 사용자와 비슷합니다. 버튼을 누르거나 TextView의 속성을 읽는 것과 같은 작업을 수행하도록 지시 할 수 있습니다.

직접 테스트하는 방법에 대한 지침을 작성할 수 있지만 이제 막 시작 했으므로 자동 기록 기능을 사용하겠습니다 . 아주 간단합니다.

먼저 UI에 버튼을 추가하여 작업 할 수 있도록합니다. 나는 이걸했다:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.myapp.MainActivity">

    <Button
        android:id="@+id/myButton"
        android:text="Click me"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</android.support.constraint.ConstraintLayout> 

그런 다음 메뉴에서 Run> Record Espresso Test 를 누릅니다.

여기에 이미지 설명 입력

시작 후 에뮬레이터에서 버튼을 클릭 한 다음 완료하려면 Record 대화 상자에서 OK를 선택합니다. 다음 테스트 코드가 자동으로 생성됩니다.

@LargeTest
@RunWith(AndroidJUnit4.class)
public class MainActivityTest {

    @Rule
    public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);

    @Test
    public void mainActivityTest() {
        ViewInteraction appCompatButton = onView(
                allOf(withId(R.id.myButton), withText("Click me"), isDisplayed()));
        appCompatButton.perform(click());
    }
}

큰! 방금 첫 번째 계측 테스트를 만들었습니다! 매우 쉬웠습니다. 실제 테스트로 만들려면 어설 션을 추가해야 할 것입니다.하지만 그것은 레코더로도 쉽게 할 수 있습니다. 시계 동영상을 좀 더 깊이 이동합니다.

추가 연구

먼저 비디오를 본 다음 설명서를 읽었습니다. 모두 매우 도움이됩니다. 마지막 링크는 테스트 할 항목을 선택할 때 고려해야 할 몇 가지 중요한 사항을 다루는 기사 시리즈입니다.


1
@Suragch에 대한 훌륭한 대답. 빠른 질문 : 로컬 단위 테스트 케이스에 대한 지원 파일을 어디에 두어야합니까? 해키이지만 테스트 기반에서 전체 경로를 입력하면 좋겠지 만 Android Studio에서 실행하면 테스트가 root_ /app에서 실행되지만 Gradle 명령 줄 (또는 CI)에서 실행하면 다음과 같습니다. _root . (이상적으로는 assets어느 쪽이든 실행할 때 특정 폴더 에 액세스하고 싶습니다 ).
mm2001

@ mm2001, 나는 스스로 테스트하는 방법을 배우는 방법 으로이 답변을 썼으므로 당신이 가지고있는 한까지 얻지 못했습니다. 내가하기 전에 이것을 알아 내면 코멘트를 남길 수 있습니까?
Suragch

:이 유용하다고 stackoverflow.com/a/42751502/19506를 - 그것은 폴더를 만들라고 test/resources하고 거기에 파일을 넣어, 예를 들면 test.txt및하여 액세스를 getClass().getClassLoader().getResource("test.txt"). APK 자산에 직접 액세스하는 것은 좋지 않은 생각 일 가능성이 있으므로 빌드 단계에서 테스트 할 파일을 복사하거나 외부 업데이트 프로세스에서이를 처리 할 것입니다. 다른 버전의 Gradle에 대해 몇 가지 질문이 남아 있지만 아직 직면하지 않았습니다.
mm2001

36

편집 : 0.1.8부터 이것은 IDE에서 지원됩니다 . 아래 지침을 사용하는 대신 거기에있는 지침을 따르십시오.

다음 가이드 안드로이드 Gradle을 플러그인 사용자 내가 새로 생성 된 프로젝트에서 다음 단계를 수행하여 명령 줄에서 작업 테스트를 얻을 수 있었다 (I은 기본 'com.example.myapplication'패키지를 사용) :

  1. 테스트를 위해 src / instrumentTest / java 디렉토리를 추가하십시오.
  2. com.example.myapplication.test 패키지에 테스트 클래스 (ActivityTestCase 확장)를 추가하십시오.
  3. 가상 장치 시작
  4. 명령 줄 (MyApplicationProject / MyApplication 디렉터리)에서 '../gradlew connectedInstrumentTest'명령을 사용합니다.

이것은 내 테스트를 실행하고 테스트 결과를 MyApplicationProject / MyApplication / build / reports / instrumentTests / connected에 배치했습니다. 저는 Android 앱을 처음 테스트했지만 제대로 작동하는 것 같습니다.

IDE 내에서 동일한 테스트 클래스를 시도하고 실행할 수 있습니다. 당신은 필요합니다

  1. 빌드 .gradle을 업데이트하여 Maven Central을 저장소로 나열
  2. build.gradle 업데이트는 instrumentTestCompile 종속성으로 JUnit 3.8을 추가합니다 (예 : instrumentTestCompile 'junit : junit : 3.8').
  3. '프로젝트 구조'에서 수동으로 JUnit을 종속성 순서의 첫 번째로 이동하십시오.

그러나 이것은 실패합니다 (테스트를 실행할 때 사용 된 클래스 경로에 테스트 출력 디렉토리가 없음). 그러나 Android 특정 테스트 러너가 필요하다는 것을 이해하고 있기 때문에 이것이 작동하는지 확실하지 않습니다.


20

gradle.build 파일 을 사용하는 것이 좋습니다 .

  1. 테스트를 위해 src / androidTest / java 디렉터리를 추가합니다 ( Chris 가 설명을 시작하는 것처럼 )

  2. gradle.build 파일을 열고 거기에 지정하십시오.

    android {
    
        compileSdkVersion rootProject.compileSdkVersion
        buildToolsVersion rootProject.buildToolsVersion
    
        sourceSets {
    
            androidTest {
                java.srcDirs = ['androidTest/java']
            }
        }
    }
  3. "Sync Project with Gradle file"(상단 패널)을 누릅니다. 이제 "java"폴더 ( "androidTest"내부)가 녹색으로 표시됩니다.

  4. 이제 모든 테스트 파일을 생성하고 실행할 수 있습니다.


androidTest.setRoot ( 'instrumentTest')를 잊지 마세요
IgorGanapolsky

3
이름이 모든 것을 대체 - 현재 안드로이드 스튜디오 버전은 더 이상 필요하지 않습니다 instrumentTestandroidTest을
YURIY Chernyshov

'instrumentTest'와 'androidTest'라는 이름은 완전히 임의적입니다. 테스트 프로젝트의 디렉토리 이름 일뿐입니다. 'tests'디렉토리를 만들 수도 있습니다. 또한 테스트 프레임 워크에서 SDK의 패키지 이름은 android.test.InstrumentationTestCase입니다. 그래서 정식으로 나는 '도구'또는 '도구'가 테스트 이름을 지정하는 데 여전히 의미가 있다고 믿습니다. 다음 소스 코드를 참조하십시오. grepcode.com/file/repository.grepcode.com/java/ext/…
IgorGanapolsky 2014

7
여기에서 문서를 읽으십시오 : tools.android.com/tech-docs/new-build-system . 0.9.0 버전부터 instrumentTestandroidTest 로 이름이 변경 되었습니다 .
Yuriy Chernyshov 2014

1
@IgorGanapolsky 이름 지정 폴더는 androidTest 로 임의적 이지 않습니다. 폴더가 녹색으로 바뀌려면이 작업을 수행해야합니다.
clocksmith


10

Android Studio v.2.3.3

테스트 할 코드 컨텍스트를 강조 표시하고 핫키를 사용하십시오. CTRL+ SHIFT+T

대화 인터페이스를 사용하여 설정을 완료하십시오.

테스트 프레임 워크는 최상의 결과를 위해 프로젝트 패키지 레이아웃을 미러링해야하지만 올바른 디렉터리 및 빌드 설정이있는 경우 사용자 지정 테스트를 수동으로 만들 수 있습니다.


7

지금은 (스튜디오 0.61) 적절한 프로젝트 구조를 유지하는 것으로 충분합니다. Eclipse에서와 같이 별도의 테스트 프로젝트를 만들 필요가 없습니다 (아래 참조).

테스트 구조


4

Android Studio는 계속 발전하므로 위의 응답은 결국 더 이상 적용되지 않습니다. 현재 Android Studio 1.2.1.1 버전의 경우 테스트에 대한 멋진 자습서가 있습니다.

http://evgenii.com/blog/testing-activity-in-android-studio-tutorial-part-1/


2
예, AS는 계속 발전하고 있으므로 누군가가 최첨단 기술에 대한 기사를 작성하고 적용되는 버전 번호를 언급하지 않는 것은 다소 어리석은 일입니다. 유일한 단서는 맨 아래에있는 날짜입니다.

3

주요 변경 사항 중 하나는 Android Studio에서 테스트 애플리케이션이 애플리케이션 프로젝트에 통합된다는 것입니다.

이것이 특정 문제에 도움이되는지 확실하지 않지만 Gradle 프로젝트로 테스트를 만드는 방법에 대한 가이드를 찾았습니다. Android Gradle 사용자 가이드


3

내가 찾은 가장 쉬운 방법은 다음 블로그 게시물 에서 간소화 된 것입니다 .

  1. 모든 단위 테스트를 작성할 폴더를 만듭니다 (바람직하게는 com.example.app.tests).
  2. 새 테스트 클래스를 만듭니다 (가급적 NameOfClassTestedTests, 즉 BankAccountLoginActivityTests).
  3. InstrumentationTestCase 확장
  4. 실패한 단위 테스트를 작성하여 단위 테스트 구성에 성공했는지 확인합니다.
  5. 단위 테스트 메서드 이름은 "test"라는 단어로 시작해야합니다 (가급적 testTestedMethodNameExpectedResult (), 즉 testBankAccountValidationFailedShouldLogout ()).
  6. 단위 테스트를 위해 프로젝트를 구성합니다.
  7. '실행 ...'메뉴를 열고 '구성 편집'을 클릭하십시오.
  8. + 버튼을 클릭
  9. Android 테스트 템플릿 선택
  10. 실행 구성의 이름을 입력하십시오 (가급적 'AppName 테스트').
  11. 모듈 콤보 상자에서 앱을 선택하십시오.
  12. "All In Package"라디오 버튼을 선택합니다 (일반적으로 모든 테스트 클래스에서 모든 단위 테스트를 실행하기 때문에이 옵션을 선택합니다).
  13. 1 단계의 테스트 패키지 이름 (예 : com.example.app.tests)을 입력합니다.
  14. 테스트를 실행할 장치를 선택하십시오.
  15. 구성 적용 및 저장
  16. 단위 테스트 실행 (및 실패 예상) :
  17. 실행 메뉴에서 새로 생성 된 테스트 구성을 선택합니다.
  18. 실행을 클릭하고 출력 콘솔에서 결과를 읽습니다.

코드를 더 읽기 쉽고, 유지 관리하고, 잘 테스트 할 수 있도록 행운을 빕니다!


문제는 계측 테스트에 관한 것이 었습니다! 또한 계측 테스트를 작성하는 데 어려움이 있습니다. 내 질문을 참조하십시오. stackoverflow.com/questions/35426990/…
Monica

2

Android Studio는 처음에는 개발자 미리보기가되었고 현재는 베타 버전이되었습니다. 프로젝트의 테스트 클래스 경로는 시간 동안 변경되었지만 사용중인 AS 버전에 관계없이 경로는 .iml 파일에 선언됩니다. 현재 0.8.3 버전에서는 내부 iml 파일에서 다음을 찾을 수 있습니다.

      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/groovy" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />

.iml 파일은 테스트 클래스를 배치 할 위치를 알려줍니다.



0

gradle 파일 안에 lib 아래 추가

 androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

androidTest 디렉터리 내에 HomeActivityTest 클래스를 만들고 테스트를 실행하기 전에 문자열 리소스 파일에 flurry_api_key 및 sender_id 문자열을 추가하고 실패 및 성공 사례의 값을 변경합니다.

@RunWith(AndroidJUnit4.class)
public class HomeActivityTest
{
    private static final String SENDER_ID = "abc";
    private static final String RELEASE_FLURRY_API_KEY = "xyz";

    @Test
    public void gcmRegistrationId_isCorrect() throws Exception
    {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        Assert.assertEquals(SENDER_ID, appContext.getString(R.string.sender_id));
    }

    @Test
    public void flurryApiKey_isCorrect() throws Exception
    {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        Assert.assertEquals(RELEASE_FLURRY_API_KEY, appContext.getString(R.string.flurry_api_key));
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.