자동 테스트 작성

1. 시작하기 전에

이 Codelab에서는 Android의 자동 테스트와 이 테스트를 통해 확장 가능하고 강력한 앱을 작성하는 방법을 알아봅니다. UI 로직과 비즈니스 로직의 차이점과 두 로직을 테스트하는 방법도 자세히 알아봅니다. 마지막으로 Android 스튜디오에서 자동 테스트를 작성하고 실행하는 방법을 살펴봅니다.

기본 요건

  • 함수와 컴포저블을 사용하여 Android 앱을 작성하는 능력

학습할 내용

  • Android의 자동 테스트 기능
  • 자동 테스트가 중요한 이유
  • 로컬 테스트의 정의 및 용도
  • 계측 테스트의 정의 및 용도
  • Android 코드용 로컬 테스트 작성 방법
  • Android 앱용 계측 테스트 작성 방법
  • 자동 테스트 실행 방법

빌드할 항목

  • 로컬 테스트
  • 계측 테스트

필요한 항목

2. 시작 코드 가져오기

다음 코드를 다운로드하세요.

GitHub 저장소를 클론하여 코드를 가져와도 됩니다.

$ git clone https://github.com/google-developer-training/basic-android-kotlin-compose-training-tip-calculator.git
$ cd basic-android-kotlin-compose-training-tip-calculator
$ git checkout main

3. 자동 테스트

소프트웨어의 테스트는 소프트웨어가 예상대로 작동하는지 확인하는 구조화된 방법입니다. 자동 테스트는 개발자가 작성한 코드의 또 다른 부분이 올바르게 작동하는지 확인하는 코드입니다.

테스트는 앱 개발 프로세스에서 중요한 부분입니다. 앱 테스트를 일관되게 실행하여 앱을 공개적으로 출시하기 전에 앱의 정확성, 기능 동작 및 사용성을 확인할 수 있습니다.

변경사항이 도입될 때 테스트를 통해 기존 코드를 지속적으로 확인할 수도 있습니다.

수동 테스트는 대부분 계속 사용할 수 있지만, Android의 테스트가 자동화되는 경우도 많습니다. 남은 과정에서는 앱 코드와 앱 자체의 기능적 요구사항을 테스트하는 자동 테스트를 중점적으로 다룹니다. 이 Codelab에서는 Android에서 테스트하는 데 필요한 가장 기본적인 사항을 알아봅니다. 이후 Codelab에서는 Android 앱 테스트를 위한 고급 사례를 알아봅니다.

Android 개발 및 Android 앱 테스트에 점차 익숙해지면 앱 코드와 함께 테스트도 주기적으로 작성하는 것이 좋습니다. 앱에 새 기능을 만들 때마다 테스트를 만들면 추후 앱이 성장할 때의 워크로드가 줄어듭니다. 또한, 앱을 수동으로 테스트하느라 많은 시간을 소비할 필요 없이 앱이 적절하게 작동하는지 확인할 수 있는 편리한 방법을 제공합니다.

자동 테스트는 모든 소프트웨어 개발에서 필수적이며 Android 개발도 예외가 아닙니다. 이에 자동 테스트를 소개하고자 합니다.

자동 테스트가 중요한 이유

처음에는 앱에 테스트가 그다지 필요하지 않은 것처럼 보일 수 있지만 테스트는 크기와 복잡성이 다양한 모든 앱에 필요합니다.

코드베이스를 확장하려면 새 코드를 추가할 때 기존 기능을 테스트해야 하는데, 이는 기존 테스트가 있는 경우에만 가능합니다. 앱의 규모가 커지면 수동 테스트를 할 때 자동 테스트보다 훨씬 많은 노력이 필요합니다. 또한 프로덕션 버전의 앱 작업을 시작했을 때, 사용자층이 넓은 경우 테스트를 진행하는 게 더욱 중요합니다. 예를 들어 다양한 버전의 Android를 실행하는 여러 유형의 기기를 고려해야 합니다.

