基本
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) }