PUROGU LADESU

ポエムがメインのブログです。

【Swift】UITest/XCTest

基本

XCTest
  • 画面操作をシミューレートして統合テストが出来ます。(単体テストはUIのついてない方のTestを使う)
  • 新規ファイルの追加でUITestCaseを追加する。
  • testXXXXXでテスト項目を作る。
  • setUpWithErrorは各テストケースの実行前に呼ばれ、アプリ立ち上げ、画面遷移、データ投入などを行う。
  • tearDownWithErrorは各テストケースの実行後に呼ばれ、データ削除などを行う。

レコーディングのやり方

テストケースを選択し、Xcodeのエディタの下のバーにある赤丸のRecordUITestボタンをクリックすると、画面操作した内容でコードが自動作成される。

func testTest() throws {
    // ここにカーソルを合わせて、赤丸ボタンRecordUITestをクリック
}

テストケースの書き方

XCTAssertXXXを使って正しいかどうかチェックします。
タイトルで指定できますが、identifierをつけたほうが良いと思います。

// 画面に必要な項目があるかチェック
func testLayoutIsCorrect() throws {
    let app = XCUIApplication()
    // アプリという名前の項目を探す
    let titleLabel = app.staticTexts["アプリ"].exists
    XCTAssertTrue(titleLabel)

    let buttonLogin = app.buttons["ログイン"].exists
    XCTAssertTrue(buttonLogin)

    let textEmail = app.textFields["Email"].exists
    XCTAssertTrue(textEmail)
}

アプリに同じ名前の項目があった場合はエラーになりますので、viewを指定してからその中のコントロールを指定するほうが良いです。
テキストフィールドに入力する場合は、キーボードを開いたりして時間がかかるので、sleepを使うとうまくいきます。

func testFillsAllInputs() throws {
    
    let app = XCUIApplication()
    // ビューを指定する
    let view = app.otherElements["SignUpFormView"]
    
    let username = view.textFields["userNameField"]
    username.tap()
    sleep(2)
    username.typeText("test user")
    
    let email = view.textFields["userEmailField"]
    email.tap()
    sleep(2)
    email.typeText("test457@test123.com")

    view.buttons["登録"].tap()
}
func testShowsNewView() throws {
    let app = XCUIApplication()
    app.buttons["登録"].tap()
    // 遷移先の画面をナビゲーションバーの名前で確認(2秒まで待つ)
    let viewTitle = app.navigationBars["ユーザー登録"].waitForExistence(timeout: 2)
    XCTAssertTrue(viewTitle)
}