결국에는 자동 테스트를 통해 수동 테스트보다 훨씬 빠르게 대부분의 사용 시나리오를 고려할 수 있는 지점에 다다르게 됩니다. 새 코드를 출시하기 전에 테스트를 실행하면, 예상치 못한 동작이 있는 상태로 앱이 출시되지 않도록 기존 코드를 변경할 수 있습니다.

자동 테스트는 소프트웨어를 통해 실행된 테스트입니다. 이와 달리 수동 테스트는 기기와 직접 상호작용하는 사람이 실행합니다. 자동 테스트와 수동 테스트는 제품 사용자에게 쾌적한 환경을 제공하는 데 중요한 역할을 합니다. 그러나 자동 테스트가 더 정확하고 팀의 생산성을 최적화할 수 있습니다. 테스트를 실행하는 데 사람이 필요하지 않고 수동 테스트보다 훨씬 빠르게 실행할 수 있기 때문입니다.

자동 테스트 유형

로컬 테스트

로컬 테스트는 소수의 코드를 직접 테스트하여 제대로 작동하는지 확인하는 자동 테스트의 유형입니다. 로컬 테스트를 사용하여 함수, 클래스, 속성을 테스트할 수 있습니다. 로컬 테스트는 워크스테이션에서 실행됩니다. 즉, 기기나 에뮬레이터 없이도 개발 환경에서 실행됩니다. 간단히 말하자면 로컬 테스트는 개발자 컴퓨터에서 실행됩니다. 컴퓨터 리소스의 오버헤드도 매우 낮으므로 제한된 리소스에서 빠르게 실행할 수 있습니다. Android 스튜디오에서는 로컬 테스트를 자동으로 실행할 수 있습니다.

계측 테스트

Android 개발의 경우 계측 테스트는 UI 테스트입니다. 계측 테스트를 사용하면 Android API와 플랫폼 API 및 서비스에 종속된 앱 일부를 테스트할 수 있습니다.

로컬 테스트와 달리 UI 테스트는 앱이나 앱의 일부를 실행하고 사용자 상호작용을 시뮬레이션하여 앱이 적절하게 반응했는지 확인합니다. 이 과정 전반에 걸쳐 UI 테스트는 실제 기기 또는 에뮬레이터에서 실행됩니다.

Android에서 계측 테스트를 실행하면 테스트 코드는 실제로 일반 Android 앱처럼 자체 Android 애플리케이션 패키지(APK)로 빌드됩니다. APK는 기기나 에뮬레이터에서 앱을 실행하는 데 필요한 파일과 모든 코드가 포함된 압축 파일입니다. 이 테스트 APK는 일반 앱 APK와 함께 기기 또는 에뮬레이터에 설치됩니다. 그런 다음 테스트 APK는 앱 APK를 위한 테스트를 실행합니다.

4. 로컬 테스트 작성

앱 코드 준비

로컬 테스트는 앱 코드에서 직접 메서드를 테스트하므로 테스트할 메서드는 테스트 클래스 및 메서드에서 사용할 수 있어야 합니다. 다음 코드 스니펫의 로컬 테스트는 calculateTip() 메서드가 올바르게 작동하는지 확인하지만 calculateTip() 메서드는 현재 private이므로 테스트에서 액세스할 수 없습니다. private 지정을 삭제하고 internal로 설정합니다.

MainActivity.kt

internal fun calculateTip(amount: Double, tipPercent: Double = 15.0, roundUp: Boolean): String {
    var tip = tipPercent / 100 * amount
    if (roundUp) {
        tip = kotlin.math.ceil(tip)
    }
    return NumberFormat.getCurrencyInstance().format(tip)
}
  • MainActivity.kt 파일에서 calculateTip() 메서드 앞줄에 @VisibleForTesting 주석을 추가합니다.
