EarlGreyのコード解説


# メソッドについて  
EarlGreyには要素に対して働きかける三種類のメソッドがあります。


#### `action`
要素に何かしらの動作を施します。

#### `assert`
要素が思った通りになっているかの確認に用います

#### `matcher`
操作したい要素を探すときに使います

以上の三つのメソッドを使うことによって、簡単にUITestコードを実装することができます。

では、実際に書いて見ましょう。

## アプリの動作テスト

例えば、ボタンを押すとラベルが表示される簡単なコードを書いたとします。

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

  @IBOutlet weak var resultLabel: UILabel!
  @IBOutlet weak var button: UIButton!
  
  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    
    resultLabel.isHidden = true
    resultLabel.accessibilityIdentifier = "resultLabel"

    button.isSelected = false
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  }
  @IBAction func didPushButtoon(_ sender: Any) {
    
    resultLabel.isHidden = false
    button.isSelected = true
  }
}
```

では次に、ボタンを押してラベルが表示されているかのテストコードを書きます。

```swift:TestViewController.swift
import XCTest
import EarlGrey

@testable import QiitaPresents

class QiitaPresentsTests: XCTestCase {
    
    override func setUp() {
        super.setUp()
        // Put setup code here. This method is called before the invocation of each test method in the class.
      
      let success = GREYCondition(name: "setup") { () -> Bool in
        var error: NSError? = nil
        
        EarlGrey.select(elementWithMatcher: grey_kindOfClass(UIViewController.self))
          .atIndex(0)
          .assert(grey_sufficientlyVisible(), error: &error)
        
        return error != nil
      }.wait(withTimeout: 15)
      GREYAssertTrue(success, reason: "failed setup")
    }
    
    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }
    
    func testExample() {
        // This is an example of a functional test case.
        // Use XCTAssert and related functions to verify your tests produce the correct results.
      
      EarlGrey.select(elementWithMatcher: grey_kindOfClass(UIButton.self)).perform(grey_tap())
      
      EarlGrey.select(elementWithMatcher: grey_kindOfClass(UIButton.self)).assert(grey_selected())
      
      EarlGrey.select(elementWithMatcher: grey_accessibilityID("resultLabel")).assert(grey_sufficientlyVisible())
    }
}
```

# 一体何をやっているのか

主に`testExamples`でテストを行っています。
その内容を解説していきます

---

#### 解説1

```swift
EarlGrey.select(elementWithMatcher: grey_kindOfClass(UIButton.self)).perform(grey_tap())
```

このコード処理内容は画面上にある`UIButton`を選択し、タップさせる処理です。
では各メソッドについて細かく補足します。

`EarlGrey.select(elementWithMatcher: Matcher)`は操作したい要素を選択するときに使います。

そのselectの引数に入っている`grey_kindOfClass()`は引数に入っているクラスを元に対象を割り出す際に使います。

selectの中にはmatcherが入り、`.perform("Action")`は要素にタップ操作やダブルタップ等の操作処理をしたいときに使うものだと覚えておけば良いと思います。

---

###  解説2

```swift
EarlGrey.select(elementWithMatcher: grey_kindOfClass(UIButton.self)).assert(grey_selected())
```

これは、画面上にあるボタンの`isSelected`プロパティが`true`になっているか確認しています。

`.assert(Matcher or Asserts)`は要素に対して何か確認したいときに使ったりします。

---

### 解説3

```swift
EarlGrey.select(elementWithMatcher: grey_accessibilityID("resultLabel")).assert(grey_sufficientlyVisible())
```

このコードは、accessibilityIDが設定されているラベルを選択し、ちゃんと表示されているかを`grey_sufficientlyVisible()`で確認しています。

画面上にUILabelの要素が複数ある場合にmultipleエラー(`Matcher`の該当要素が複数ある場合のエラー)を吐かれますので、個別に要素を選択出来るようにUILabelに`accessibilityIdentifier`を割り当てています。

```swift
resultLabel.accessibilityIdentifier = "好きな名前"
```

---

以上で超簡単なテストコードが書けると思います。

もし間違いなどがあれば、ご指摘いただけたら幸いです。


#おまけ
#### Matcherの`grey_sufficientlyVisible()`について
画面内に収まっていて、表示されているかを確認するassertメソッドです。
ただ、画面内に収まりきらない要素はたとえ表示されていても、「確認ができない」とUITest実行時にエラーを吐かれますので、使う際には十分に注意してください。