엔지니어가 바라본 모바일 자동화 테스트 Copyright 2022. Kakao Corp. All rights reserved. Redistribution or public display is not permitted without written permission from Kakao. if(kakao)2022
unit을 식별, Unit별로 클래스 생성 Element initialization Step 2. Application map Element initialization + Control layer = Business logic Step 3. Business map Business Layer
입력한다. 확인 버튼을 클릭한다. click send text wait visibility scroll Control Layer remittanceAmountField remittanceSendBtn con fi rmBtn Element Business Logic X 송금 버튼을 클릭한다.
입력한다. 확인 버튼을 클릭한다. click send text wait visibility scroll Control Layer remittanceAmountField remittanceSendBtn con fi rmBtn Element Business Logic X 송금 버튼을 클릭한다.
.bankAccount(primaryBankAccount) .receiver(moneyTarget.getTalkReceiver()) .build(); remittancePage .remittanceRequest(remittanceReqDto); resDto = remittancePage.getRemittanceResDtoOnPass(remittanceReqDto); assertThat(resDto.getResultTitle(), is(equalTo(Money.Remittance.COMPLETE))); assertThat(resDto.getResultAmount(), is(equalTo(remittancePage.getTxAmount())); ... } Test Layer 송금구분 : 친구송금 송금형태 : 봉투송금 송금금액 : 잔액 내 충전계좌 : 유지 (기본계좌) Test data set 전달
TestSuite 친구송금 TestCase 1 Step 3. 송금하기 Step1. 더보기 > 페이홈 > 송금 화면 이동 Step 2. 송금 금액 입력 Step 4. 송금 화면 > 페이홈 화면으로 이동 Step 3~Step 4는 동작하지 않을 것이다. TestCase 2 Step 1. 페이홈 > 송금 화면 이동 Step 2. 송금 금액 입력 Step 3. 봉투 송금하기 Step 4. 송금 화면 > 페이홈 화면으로 이동 이후 케이스가 모두 실패될 것이다. Recovery | Test failure handling
위한 locator 전략 1. 속도 비교 2. well - made locator (최적화된 locator) 3. 동적 locator1) 사용 4. 신규 locator 연구 및 적용 Effective Locator Strategies 1) w3schools, “XPath”, 2020년 5월 25일, https:/ /www.w3schools.com/xml/xpath_axes.asp
모든 조상 노드를 선택합니다. (부모 및 조상 노드) parent 현재 노드의 모든 부모 노드를 선택합니다. child 현재 노드의 모든 자식을 선택합니다. descendant 현재 노드의 모든 후손을 선택합니다. following - sibling 현재 노드 다음에 오는 모든 형제 노드를 선택합니다. preceding - sibling 현재 노드 이전의 모든 형제 노드를 선택합니다. Effective Locator Strategies
체크한다고 가정 • full xpath 사용하는 경우 Xpath = "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/ android.widget.FrameLayout/android.widget.FrameLayout/ android.widget.FrameLayout/android.widget.FrameLayout/android.view.ViewGroup/ android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/ android.view.ViewGroup/android.widget.ScrollView/android.widget.FrameLayout/ android.view.ViewGroup/android.widget.LinearLayout/android.view.ViewGroup[3]/ android.widget.TextView[2]" Effective Locator Strategies
iOS Class chain2) Predicate3) Locator 예시 Class chain **/XCUIElementTypeOther[`label == \"즉시할인 미적용\" AND value == \"1\"`][1] **/XCUIElementTypeOther[`name BEGINSWITH “순차결제"`] Predicate label == \"보내기\" AND name == \"보내기\" AND value == \"1\" AND visible ==true 2) Meta Archive Github, “WebDriverAgent”, 2020년 5일 25일, https:/ /github.com/facebookarchive/WebDriverAgent/wiki/Class - Chain - Queries - Construction - Rules 3) Meta Archive Github, “WebDriverAgent”, 2020년 5월 25일, https:/ /github.com/facebookarchive/WebDriverAgent/wiki/Predicate - Queries - Construction - Rules
테스트 소요시간이 너무 많이 소요 • wait에서의 대기시간을 줄여보자 - 결과: • 모두 polling 주기 설정이 가능 • 기본 조건 셋팅으로는 성능상의 차이가 없다. • AppiumFluentWait 의 Polling 전략을 사용하면 유연하게 제어할 수 있다. Performance improvement studies 조건 시나리오 기대 결과 polling: 500ms / timeout: 10s 기본값에서 wait 조건 체크 시간 테스트 동일 (500ms 마다 체크 후 10s timeout) polling: 100ms / timeout: 10s Polling 주기를 줄인 경우 wait 시 조건 체크 시간 테스트 100ms 주기로 기본값보다 빠르게 체크 polling: 500ms / timeout: 10s / .withPollingStrategy(조건) Polling Strategy을 설정하여 polling 주기를 조정 Timeout 시간내 점점 더 느리게/빠르게 polling 설정 가능
배경: • 화면 전환 시 로딩이 느린 이슈 • Explicit Wait의 timeout 시간이 기대보다 더 걸리는 이슈 - 결과: • Implicit Wait만 사용한 경우, 5초로 기대한 시간과 동일 • Timeout 시간이 설정한 시간보다 1~5초 더 발생 • Explicit Wait의 timeout값은 Implicit Wait보다 커야함 조건 시나리오 기대 결과 isElementPresentWithTimeoutTest() 7, 15, 20, 30s의 대기시간으로 테스트 설정한 대기시간 만큼 대기하고 Timeout발생 기대 isElementPresentTest() 설정값 10s의 대기시간 테스트 10s 후 timeout발생 기대 implicitlyWaitTest() fi ndElement 함수를 사용할 경우 default timeout 5초 적용 테스트 5s 후 timeout발생 기대 implicitlyWait + waitForVisibilityTestWithTimeout() implicitlyWait = 5s 7, 15, 20, 30s의 대기시간으로 테스트 진행 설정한 대기시간 만큼 대기하고 Timeout발생 기대
전환 시 로딩이 느린 이슈 • Explicit Wait의 timeout 시간이 기대보다 더 걸리는 이슈 - 결과: • Implicit Wait만 사용한 경우, 5초로 기대한 시간과 동일 • Timeout 시간이 설정한 시간보다 1~5초 더 발생 • Explicit Wait의 timeout값은 Implicit Wait보다 커야함 Performance Improvement Studies Implicit Wait = 최소화 Explicit Wait = 상황별 최적화
루트 요소에서 여러 검색이 실행될 경우, 특정 요소로 제한 후 검색 시 검색 성능을 적절하게 최적화 가능 fi ndElements 대신 fi ndElement 사용 fi ndElements가 fi ndElement보다 모든 요소를 검색하는 데 더 많은 시간 소요 Avoid Generic Matchers asterisk(*)와 같은 Generic Matcher는 각 UI 요소의 모든 속성을 스캔하므로 추천하지 않음 - iOS 성능개선 방안4)에 따른 적용 테스트 진행 4) Meta Archive Github, “appium wda improve speed”, 2020년11월 20일, https:/ /github.com/facebookarchive/WebDriverAgent/wiki/How - To - Achieve - The - Best - Lookup - Performance
루트 요소에서 여러 검색이 실행될 경우, 특정 요소로 제한 후 검색 시 검색 성능을 적절하게 최적화 가능 fi ndElements 대신 fi ndElement 사용 fi ndElements가 fi ndElement보다 모든 요소를 검색하는 데 더 많은 시간 소요 Avoid Generic Matchers asterisk(*)와 같은 Generic Matcher는 각 UI 요소의 모든 속성을 스캔하므로 추천하지 않음 - iOS 성능개선 방안4)에 따른 적용 테스트 진행 4) Meta Archive Github, “appium wda improve speed”, 2020년11월 20일, https:/ /github.com/facebookarchive/WebDriverAgent/wiki/How - To - Achieve - The - Best - Lookup - Performance 전체 소스를 스캔하는 방식은 지양