@VisibleForTesting
internal fun calculateTip(amount: Double, tipPercent: Double = 15.0, roundUp: Boolean): String {
    var tip = tipPercent / 100 * amount
    if (roundUp) {
        tip = kotlin.math.ceil(tip)
    }
    return NumberFormat.getCurrencyInstance().format(tip)
}

이렇게 하면 메서드가 공개되지만 테스트 목적으로만 공개된다고 사용자에게 표시됩니다.

테스트 디렉터리 만들기

Android 프로젝트에서 로컬 테스트가 작성되는 위치는 test 디렉터리입니다.

다음과 같이 test 디렉터리를 만듭니다.

  1. Project(프로젝트) 탭에서 뷰를 Project로 변경합니다.

a6b5eade0103eca9.png

  1. src 디렉터리를 마우스 오른쪽 버튼으로 클릭합니다.

d6bfede787910341.png

  1. New(새로 만들기) > Directory(디렉터리)를 선택합니다.

a457c469e7058234.png

  1. New Directory(새 디렉터리) 창에서 test/java를 선택합니다.

bd2c2ef635f0a392.png

  1. 키보드에서 return 또는 Enter 키를 입력합니다. 이제 test(테스트) 디렉터리가 Project(프로젝트) 탭에 표시됩니다.

d07872d354d8aa92.png

test(테스트) 디렉터리에는 앱 코드가 있는 main 디렉터리와 동일한 패키지 구조가 필요합니다. 즉, 앱 코드가 main > java > com > example > tiptime 패키지에 작성되는 것처럼 로컬 테스트도 test > java > com > example > tiptime에 작성됩니다.

이 패키지 구조를 test 디렉터리에 만듭니다.

  1. test/java 디렉터리를 마우스 오른쪽 버튼으로 클릭하고 New > Package(새로 만들기 > 패키지)를 선택합니다.

99fcf5ff6cda7b57.png

  1. New Package(새 패키지) 창에서 com.example.tiptime을 입력합니다.

6223d2f5664ca35f.png

테스트 클래스 만들기

이제 test 패키지가 준비되었으므로 테스트를 작성해 보겠습니다. 먼저 테스트 클래스를 만듭니다.

  1. Project(프로젝트) 탭에서 app > src > test를 클릭하고 test 디렉터리 옆에 있는 d4706c21930a1ef3.png 펼치기 화살표를 클릭합니다.
  2. com.example.tiptime 디렉터리를 마우스 오른쪽 버튼으로 클릭한 다음 New > Kotlin Class/File(새로 만들기 > Kotlin 클래스/파일)을 선택합니다.

5e9d46922b587fdc.png

  1. 클래스 이름으로 TipCalculatorTests를 입력합니다.

9260eb95d7aa6095.png

테스트 작성

앞서 언급했듯이 로컬 테스트는 앱에서 소량의 코드를 테스트하는 데 사용합니다. Tip Time 앱의 기본 기능은 팁을 계산하는 것이므로 팁 계산 로직이 올바르게 작동하는지 확인하는 로컬 테스트가 있어야 합니다.

이렇게 하려면 앱 코드에서 했던 것처럼 calculateTip() 함수를 직접 호출해야 합니다. 그런 다음 함수에서 반환한 값이 함수에 전달한 값을 기준으로 예상값과 일치하는지 확인합니다.

