[イベントレポート] iOS Test Night #6 – 1周年 – に参加してきました! #ios_test_night

はじめに

おばんです、休憩時間に会社の畳スペースで昼寝をしていたら、気づかぬうちに寝言を言っていたらしい田中です。恥ずかしい。

さて、本題です。今日はiOSのテストにまつわる勉強会である iOS Test Night #6 に参加してきましたので、そのレポートをお届けします。祝!開催一周年!🎉

iOS Test Night とは

本イベントはiOSにおけるテスト周りに関する知識を共有することを目的としたものです。

テスト周りに関するものであれば何でもOKです。 例をあげるとすれば以下のようなものなどです。

・ テストをはじめてみた&ここで苦労した
・ このテスティングフレームワークはここがハマりどころ
・ テスティングフレームワークをこうやって使い分けている
・ こうやって工夫してテストしている
・ オレが考えるiOSアプリにおけるテスタビリティの高い設計
・ 弊社のCI/CD環境はこんな感じにしている
・ Xcode9で変わったところを熱く語りたい

上記のような内容について「話したいことがある!」「聞いてみたい!」という方は是非参加してください。

今までのiOS Test Nightの資料についてはこちらを参考にしてください。

(Connpassより引用)

祝一周年!🎉

主催のとしさんからご挨拶がありました。

としさん「Qiitaでテスト周りのキーワードで調べてみるとXCTest, XCUITest, Earlgrayまわりの記事数が全然増えていない!まだまだiOS Test Nightの役割を果たせていません!iOS Test Nightはこれからも続けていきます!」

「Appiumで行う対話的テスト」 tamakiさん

  • テストピラミッド
    • UI / Service / Unitの3層でテストを区分したもの
    • このピラミッドは下の層であるほど費用対効果が高くなる
  • UIテストについて
    • E2Eテスト
      • システムが一気通貫で正常に動作しているか確認するテスト
        • スモークテストとは
          • サービスのクリティカルなパスが正常に動作することを確認するテストのこと
          • システムが「普通に動く」ことを担保するためのテスト
  • iOSのUIテスト
    • Xcode UI Test(XCUITest)
      • XCUITestの良いところは、プロダクトと同じ言語でテストを記述することができること
  • Xcode 9の新機能
    • Simulatorの多重起動
      • これによって並列にテストを複数走らせることができる
  • 対話的テストとは
    • 例えば異なるデバイス、異なるアプリが連携して成り立つアプリ
    • Simulatorが多重起動できるようになったので、Simulator AとSimulator Bにそれぞれアプリを入れて、対話的にテストを行うことができるのではないかと思いついた
  • Appiumとは
    • マルチプラットフォームに対応したUIテストのフレームワーク
    • 様々な言語とフレームワークに対応しているのが良いところ
    • ちなみにSwiftでは書けない

「Quick / Nimble をより快適に使うために」 Yusuke Hosonumaさん

  • Quickとは
    • BDDフレームワーク
    • BDDはTDDから派生した
    • 階層構造で記述できることがメリット
  • Nimbleとは
    • Matcher
    • Matherとは?
      • Assertionライブラリ
      • 自然な英文でテストの意図がわかりやすく書くことができる
      • エラーメッセージがわかりやすいこともメリットの一つ
  • Quick / Nimbleのデメリット
    • 学習コストが高い
      • 事前にBDDフレームに慣れていないと機能が多くてわかりづらい
    • IDEの補完が効きにくい
      • expect... / to... みたいな単語で出てきた補完はわかりづらいし、他のものを指していたりすることが多い
      • 静的型付けであるSwiftの強みは補完が強いことだが、意図したものが出てこないのでは意味がない
    • 一覧を確認しづらい
      • spec() しかメソッドがないので一覧で見づらい
  • 解決策を考えた
    • ラッパーを書いてみた
    • よく使う describe, context, it, expect, to などの単語を xx, yy, zz などの接頭辞をつけてスニペット管理することで解決された

