iOS Test Night #3

第3回 **iOS Test Night**に参加してきました。
この記事は主に**iOS Test Night**の発表についてのまとめになります。
connpassページ: https://testnight.connpass.com/event/49561/

## iOS Test Night
### 概要
>
本イベントはiOSにおけるテスト周りに関する知識を共有することを目的としたものです。
>
テスト周りに関するものであれば何でもOKです。 例をあげるとすれば以下のようなものなどです。
>
- テストをはじめてみた＆ここで苦労した
- このテスティングフレームワークはここがハマりどころ
- テスティングフレームワークをこうやって使い分けている
- こうやって工夫してテストしている
- オレが考えるiOSアプリにおけるテスタビリティの高い設計
- 弊社のCI/CD環境はこんな感じにしている
- try!Swiftの話を聞いてテストをはじめてみた
>
上記のような内容について「話したいことがある！」「聞いてみたい！」という方は是非参加してください。


## 発表
ここからは**iOS Test Night**での発表内容です
発表には時間で15分枠と5分枠の発表2種類に分かれています

## 15分枠
### ktanaka117：「初めてのQuickで初めてのテスト」
<iframe src="//www.slideshare.net/slideshow/embed_code/key/vUVHSK8Dspk2SZ" width="190" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/kenjitanaka58/quick-73091100" title="初めてのQuickで初めてのテスト" target="_blank">初めてのQuickで初めてのテスト</a> </strong> from <strong><a target="_blank" href="//www.slideshare.net/kenjitanaka58">Kenji Tanaka</a></strong> </div>


**Quick/Nimble**の使い方・概要、Specの基本的な書き方の発表となります。
この発表ではRealmに保存した内容のテストを例に進んでいきます。
Realmの機能を利用したテストをするためのノウハウも共有されていました。
実際にテストを書いてみて思ったことが書かれており、これからテストを始める方には参考となるでしょう。


### Nonchalant：「ViewController ⇄ Presenter by RxSwift」
https://speakerdeck.com/nonchalant/viewcontroller-state-by-rxswift

ViewControllerとPresenterという二つの役割を定義して
その間のEvent, StateのやりとりをRxで表現した場合のテスト方法について書かれています。
Rxを用いた場合のテストの問題点・難しさを挙げ、
それを解決するライブラリ**RxTest**についての紹介・使い方を提示しています。

### Kuniwak：「開発を効率化するテストのデザインパターン」
https://speakerdeck.com/orgachem/kai-fa-woxiao-lu-hua-surutesutofalsedezainpatan

様々な場合のプロダクトを保護する手段・考え方についての発表でした。
テストコードの書き方はもちろん、テストコードではない領域に置いても
どうすればより安全にできるか、といった課題についてあらゆる角度から解決策のアプローチを紹介しています。

さらにiOSでデフォルトで使われるXCTestについてのログを超絶便利見やすくするツールを開発したことを発表。スター等をすることで今後の開発意欲にもきっと繋がるでしょう。
[MirrorDiffKit](https://github.com/Kuniwak/MirrorDiffKit)

最後にこの盛りだくさんな発表内容の参考になった素晴らしい書籍も共有されています。
[xUnit Test Patterns](https://www.amazon.co.jp/xUnit-Test-Patterns-Refactoring-Addison-Wesley/dp/0131495054)

### shingo_tamaki_948：「What is FBSimulatorControl」
シミュレータ機能をCLIから便利に使うツール。
**FBSimulatorControl**についての紹介でした。
FBSimulatorControlはFacebookが公開しているライブラリです。
https://github.com/facebook/FBSimulatorControl

また、simctlについても触れておりsimctl・FBSimulatorControlの機能の差がまとまっています。
simctlについては発表者である shingo_tamaki_948 さんがQiitaにわかりやすくまとめてくれた記事があります。

[simctlコマンドを使ってみる - Qiita](http://qiita.com/tamaki/items/02eb43253193b950b08f)

FBSimulatorControlについてのデモが最後ある予定だったのですが
残念ながら間に合わず、しかし、複数シミュレータを起動して今後チャレンジしたいことについて発言していたので成果に期待です。

## 5分枠
### とし：「Bluepillを使ったiOS自動テストの並列化！」
今回の司会でもあったある**とし**さんの発表です。
iOSの自動テストのつらみ・苦労の解決策の一つとしてBluepillを使ったお話
Bluepill: https://github.com/linkedin/bluepill

shingo_tamaki_948さんの発表で紹介されていたFBSimulatorControlをインスパイアしたライブラリです。
複数シミュレータ起動ができ、iOSシミュレータの許容リトライ数、タイムアウト、ヘッドレスまでも設定可能であるこが特徴です。

主にテストの実行時間について複数端末で起動して行うことで時間が短縮できる、
主にテストケースが多い場合のテストの実行時間を課題として
複数端末の起動から並列でテストを行うことで時間が短縮できるといった解決策についてお話ししていました。


### 佐藤剛士：「5分でわかる! AWS Device Farmでテストしよう！」
https://speakerdeck.com/satotakeshi/5fen-dewakaru-aws-device-farmdetesutosiyou

**AWS Device Farm**を用いたテストの方法についての発表です。
AWS Device Farm: https://aws.amazon.com/jp/device-farm/

- 端末用意が大変
- 増大するテスト工数

この問題を解決する手段としてAWS Device Farmを使用しています。

XCUITestを書いて、AWS Device Farmを用いて実際に自動テストするまでがわかりやすくまとまっています。

### takasek ：「テストを書かない言い訳をさせてくれ」
https://speakerdeck.com/takasek/tesutowoshu-kanaiyan-iyi-wosasetekure

こちらはiOSのテストを書く上での問題・わずらわしさについて解説した発表になります。

- [レガシーコード改善コード](https://www.amazon.co.jp/%E3%83%AC%E3%82%AC%E3%82%B7%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E6%94%B9%E5%96%84%E3%82%AC%E3%82%A4%E3%83%89-Object-Oriented-SELECTION-%E3%83%9E%E3%82%A4%E3%82%B1%E3%83%AB%E3%83%BBC%E3%83%BB%E3%83%95%E3%82%A7%E3%82%B6%E3%83%BC%E3%82%BA/dp/4798116831)に記載されていたエッセンスの紹介
- テストコードとプロダクトコードのあり方
- そもそもテストで動作保障しなければならないコードを書くべきではない

といった考え方を述べ、もっとより良いテストを書くためには、
といったことを考えさせてくれる発表でした。

### star__hoshi ：「Pull Request とテストカバレッジの連携」
https://speakerdeck.com/starhoshi/ios-kai-fa-defalse-pull-request-to-tesutokabaretuzifalselian-xi

こちらはテストを継続的に書き続けるためにできることといったことについてフォーカスした発表内容になります。

- [fastlane#scan](https://github.com/fastlane/fastlane/tree/master/scan)
- [fastlane#action](https://docs.fastlane.tools/actions/)
- [danger-xcov](https://github.com/danger/danger)

をCI ServerでPRごとに
カバレッジの可視化、またマージに必要な最低カバレッジのパーセンテージを設定することで
継続的にカバレッジを上げるためのノウハウが共有された発表でした。