【iOS】Bitriseを導入してテストをBitrise上で行う

#はじめに
Bitriseの導入で手こずったので、備忘録です。

#環境
Xcode: 13.2.1
macOS: M1 Monterey 12.1 Beta
iOS: 15.0
CocoaPods: 1.10.2

#プロジェクト作成
プロジェクトネームはここではこんな感じでつけときます。
Include Testsにチェックをつけてテストファイルを追加します。

![ScreenShot 2022-01-03 15.54.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/df998317-3202-aa54-99a2-2dab07b26fd0.png)

#テストコードを書く
次のようなコードをBitrise_SampleTestsに書きます。

```swift
class Bitrise_SampleTests: XCTestCase {
    
    func testAdd() {
        var age = 21
        age += 1
        XCTAssertEqual(age, 22)
    }
...
}
```

`⌘+U`でテストが成功することを確認しましょう。

え？成功しない？
それな。
![ScreenShot 2022-01-03 16.07.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/f5ceca11-57a2-003c-cb6c-bdde9c15dac9.png)
![ScreenShot 2022-01-03 16.23.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/a93aa936-df91-cd84-2b76-29897ee14785.png)


僕の場合はUIテストのこの二つのメソッドが失敗します。今回の趣旨とは、ずれてしまうので、一旦ここはこれらのメソッドをコメントアウトして先に進むことにしよう。

テストが成功したら次に進みます。

#CocoaPodsでライブラリ管理
ライブラリ管理はやらなくてもBitriseを使えるのですが、ほとんどのプロジェクトでは何かしらのライブラリ管理をしていると思うので、今回も使います。
(というか、ライブラリを導入したときのBitrise上のエラーに苦戦したのでこの記事を書いてます。)

プロジェクトを閉じてCocoaPodsを使ってライブラリを管理します。
先ほど作ったプロジェクトのフォルダに移動します。
Podfileを以下のコマンドで作成します。

```
% pod init
```

以下のようにPodfileを編集しておきます。
今回は例としてRealmを使います。(他のでも大丈夫)

```
# Uncomment the next line to define a global platform for your project
platform :ios, '15.0'

target 'Bitrise-Sample' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for Bitrise-Sample

  pod 'RealmSwift'

  target 'Bitrise-SampleTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'Bitrise-SampleUITests' do
    # Pods for testing
  end

end
```

ライブラリをインストールします。

```
% pod install
```

以降はxcworkspaceを使います。

ViewControllerでRealmを読み込んでビルドしてエラーが出ないか確認しておきましょう。
![ScreenShot 2022-01-03 16.35.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/fc34bb92-cec3-c5cd-2dcf-03a673f9730b.png)