「fastlane snapshotの並列実行についてまとめた」 としさん

  • snapshotとは
    • 指定端末のスクリーンショットを取得することができる機能
    • ローカライズのテストなどに使う
  • 課題
    • 時間がかかった
  • 従来の解決策
    • 札束で殴る
    • 実行環境を複数台用意して、テストを並列実行した
  • Xcode 9からの解決策
    • シミュレータのテストの並列実行が出来るようになったよ!
  • テストの並列化
    • 起動数は実行するマシンの性能に依存する
  • おわりに
    • snapshotでテストの並列化が「すごく簡単」にできるようになりましたので、試してみてください!

「assertionを積極的に使ってバグ発見に役立った事例」 kboyさん

  • 筋肉と書いてAssertionと読む
  • Assertionとは、わざとクラッシュさせることと思っている
  • Assertionする目的
    • リニューアルしている実装の漏れを防ぎたい
    • 落ちそうだなと不安になったところに念のため書いた
    • 未来のエンジニアにとってわかりやすくするため

「iOSシミュレータでの
UIテストの様子を録画してみよう」 Kesinさん

  • テスト時にスクリーンショットを取得する仕組みがあった
    • テストが落ちた時のスクリーンショットを見てもよくわからないという問題があった
  • 解決するために録画することを考えた
    • QuickTime🙅
    • recordVideo コマンド🙆
      • シェルスクリプトを書いて実行してみた

「Mocking With Firebase」 d_dateさん

  • DataBaseが関わる部分のテストはしづらい
  • Realtime Database
    • NoSQL
    • JSON構造をもつデータを格納
    • NoSQLでは非正規化するのが原則
  • 取得したjsonを意図した型に変換できるか確認する

「プロジェクトの1ファイルにテストを書いてみた! 〜本当にこれで合ってるの…??〜 Takasyさん

  • 「わからないところを質問していくので、ハッシュタグ #ios_test_night をつけて質問に答えてください!お願いします!」

「何故テストが書けないのか(仮)」 fromkkさん

  • Sarahahで個人アプリにテストを書いているか質問がきた
  • テスト0だった
  • テストが書けない雰囲気
    • ViewControllerにガツガツ処理を書いたりしていた
    • いわゆる節子(= FatViewController)
  • テストを書くために設計を見直した

懇親会

懇親会の料理は安定のお寿司とカツサンドでした!(写真忘れました)

そしてこの懇親会中に素晴らしいと思ったことがありました。以前のiOS Test Nightにも登壇されたことのある @orga_chem さんが、LTで質問を投げまくっていた Takasyさんの疑問にライブコーディングで答えまくっていたことでした!

ライブコーディングをしながら、DI、Stub、Mock、Spyについて説明されていました。Takasyさんの他にもコーディングを見に人が集まって、説明を聞いたり、さらにそこから派生した質問が飛び交っていたりしました。これすごく楽しかったです!

自分もSpyについて以下のことがわかってよかったです!

  • 戻り値のない関数の処理が行われているかどうか確かめる
  • 複雑な条件、複雑な関数の最後の部分でSpyを呼び出す
  • 非同期処理でコールバックがちゃんと呼ばれているかを確かめる
  • delegateメソッドが呼ばれているかを確かめる

この時書かれたコードは以下に@orga_chemさんのgistとして上がっています。

さいごに

iOS Test Nightさん一周年おめでとうございます! 第一回から参加させていただいていて、何度か発表もさせていただきましたが、自分がテストを書き始めたきっかけがまさにiOS Test Nightでした。

もともとiOS界隈にテストの知見があまり見受けられなかった(自分の範疇に見えていなかった)状況の中、こういう会が開かれることによってみんながどうやっているのか見られるようになりました。毎回100名以上の参加がありますし、自分の実体験として確実にテストの輪が広がっているのを感じます。

これからも続けての開催をどうぞよろしくお願いします!