xcodeでUI Testingを初めて触る時のメモ


UI testを始めた時思ってた作業と違っていて戸惑ったのでメモ。

意外だったのはレコードボタンを押すと<b>エクセルのマクロみたいな感じでコードが吐き出される</b>です。


#新規作成 ３ステップ
この記事がわかりやすい。
http://dev.classmethod.jp/smartphone/iphone/xcode-7-ui-testing/


##1.新規作成する

![スクリーンショット 2017-08-27 14.51.29.png](https://qiita-image-store.s3.amazonaws.com/0/64334/d9e78623-8766-ed1d-bd12-4ee3c7205bdb.png)


```swift:
import XCTest

class postImage: XCTestCase {
    
    //テストコード起動時に呼び出される
    override func setUp() {
        super.setUp()
        continueAfterFailure = false
        XCUIApplication().launch()
    }
    //テストコード終了時に呼び出される
    override func tearDown() {
        super.tearDown()
    }
    //テストコード自体
    func testExample() {
        ※ここでレコードボタンを押す！！　でシミュレータが動き出すので、動かすと　ここにコードが吐き出される。
    }
  
}

```

##2.レコードする。

赤い丸を押すとレコード開始。
![スクリーンショット 2017-08-27 14.51.58.png](https://qiita-image-store.s3.amazonaws.com/0/64334/fc453e06-456e-f771-d080-868621de483c.png)

##3.検証コードを書く。

aaaという文字が登録されたことを検証。

```swift:
//コントロールのIdentifierに値を設定しておく必要あり
let staticText = app.staticTexts["HogeIdentifier"]
//検証コード
XCTAssertEqual(staticText.label, "aaa")

```

ザーッテストが流れるので、他の機能壊れてないかなーってリグレッションテストにもなる。
![スクリーンショット 2017-08-27 15.03.32.png](https://qiita-image-store.s3.amazonaws.com/0/64334/942844aa-2b24-d84a-7641-8e9c10758d41.png)

#注意点！！
エラーが出て苦戦。下記二個を設定することで回避。

##1.accessibilityIdentifierを設定するべし
##2.view.isAccessibilityElement = trueにするべし


```
Timestamped Event Matching Error: Failed to find matching element
```

![スクリーンショット 2017-08-27 16.53.49.png](https://qiita-image-store.s3.amazonaws.com/0/64334/0cc94fef-c54b-586c-a992-040921336443.png)


https://stackoverflow.com/questions/36616891/timestamped-event-matching-error-failed-to-find-matching-element


#色々なXCTAssert

XCTAssertEqual意外にも検証用のコードは色々用意されてる。

##要素が存在するかどうかのテスト

```swift:
XCTAssert(app.staticTexts["Welcome"].exists)
```

##要素が表示されるのを待つ
NSPredicateは条件。waitForExpectationsで待つ。

```swift:
let goLabel = app.staticTexts["Go!"]
XCTAssertFalse(goLabel.exists)

let exists = NSPredicate(format: "exists == true")
expectation(for: exists, evaluatedWithObject: goLabel, handler: nil)

app.buttons["Ready, set..."].tap()
waitForExpectations(timeout: 5, handler: nil)
XCTAssert(goLabel.exists)
```

#要素内の値を検証する
XCTAssertTrueが0であることを検証。

```swift:
XCTAssertTrue(staticText.label == "0")
```

##テーブルセルの並べ替え

```swift:
let topButton = app.buttons["Reorder Top Cell"]
let bottomButton = app.buttons["Reorder Bottom Cell"]
bottomButton.press(forDuration: 0.5, thenDragTo: topButton)

XCTAssertLessThanOrEqual(bottomButton.frame.maxY, topButton.frame.minY)
```

##pullしてリフレッシュ
テーブルの最初のセルと6のdyを持つ別のセルからXCUICoordinateを作成します。次に、最初の座標を2番目の座標にドラッグします。

```swift:
let firstCell = app.staticTexts["Adrienne"]
let start = firstCell.coordinate(withNormalizedOffset: (CGVectorMake(0, 0))
let finish = firstCell.coordinate(withNormalizedOffset: (CGVectorMake(0, 6))
start.press(forDuration: 0, thenDragTo: finish)
```

##ビューコントローラのプッシュとポップ

```swift:
app.buttons["More Info"].tap()
XCTAssert(app.navigationBars["Volleyball?"].exists)
```


#参照

検証コードを使ってみる
http://qiita.com/yhonda/items/bf759d4694b63b250948
XCTestのUI
http://qiita.com/IsaoTakahashi/items/f9c3ef367d7e0f60e2d6
http://qiita.com/taji-taji/items/c00e5b94376c37f17443
http://amarron.blog/detail.php?id=20170701
http://qiita.com/s-harada/items/5a8c12b0c456d155ba53
http://qiita.com/okuderap/items/b6211cc3524ad2385150#_reference-bb433e1d0cbf1d664ec6
アプリを削除
...やりたかったけどハマってる。
http://qiita.com/bbq-all-stars/items/be63ecddea15ec7453cc
公式
https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/04-writing_tests.html
チートシート
https://github.com/joemasilotti/UI-Testing-Cheat-Sheet#typing-text