UITest) Alert 테스트 하기

SteadySlower·2023년 6월 5일
0

iOS Development

목록 보기
18/38
post-custom-banner

이 포스팅은 사내에서 진행한 Tech Talk을 정리한 포스팅입니다.

이번에는 Alert를 UITest하는 방법을 알아보도록 하겠습니다.

이름 입력 테스트

저번 시간에 이름 입력을 성공하는 테스트를 해보았는데요. 이번에는 실패하는 케이스를 테스트 해보도록 하겠습니다. 5글자 미만의 이름을 작성하면 아래와 같은 alert가 뜨도록 해놓았습니다.

저번에 이름 입력에 성공하는 테스트 코드는 아래와 같은데요.

func test_NameView_inputButton_success2() {
    let name = "Teddy"
    inputName(name)
    
    let welcomeMessage = app.staticTexts["Let's Quiz, \(name)!"]
    XCTAssert(welcomeMessage.exists)
}

이 코드를 살짝 수정해서 welcomeMessage가 없는 것으로 실패했음을 확인하도록 만들어보도록 하겠습니다.

func test_NameView_inputButton_failure() {
    let name = "Tom"
    inputName(name)
    let welcomeMessage = app.staticTexts["Let's Quiz, \(name)!"]
    XCTAssertFalse(welcomeMessage.exists)
}

이렇게 하면 실패하는 케이스도 테스트를 할 수 있습니다.

Alert를 테스트

alert의 존재 확인

위에 있는 코드로도 원하는 테스트를 할 수 있습니다만 앱에서 띄우는 alert를 확인해서 원하는 테스트를 할 수도 있습니다. alert는 앱에서 하나 밖에 띄울 수 없습니다. 따라서 app.alerts.firstMatch를 통해서 현재 떠 있는 alert를 특정할 수 있습니다.

주의할 점은 test code는 동기적으로 바로바로 실행되는데 반해서 UI에 alert가 표시되는데는 시간이 걸립니다. 어쩌면 테스트 코드가 alert를 바로 발견하지 못할 수도 있습니다. (반드시 그런 것은 아닙니다.) 이런 UI 요소를 확인할 때는 그냥 exist보다는 waitForExistence를 사용하는 것이 권장됩니다.

func test_NameView_inputButton_failure2() {
    let name = "Tom"
    inputName(name)
    let isAlertExist = app.alerts.firstMatch.waitForExistence(timeout: 5)
    XCTAssert(isAlertExist)
}

alert의 메시지 내용 확인

현재 앱에서는 이름의 조건에 따라서 에러 메시지가 1종류 밖에 없어서 큰 문제가 없습니다만 2종류 이상의 조건과 에러 메시지를 가지고 있는 앱들도 많습니다.

조건이 2가지 이상인 경우 조건에 부합하는 Alert가 떴는지에 대해서도 확인을 해야 합니다. Alert의 에러 메시지로 확인할 수 있는 방식으로 테스트 코드를 짜보겠습니다.

func test_NameView_inputButton_failure3() {
    let name = "Tom"
    inputName(name)
    let alert = app.alerts.firstMatch
    let errorMessage = alert.staticTexts["이름은 5글자 이상으로 해주세요"]
    XCTAssert(errorMessage.exists)
}

에러 메시지 확인하고 다시 입력하기

위 alert에서 ok 버튼을 누르면 이름을 입력하는 text field에 입력이 되어 있던 String이 삭제되도록 되어 있는데요. 해당 기능을 테스트하기 위해서 잘못된 이름 입력 → 실패 → ok 버튼 누르기 → 올바른 이름 입력의 순서를 가진 테스트 코드를 만들어보도록 하겠습니다.

func test_NameView_inputButton_retry() {
    let invalidName = "Tom"
    inputName(invalidName)
    
    let alert = app.alerts.firstMatch
    let alertButton = alert.buttons["OK"]
    alertButton.tap()
    
    let validName = "Teddy"
    inputName(validName)
    
    app.staticTexts["Let's Quiz, Teddy!"].tap()
}

이상 Alert와 관련된 UITest에 대해서 알아봤습니다.

profile
백과사전 보다 항해일지(혹은 표류일지)를 지향합니다.
post-custom-banner

0개의 댓글