자동 테스트 작성에 관해 알아야 할 몇 가지 사항이 있습니다. 다음 개념 목록은 로컬 테스트와 계측 테스트에 적용됩니다. 처음에는 복잡해 보일 수 있지만 이 Codelab을 마칠 때면 좀 더 잘 파악할 수 있습니다.

  • 메서드 형태로 자동 테스트를 작성합니다.
  • 메서드에 @Test 주석을 답니다. 이렇게 하면 컴파일러에 메서드가 테스트 메서드임을 알리고 적절하게 메서드가 실행됩니다.
  • 이름에 테스트의 테스트 내용과 예상 결과가 명확하게 설명되어 있는지 확인합니다.
  • 테스트 메서드는 일반 앱 메서드와 같은 로직을 사용하지 않습니다. 항목이 구현되는 방식에는 관심이 없습니다. 지정된 입력의 예상 출력을 엄격하게 확인합니다. 즉, 테스트 메서드는 앱의 UI 또는 로직이 올바르게 작동하는지 어설션하는 일련의 명령만 실행합니다. 아직 이 내용을 이해할 필요는 없습니다. 나중에 자세히 알아봅니다. 그러나 테스트 코드는 익숙한 앱 코드와 상당히 다를 수 있다는 점을 기억하세요.
  • 테스트는 일반적으로 특정 조건이 충족되었는지 확인하는 데 사용하는 어설션으로 끝납니다. 어설션은 이름에 assert가 있는 메서드 호출의 형태로 제공됩니다. 예를 들어 assertTrue() 어설션은 Android 테스트에서 일반적으로 사용됩니다. 어설션 문은 대부분의 테스트에서 사용되지만 실제 앱 코드에서는 거의 사용되지 않습니다.

테스트를 작성합니다.

  1. 청구 금액 10달러의 팁 20% 계산을 테스트하는 메서드를 만듭니다. 예상되는 계산 결과는 2달러입니다.
import org.junit.Test

class TipCalculatorTests {

   @Test
   fun calculateTip_20PercentNoRoundup() {
       
   }
}

앱 코드의 MainActivity.kt 파일에 있는 calculateTip() 메서드에는 세 가지 매개변수가 필요합니다. 청구 금액, 팁 비율, 결과를 반올림할지 나타내는 플래그입니다.

fun calculateTip(amount: Double, tipPercent: Double, roundUp: Boolean)

테스트에서 이 메서드를 호출할 때가 되면 메서드가 앱 코드에서 호출될 때와 마찬가지로 이러한 매개변수를 전달해야 합니다.

  1. calculateTip_20PercentNoRoundup() 메서드에서 상수 변수 두 개를 만듭니다. 하나는 10.00 값으로 설정된 amount 변수이고 하나는 20.00 값으로 설정된 tipPercent 변수입니다.
val amount = 10.00
val tipPercent = 20.00
  1. MainActivity.kt 파일의 앱 코드에서 다음 코드를 확인합니다. 팁 금액은 기기의 언어에 따라 형식이 지정됩니다.

MainActivity.kt

...
NumberFormat.getCurrencyInstance().format(tip)
...

동일한 형식 지정이 테스트에서 예상 팁 금액을 확인할 때도 사용되어야 합니다.

  1. NumberFormat.getCurrencyInstance().format(2)로 설정된 expectedTip 변수를 만듭니다.

expectedTip 변수는 나중에 calculateTip() 메서드의 결과와 비교됩니다. 이는 테스트에서 메서드가 올바르게 작동하는지 확인하는 방법입니다. 이전 단계에서 amount 변수를 10.00 값으로, tipPercent 변수를 20.00 값으로 설정했습니다. 10의 20%는 2이므로 expectedTip 변수는 값이 2인 형식이 지정된 통화로 설정됩니다. calculateTip() 메서드는 형식이 지정된 String 값을 반환한다는 점을 기억하세요.

  1. amounttipPercent 변수로 calculateTip() 메서드를 호출하고 반올림에 관한 false 인수를 전달합니다.

여기서는 반올림을 고려하지 않아도 됩니다. 예상 결과에서 반올림을 변수에 넣지 않기 때문입니다.

  1. 메서드 호출의 결과를 상수 actualTip 변수에 저장합니다.

지금까지는 이 테스트를 작성하는 것이 앱 코드에서 일반 메서드를 작성하는 것과 크게 다르지 않았습니다. 그러나 테스트하려는 메서드에서 반환된 값이 있으므로 이제 어설션으로 이 값이 올바른 값인지 확인해야 합니다.

어설션을 만드는 것은 일반적으로 자동 테스트의 최종 목표이며 앱 코드에서 흔히 사용되는 것은 아닙니다. 여기서는 actualTip 변수가 expectedTip 변수와 같은지 확인하려고 합니다. 이때 JUnit 라이브러리의 assertEquals() 메서드를 사용하면 됩니다.