#Bitriseのセットアップ
まだBitriseアカウントをお持ちでない方は[こちら](https://www.bitrise.io/)からBitriseのアカウントを作成してください。

次のDashboradのこちらのAdd new appで先ほど作ったプロジェクトをBitriseと紐付けます。
WebUIを選択します。

![ScreenShot 2022-01-03 16.39.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/2046babc-a1d5-84e7-ebb7-18febf227e3c.png)

今回はPrivateにしておきます。

![ScreenShot 2022-01-03 16.40.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/c02cd750-f74f-f0a5-9709-13c61a3c71d8.png)

先ほど作ったプロジェクトのGitHubリポジトリを選択します。

![ScreenShot 2022-01-03 16.41.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/c4699fd4-c086-dd09-8396-cc39aa92ea02.png)

SSH keyを作成しておきましょう。

branchはmasterにしておきます。

![ScreenShot 2022-01-03 16.42.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/053193dd-d136-400b-5faa-d9e334d9b01e.png)

Configuration completeが終わったら次はProject build configurationの設定をします。

Distribution methodはdevelopmentにし、stackはmacOSと同じものにしてNext->Confirmとします。

![ScreenShot 2022-01-03 16.45.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/91493b7c-6a52-e322-31d5-851801450372.png)

App iconはSkip for Nowにしておきます。

![ScreenShot 2022-01-03 16.46.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/ac0a20ef-bad9-82b0-e3ae-d3f10ec3ea0b.png)

Webhook setupはRegisterの方にしておきましょう。

![ScreenShot 2022-01-03 16.46.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/776f5b4a-5258-6446-3440-5aafae424df6.png)

一番下のボタンを押したらビルドが走ります。少し待ちましょう。

しかし、失敗してしまいます。
理由は、Bitrise上でCocoaPodsをインストールできていないためです。

Workflow Editorに移動します。

![ScreenShot 2022-01-03 16.50.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/e2337837-d60a-bb73-8240-06c525a5b76d.png)

こちらのXcode Test for iOSのプラスボタンを押します。

![ScreenShot 2022-01-03 16.51.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/d9e4fc16-5715-3354-26d6-716a052c6add.png)

cocoapodsと検索するとRun CocoaPods installと出てくるので、こちらを選択します。

![ScreenShot 2022-01-03 16.53.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/0bd78e66-1bff-1ee2-3787-9f8585163335.png)

Workflowsに追加されました。上からこの順序でBitrise上で実行されるので、このWorkflowを追加する必要がありました。
(Carthageを使った場合はCarthageと検索して出てくるものをWorkflowsに追加してください)

![ScreenShot 2022-01-03 16.54.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/a3a7353b-94e2-4b5c-51e4-b3289a11c425.png)

`⌘+S`で保存します。

bitrise.ymlに移動します。

![ScreenShot 2022-01-03 16.56.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/6dff59ed-48cb-ea2e-3d57-24802e89589c.png)

BITRISE_PROJECT_PATHが<プロジェクト名>.xcodeprojになっている場合は、<プロジェクト名>.xcworkspaceにします。

![ScreenShot 2022-01-03 16.57.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/d4133d7a-dd64-951a-4fb4-8782d6a827ee.png)

これでセットアップは終わりです。

適当にコードを追加して差分を作ります。

![ScreenShot 2022-01-03 17.02.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/2d77de42-adeb-a037-7570-e74e6a36dc5e.png)

コミットしてプッシュしましょう。
プッシュするとそれがトリガーになってBitriseのWorkflowsが走ります。

Runningになっているのでこちらを選択してみてみましょう。

![ScreenShot 2022-01-03 17.04.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/a974df98-5b76-d73f-d00c-b770feb49fe1.png)

走っていますね。

![ScreenShot 2022-01-03 17.06.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/259431cc-de21-0341-12e2-6844e0fa1ba2.png)

Successしました。

![ScreenShot 2022-01-03 17.15.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/b73e5dea-bda9-775b-149e-92a00789f37d.png)

しかし、10分近く経ってしまいました。
これは見ての通りxcode-test@4がかなりの時間かかっているからで、特にUIテストに時間がかかっています。なので、次に単体テストのみ実行する方法を紹介します。

![ScreenShot 2022-01-03 17.15.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/a36edbd3-ffb2-f19c-6237-6bd782930e71.png)


#単体テストのみ実行する
UIテストは重たいので単体テストのみ実行したいこともあると思います。その手順も紹介します。

Edit Schemeを選択します。

![ScreenShot 2022-01-03 17.19.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/06d6bea6-64b7-f34a-b5bc-63c8dcd1fd6d.png)

Testを選択し、Bitrise-SampleUITestsのEnabledのチェックを外します。

![ScreenShot 2022-01-03 17.19.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/6b160817-b51f-b609-45ce-f2ebd9116198.png)

![ScreenShot 2022-01-03 17.33.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/d5311d9b-29c4-e049-4291-4d4187bfbf6a.png)

コミットしてプッシュします。

ちょっとだけ早くなりました。

![ScreenShot 2022-01-03 17.41.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/d35712e4-ffb4-a43a-06cf-6e83a75359eb.png)


#単体テストをあえて失敗させてみる
テストが通らない場合はどうなるのかも確認しておきましょう。

あえて失敗するコードを書いてみます。

![ScreenShot 2022-01-03 17.43.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/2da60283-962e-48b8-940a-356caecf5a23.png)

コミットしてプッシュします。

よかった、失敗してくれました。

![ScreenShot 2022-01-03 17.54.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954451/5e4ea524-351d-21cd-12c0-338a2dc76f2a.png)



#おわりに
Bitriseしか勝たん