Archive/패캠(초격차)

part5 (ch6) UI Test

lgvv 2022. 2. 1. 10:42

✅ 이번 시간에는 UI Test에 대해서 알아볼 예정이야.

 

유닛 테스트와 UI 테스트의 차이

차이점!

 

유닛 테스트는 클래스에 대해서 진행하고, UI 테스트는 앱 자체를 런치 시켜서 사용한다.

 

XCUIApplication을 문서에서 살펴보면 하나의 클래스이다!

 

Xcode 하단에 빨간 녹화버튼

 

녹화버튼을 이용해 코드를 작성할 수도 있다. 

다만, 네트워크가 있어야 하거나, 여러번의 탭을 통해 이동한 화면 등 어려움이 존재하여, Unit Test를 더 활용한다.

 

또한 녹화 버튼을 통하면 어떻게 쿼리를 작성해야하는지 쉽게 파악할 수 있으니 참고하자.

 

🟠 아래는 예시코드

//
//  MovieReviewUITests.swift
//  MovieReviewUITests
//
//  Created by Hamlit Jason on 2022/01/17.
//

import XCTest

// UITest의 경우에는 현업에서는 네트워크에 연결되어있어야 앱이 구동되는점, 또한, 여러번 클릭해서 그 지점으로 가서 사용해야하는 단점으로 인해 Unit테스트만 주로 사용한다.
class MovieReviewUITests: XCTestCase {

    var app: XCUIApplication!
    
    override func setUp() {
        super.setUp()
        
        continueAfterFailure = false // 실패하면 코드 쭉 실행안하고 종료
        
        app = XCUIApplication()
        app.launch()
    }
    
    override func tearDown() {
        super.tearDown()
        
        app = nil
    }
    
    func test_navigationBar의_타이틀이_영화평점으로_설정되어있다() {
        let existNavigationBar = app.navigationBars["영화 평점"].exists
        XCTAssertTrue(existNavigationBar)
    }
    
    func test_SearchBar가_존재한다() {
        // 서치바가 네비게이션의 서치필드에 들어있기 때문에
        let existSearchBar = app.navigationBars["영화 평점"]
            .searchFields["Search"]
            .exists
        XCTAssertTrue(existSearchBar)
    }
    
    func test_SearchBar에_cancel버튼이_존재한다() {
        let navigationBar = app.navigationBars
        navigationBar
            .searchFields["Search"]
            .tap()
        
        let existSearchBarCancelButton = navigationBar
            .buttons["Cancel"]
            .exists
        
        XCTAssertTrue(existSearchBarCancelButton)
    }
    
    func test_녹화버튼을_클릭해서_테스트코드_작성() {
        let app = XCUIApplication()
        let navigationBar = app.navigationBars["영화 평점"]
        let searchSearchField = navigationBar.searchFields["Search"]
        searchSearchField.tap()
        app.tables["Empty list"].swipeUp()
        searchSearchField.swipeDown()
        navigationBar.buttons["Cancel"].tap()
        
        let collectionViewsQuery = app.collectionViews
        collectionViewsQuery.children(matching: .cell).element(boundBy: 3).swipeUp()
        collectionViewsQuery.children(matching: .cell).element(boundBy: 2).swipeDown()
    }
    
}