캡스톤 작품으로 소모임 앱을 만들고 기능별로 정상적으로 작동하는지 수동으로 시간을 갈아넣으며 테스트 했던 기억이 있다...
앱을 수동으로 테스트하는 것은 많은 시간을 소비하지만 Android 자동 테스트는 앱이 적절하게 작동하는지 확인할 수 있는 편리한 방법을 제공한다
소수의 코드를 직접 테스트하여 제대로 작동하는지 확인하는 유형이다. 로컬 테스트를 사용하면 함수, 클래스, 속성
을 테스트할 수 있다. 로컬 테스트는 워크스테이션에서 실행되기 때문에 에뮬레이터 없이 개발환경에서 진행할 수 있다.
Android 개발의 경우 계측 테스트는 UI 테스트이다. Android API와 플랫폼 API 및 서비스에 종속된 앱 일부를 테스트할 수 있습니다.
로컬 테스트와 달리 UI 테스트는 앱의 일부를 실행하고 사용자 상호작용을 시뮬레이션하여 앱이 적절하게 반응했는지 확인한다. 실제 기기 및 애뮬레이터에서 실행된다.
//팁 퍼센트에 따라 사용자가 팁을 얼마나 내야하는지 계산하는 함수
//테스트를 위해 @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)
}
로컬 테스트를 위해 테스트 디렉토리로 이동한다.
test디렉토리로 이동했고 main디렉토리와 패키지 구조가 같은 것을 확인할 수 있다.
테스트할 파일을 생성한 뒤 테스트 코드를 작성한다.
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)
}
}
계측 디렉토리는 androidTest폴더에서 작성할 수 있고 마찬가지로 main디렉토리와 패키지 구조가 같은 것을 확인할 수 있다.
class TipUITest {
@get:Rule
val composeTestRule = createComposeRule()
@Test //테스트를 위해 테스트 주석
fun calculate_20_percent_tip() {
composeTestRule.setContent {
Android_ComposeCamp_CodelabTheme {
Surface (modifier = Modifier.fillMaxSize()){
TipTimeLayout() //함수 본문 기능 실행 실제 앱에서도 이렇게 진행됨
}
}
}
composeTestRule.onNodeWithText("Bill Amount") //Bill Amount 값을 가진 텍스트로 이동해서 10의 값을 넣는다
.performTextInput("10")
composeTestRule.onNodeWithText("Tip Percentage")//Tip Percentage텍스트를 가진 텍스트로 이동해서
.performTextInput("20") //20의 값을 넣는다
val expectedTip = NumberFormat.getCurrencyInstance().format(2) //우리가 예상한 값
composeTestRule.onNodeWithText("Tip Amount: $expectedTip").assertExists(
"No node with this text was found."
//Tip Amount에 결과과 나올 것인데 그 결과 텍스트가 우리가 예상한 expectedTip인지
)
}
}
컴파일러는 androidTest폴더
의 @Test가 달린 메서드는 계측 테스트임을 나타내고 test 폴더
의 @Test가 달린 메서드는 로켈 테스트임을 인식한다.
UI 구성요소는 onNodeWithText()메서드를 사용하여 액세스 할 수 있다.