assertEquals() 메서드는 예상값과 실제값이라는 두 매개변수를 사용합니다. 이러한 값이 같으면 어설션과 테스트가 통과됩니다. 같지 않으면 어설션과 테스트가 실패합니다.

  1. assertEquals() 메서드를 호출한 다음 expectedTipactualTip 변수를 매개변수로 전달합니다.
import org.junit.Assert.assertEquals
import org.junit.Test
import java.text.NumberFormat

class TipCalculatorTests {

    @Test
    fun calculateTip_20PercentNoRoundup() {
        val amount = 10.00
        val tipPercent = 20.00
        val expectedTip = NumberFormat.getCurrencyInstance().format(2)
        val actualTip = calculateTip(amount = amount, tipPercent = tipPercent, false)
        assertEquals(expectedTip, actualTip)
    }
}

테스트 실행

이제 테스트를 실행해 보겠습니다.

클래스 이름 및 테스트 함수의 줄 번호 옆 여백에 화살표가 표시되는 것을 확인할 수 있습니다. 이 화살표를 클릭하여 테스트를 실행할 수 있습니다. 메서드 옆 화살표를 클릭하면 해당 테스트 메서드만 실행됩니다. 클래스에 테스트 메서드가 여러 개 있다면 클래스 옆 화살표를 클릭하여 클래스에 있는 테스트 메서드를 모두 실행할 수 있습니다.

722bf5c7600bc004.png

테스트를 실행합니다.

  • 클래스 선언 옆의 화살표를 클릭한 다음 Run 'TipCalculatorTests'('TipCalculatorTests' 실행)를 클릭합니다.

a294e77a57b0bb0a.png

아래와 같이 표시됩니다.

  • Run(실행) 창 하단에 일부 출력이 표시됩니다.

c97b205fef4da587.png

5. 계측 테스트 작성

계측 디렉터리 만들기

계측 디렉터리는 로컬 테스트 디렉터리와 비슷한 방식으로 생성됩니다.

  1. src 디렉터리를 마우스 오른쪽 버튼으로 클릭하고 New > Directory(새로 만들기 > 디렉터리)를 선택합니다.

309ea2bf7ad664e2.png

  1. New Directory(새 디렉터리) 창에서 androidTest/java를 선택합니다.

7ad7d6bba44effcc.png

  1. 키보드에서 return 또는 Enter 키를 입력합니다. 이제 androidTest 디렉터리가 Project(프로젝트) 탭에 표시됩니다.

bd0a1ed4d803e426.png

maintest 디렉터리의 패키지 구조가 동일한 것처럼 androidTest 디렉터리의 패키지 구조도 이와 동일해야 합니다.

  1. androidTest/java 폴더를 마우스 오른쪽 버튼으로 클릭하고 New > Package를 선택합니다.
  2. New Package 창에서 com.example.tiptime을 입력합니다.
  3. 키보드에서 return 또는 Enter 키를 입력합니다. 이제 androidTest 디렉터리의 전체 패키지 구조가 Project 탭에 표시됩니다.

테스트 클래스 만들기

Android 프로젝트에서 계측 테스트 디렉터리는 androidTest 디렉터리로 지정됩니다.

계측 테스트를 만들려면 로컬 테스트를 만들 때 사용한 프로세스를 동일하게 반복해야 하지만 이번에는 androidTest 디렉터리 내에 만듭니다.

다음과 같이 테스트 클래스를 만듭니다.

  1. Project(프로젝트) 창에서 androidTest 디렉터리로 이동합니다.
  2. tiptime 디렉터리가 표시될 때까지 각 디렉터리 옆에 있는 cf54f6c094aa8fa3.png 펼치기 화살표를 클릭합니다.

