【Swift×テスト自動実行】0からGithub Actions を使ってiOSアプリのテストコードを自動実行

# 目的
GithubにPush(※1)したタイミングでのテストコード自動実行を行可能にする
※1 : 対象のPush先は`mainブランチ`とします


## 対象としている人
- ローカルのプロジェクトで`Swift`を使い`iOSアプリ`のテストコードを書いたことある人
- テストを手動ではなく、`自動で実行`するためにはどうするのかな と思ってる人
- Github Actions に興味あるけど触ったことない人


## 前提
- XCodeでプロジェクトを作成している
    - プロジェクト名を `UnitTestApp01` としておくと、本記事との整合性がとれます！
- XCodeで作成したプロジェクトを`GithubのリポジトリへPush`している
- Swiftの構文をある程度理解している
    - `class`, `func`, `return`, `let`, `var` をいつ使うか理解できていればOKです
- Git・Githubの操作をある程度理解している
    - `ローカルリポジトリ`, `リモートリポジトリ`, `Add`, `Commit`, `Commit` を理解できていればOKです


## 手順

① : テストコード作成 (←コードあり。コピペでOK)
② : Github Actions の設定
③ : 自動実行用の`ymlファイル`作成
④ : 実行確認！


## ① : テストコード作成 (←コードあり。コピペでOK)

※ XCodeにてプロジェクトを作成している前提で話を進めます！

テストコードを書くためには`テスト対象のプログラム` と `UnitTestsファイル`が必要です。順番に作成していきます。


### テスト対象のプログラム

今回は`足し算を行う`だけのプログラムを、テスト対象とします。
そのため、新しくSwiftファイル※2を作成して、以下のコードをコピペしましょう。
※2 : ファイル名 例:CalculationNumber.swift

<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/00463825-8dea-506e-c436-22a730a97af2.png">

<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/1c8cd62c-c76c-5a98-f915-03bfafbbe4ba.png">

<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/a5760eb1-72da-4d44-24dd-4da6069e70b3.png">

```CalculationNumber.swift
import Foundation

class CalculationNumber {
    // テスト対象の関数
    func Add(a: Int, b: Int) -> Int {
        return a + b
    }
}
```



### UnitTestファイルの作成

XCodeで新プロジェクトを作成した段階で(設定次第では)、UnitTestのファイルが`自動で作成されているはず`です。
しかし、今回は、タイトルに0からと書いてある通り、UnitTestのファイル※3も0から作成していきます！

※3 : 例:CalculationNumberTests

<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/dee5c0a5-8310-2d0a-a75f-55389ac549c6.png">

<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/d71c7536-ca66-4050-f43b-3ec8db2f89eb.png">

<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/236d3ee1-1908-8f76-dea5-2d2646534b6e.png">

<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/50268775-bcb6-239a-f736-e4e7c8fc586b.png">

`@testable import`でテストするモジュールを指定する。
今回は、テスト対象のモジュールを、`作成したプロジェクト名`とする。(例: UnitTestApp01)

```UnitTests.swift
import XCTest
@testable import UnitTestApp01   // テスト対象のモジュールを指定, 今回は作成したプロジェクト名

final class CalculationNumberTests: XCTestCase {
    func test_足し算_成功() {
        let calculationNumber = CalculationNumber()   // 足し算を行うためにインスタンス化
        let answer = calculationNumber.Add(a: 10, b: 20)   // 足し算, answer = 30
        XCTAssertEqual(answer, 30)   // answer と 30 が等しいかテスト
    }
}
```

`func test_足し算_成功() {` の左にある`◇`マークを押しましょう。
テストが実行されます。

以下のように`◇`マークが、緑色になればテストに成功した証拠です。

<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/9e053508-8488-6c2b-176b-db844ee2b77a.png">


## ③ : 自動実行用の`ymlファイル`作成

**ターミナルにて`cd`コマンドを使い、作成したプロジェクトのディレクトに入りましょう。**
```例.sh
cd /Users/~~~/Desktop/~~~UnitTestApp01
```

**ディレクトリ内に`.github`という隠しフォルダが`ない`ことを確認**
```例.sh
ls -al
```

**.githubがない場合は以下のコマンドを打ち、Github Actions でのテスト自動実行用の`.ymlファイル`を作成し、.ymlファイルを開きましょう**
※ .ymlファイルのディレクトリ構造 `UnitTestApp01 > .github > workflow > UnitTests.yml`
※ .ymlファイルのファイル名は任意

```例.sh
mkdir .github
cd .github
mkdir workflows
cd workflows
touch UnitTests.yml
open UnitTests.yml
```

**.ymlファイルが開かれたら以下のコードをコピペします。**

```UnitTests.yml

name: UnitTests

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: macOS-latest

    steps:
      - uses: actions/checkout@v2

      - uses: maxim-lobanov/setup-xcode@v1
        with:
          xcode-version: '14.1.0'

      - name: UnitTests
        run: xcodebuild test -project UnitTestApp01.xcodeproj -scheme UnitTestApp01 -sdk iphonesimulator -destination platform='iOS Simulator,name=iPhone 12,OS=16.1'

```

`2023/03/04 土 時点`
`.ymlファイルで使用している構文についての説明は、追記予定`


## ④ : 実行確認！

※ Git・Githubの操作をある程度理解していることを前提として話を進めます

変更点を `add`,`commit`して、Githubのリモートリポジトリへ`push`しましょう！

Pushして、Githubの`Actionタブ`を押すと、Github Actions　を使ったテストコードの自動実行が行われていることを確認できます！！！

<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/2e8dad9b-e7f2-bc8d-40f5-6bec42bc167b.png">

画面左の`build`ボタンを押すと自動実行している項目のログを確認できます。
項目は、③ でymlファイルへ書いたものが反映されています。

<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/6a362274-20aa-3e52-0ad0-55e596c3c770.png">



テストに成功した場合、以下のように緑色がつきます！

<img width = 80% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/76be757f-777b-f3e9-f866-4351863445fd.png">


#### 以上です！ 良いテストライフを


## 参考サイト

https://github.com/hamadayuuki/practice-iOS-test/tree/main/Unit/UnitTestApp01

https://github.com/hamadayuuki/practice-iOS-test/actions