14674cbab3cba3e2.png

  1. tiptime 디렉터리를 마우스 오른쪽 버튼으로 클릭한 다음 New > Kotlin Class/File(새로 만들기 > Kotlin 클래스/파일)을 선택합니다.
  2. 클래스 이름으로 TipUITests를 입력합니다.

acd0c385ae834a16.png

테스트 작성

계측 테스트 코드는 로컬 테스트 코드와 매우 다릅니다.

계측 테스트는 앱과 UI의 실제 인스턴스를 테스트하므로 Tip Time 앱 코드를 작성할 때 MainActivity.kt 파일의 onCreate() 메서드에서 콘텐츠를 설정하는 방식과 유사하게 UI 콘텐츠를 설정해야 합니다. Compose로 빌드된 앱의 모든 계측 테스트를 작성하기 전에 이 작업을 실행해야 합니다.

Tip Time 앱 테스트의 경우 계속해서 UI 구성요소와 상호작용하는 명령을 작성하여 팁 계산 프로세스가 UI를 통해 테스트되도록 합니다. 계측 테스트 개념은 처음에는 어려울 수 있지만 걱정하지 마세요. 다음 단계에서 이 프로세스를 다룹니다.

테스트를 작성합니다.

  1. createComposeRule() 메서드의 결과로 설정된 composeTestRule 변수를 만들고 Rule 주석을 추가합니다.
import androidx.compose.ui.test.junit4.createComposeRule
import org.junit.Rule

class TipUITests {

   @get:Rule
   val composeTestRule = createComposeRule()
}
  1. calculate_20_percent_tip() 메서드를 만들고 @Test 주석을 추가합니다.
import org.junit.Test

@Test
fun calculate_20_percent_tip() {
}

컴파일러는 androidTest 디렉터리에서 @Test 주석이 달린 메서드가 계측 테스트를 나타내고 test 디렉터리에서 @Test 주석이 달린 메서드가 로컬 테스트를 나타낸다고 인식합니다.

  1. 함수 본문에서 composeTestRule.setContent() 함수를 호출합니다. composeTestRule의 UI 콘텐츠가 설정됩니다.
  2. 함수의 람다 본문에서 TipTimeLayout() 함수를 호출하는 람다 본문과 함께 TipTimeTheme() 함수를 호출합니다.
import com.example.tiptime.ui.theme.TipTimeTheme

@Test
fun calculate_20_percent_tip() {
    composeTestRule.setContent {
        TipTimeTheme {
           TipTimeLayout()
        }
    }
}

완료되면 코드는 MainActivity.kt 파일의 onCreate() 메서드에서 콘텐츠를 설정하기 위해 작성된 코드와 비슷하게 표시됩니다. 이제 UI 콘텐츠가 설정되었으므로 앱의 UI 구성요소와 상호작용하는 명령을 작성할 수 있습니다. 이 앱에서는 앱이 청구 금액과 팁 비율 입력값을 기반으로 올바른 팁 값을 표시하는지 테스트해야 합니다.

  1. UI 구성요소는 composeTestRule을 통해 노드로 액세스할 수 있습니다. 이를 위한 일반적인 방법은 onNodeWithText() 메서드를 사용하여 특정 텍스트가 포함된 노드에 액세스하는 것입니다. onNodeWithText() 메서드를 사용하여 청구 금액에 관한 TextField 컴포저블에 액세스합니다.
import androidx.compose.ui.test.onNodeWithText

@Test
fun calculate_20_percent_tip() {
    composeTestRule.setContent {
        TipTimeTheme {
            TipTimeLayout()
        }
    }
    composeTestRule.onNodeWithText("Bill Amount")
}

이제 performTextInput() 메서드를 호출하고 입력하려는 텍스트를 전달하여 TextField 컴포저블을 채울 수 있습니다.

  1. 청구 금액의 TextField10 값으로 채웁니다.
import androidx.compose.ui.test.performTextInput

@Test
fun calculate_20_percent_tip() {
    composeTestRule.setContent {
        TipTimeTheme {
            TipTimeLayout()
        }
    }
    composeTestRule.onNodeWithText("Bill Amount")
.performTextInput("10")
}
  1. 동일한 접근 방식을 사용하여 팁 비율에 관한 OutlinedTextField20 값으로 채웁니다.
@Test
fun calculate_20_percent_tip() {
    composeTestRule.setContent {
        TipTimeTheme {
            TipTimeLayout()
        }
    }
   composeTestRule.onNodeWithText("Bill Amount")
.performTextInput("10")
   composeTestRule.onNodeWithText("Tip Percentage").performTextInput("20")
}

모든 TextField 컴포저블이 채워지면 앱 화면 하단의 Text 컴포저블에 팁이 표시됩니다.

이러한 TextField 컴포저블을 채우도록 테스트에 지시했으므로 이제 Text 컴포저블이 어설션과 함께 올바른 팁을 표시하는지 확인해야 합니다.

Compose를 사용한 계측 테스트에서 어설션은 UI 구성요소에서 직접 호출할 수 있습니다. 여러 어설션을 사용할 수 있지만 이 경우에는 assertExists() 메서드를 사용하려고 합니다. 팁 금액을 표시하는 Text 컴포저블은 다음과 같이 표시되어야 합니다. Tip Amount: $2.00

  1. 이 텍스트가 있는 노드가 존재한다는 어설션을 만듭니다.
import java.text.NumberFormat

@Test
fun calculate_20_percent_tip() {
    composeTestRule.setContent {
        TipTimeTheme {
            Surface (modifier = Modifier.fillMaxSize()){
                TipTimeLayout()
            }
        }
    }
   composeTestRule.onNodeWithText("Bill Amount")
      .performTextInput("10")
   composeTestRule.onNodeWithText("Tip Percentage").performTextInput("20")
   val expectedTip = NumberFormat.getCurrencyInstance().format(2)
   composeTestRule.onNodeWithText("Tip Amount: $expectedTip").assertExists(
      "No node with this text was found."
   )
}

테스트 실행

계측 테스트를 실행하는 프로세스는 로컬 테스트와 동일합니다. 각 선언 옆 여백에 있는 화살표를 클릭하여 개별 테스트나 전체 테스트 클래스를 실행합니다.

ad45b3e8730f9bf2.png

  • 클래스 선언 옆에 있는 화살표를 클릭합니다. 기기나 에뮬레이터에서 테스트가 실행되는 것을 확인할 수 있습니다. 테스트가 완료되면 다음 이미지와 같이 출력됩니다.

bfd75ec0a8a98999.png

6. 솔루션 코드 가져오기

또는 코드에 관한 GitHub 저장소를 클론해도 됩니다.

$ git clone https://github.com/google-developer-training/basic-android-kotlin-compose-training-tip-calculator.git
$ cd basic-android-kotlin-compose-training-tip-calculator
$ git checkout test_solution

7. 결론

축하합니다. Android의 첫 번째 자동 테스트를 작성했습니다. 테스트는 소프트웨어 품질관리에서 중요한 부분입니다. Android 앱을 계속 빌드하면서 앱 기능과 함께 테스트를 작성하여 개발 프로세스 내내 앱이 제대로 작동하는지 확인해야 합니다.

요약

  • 자동 테스트의 정의
  • 자동 테스트가 중요한 이유
  • 로컬 테스트와 계측 테스트의 차이점
  • 자동 테스트 작성을 위한 기본 권장사항
  • Android 프로젝트에서 로컬 및 계측 테스트 클래스를 찾고 배치하는 위치
  • 테스트 메서드를 만드는 방법
  • 로컬 및 계측 테스트 클래스를 만드는 방법
  • 로컬 및 계측 테스트에서 어설션을 만드는 방법
  • 테스트 규칙을 사용하는 방법
  • ComposeTestRule을 사용하여 테스트와 함께 앱을 실행하는 방법
  • 계측 테스트에서 컴포저블과 상호작용하는 방법
  • 테스트를 실행하는 방법