iOSエンジニアの小菅です。

2018/03/26(月)に行われたiOS Test Night #7に登壇してきたので、スライドを紹介しつつまとめ記事を書きました。

公の勉強会での登壇は久しぶりで、しかも80人以上の方が参加されていたのでとても緊張しました。

当日はYoutubeのリアルタイム配信も行われていたらしく(当日知った)賑やかで楽しい会でした!

自分は5分のLT枠で発表させて頂きました。

他の登壇者の発表タイトルを見て、テストのテクニックやらTDDやらがある中で初心者向けのネタで大丈夫かなと不安にもなりましたが、問題なかったです。

みんな優しかったです。

発表内容

Speaker Deckにあげさせて頂きました。

当日話した内容にプラスして、懇親会で受けた質問にも答えられればと思います。

screenshot

タイトルに関してですが、最初は「初めて書いたテストの話」にしようと思っていたのですが、社内の人に

「タイトルに数字を入れるとインパクト強いよ」

と教わったので、強引に数字を入れてみました。

Twitterでも何名かの方が反応してくれていたので、一安心。

話した内容の概要

screenshot2

上記のようにテストのテクニック的な話は一切しませんでした。

ただ始めたきっかけやよかったことなど共有できればなと思ったので、こういう発表内容にしました。

なぜ今までテストを書いて来なかったか

screenshot3

弊社は基本1人1アプリで開発します。

またソースコードの寿命が短いこともあり、テストコードを書くよりアプリケーションのコードを書きなぐって動作テストをするだけという場面が非常に多いです。

またサービスもCrashlyticsでのクラッシュフリー率を担保できて入れば大丈夫と自分は思っていたのでテストに対して消極的でした。

自分が主に対応しているマンガZEROはクラッシュフリー率99.9%です。

そんなこんなで今までアプリをいくつも作ってきましたが1回も書かないままでした。

なぜテストを書くようになったのか

screenshot4

業務委託の方との複数人開発を初めて経験したというのが大きなきっかけになりました。

業務委託の方はしっかりテストを書く人だったので、じゃあ自分もという流れで書き始めました。

screenshot5

また新しいアプリはSwift4Codableを使っての開発に挑戦したかった思惑がありました。

初めてCodableを使ってAPIからのJSONのデコード処理に挑む際に、確認しないでmergeしてもらうのはあまりにもキツいため、テストを書いてデコードできることを証明してからPull Requestを作成するようにしました。

テストを書くことによって得られたもの

screenshot6

一番大きかったのはdynamic frameworkの動作確認環境を得られたことでした。

自分は他のアプリでもdynamic frameworkを作成する際のテストをAppDelegate.swiftに記述していたのですが、今回はそれが出来ない(むしろあり得ない)状況だったので、Unit Testを作成して動作確認が出来ました。

あとは自分が作ったクラスを業務委託の方に使ってもらう際の仕様書代わりにもなりました。

テストを描き始める際に必要なもの

screenshot7

とりあえず上記の情報はググればすぐ出てきました。

確認したかったのもJSONDecoder().decode(_:, from:)の内容だったので全く苦労しませんでした。

screenshot8

むしろこっちがすごく大事だと思っています。

テストについて同じ目線を持っている人や相談出来る人。

今回は業務委託の方に甘えまくってやらせて頂いた結果、色々テストについて興味を持って書くことが出来ました。

Twitterでもここで共感を得てくれる方々が沢山いらっしゃいました。

また懇親会で、1人なんです…と仰っていた方もいらっしゃいました。

まとめ

screenshot9

という流れで5分ちょい過ぎたくらいの発表になりました。

自分自身も「まずは小さく始めてみる」ことの大事さに改めて気がつけたかと思います。

以上が発表の内容のまとめになります。

あとは懇親会でもらった質問をコード交えて回答したいと思います。

懇親会で頂いた質問

口頭で答えられたものは割愛させて頂いて、数字の部分とか紹介出来ればなと思います。

Q 他にどんなテスト書きましたか?

これに関してはCodabledecode処理の他に、暗号化の処理やAuth周りの処理を記述しました。

暗号化に関しては使用するたびに苦しめられているのですが、言語間によってデフォルトの値が違ったりするので早めにテスト書いて解決すべきだと思い、記述しました。

Auth周りに関してはネットワークの処理があるので十分なテストとは行かないまでも、想定する範囲での動きは書けたかと思っています。

例えば、ある値がない場合はこういう順番でAPI叩いて保存してや、ある値があるときはこういう順番でAPI叩いてなど頭で思い描いた通りに記述しました。

Q 現状どれくらいテスト書いていますか?

まだマンガZEROに関してはほとんど書けていません。

今メジャーアップデート作業の真っ只中で新しい機能に対してはテストを書いています。

github.com/AlDanial/cloc v 1.76  T=1.35 s (1061.5 files/s, 113606.4 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Swift                         1246          19608          14712          69545
C/C++ Header                   180           6084          13488          28199
Objective C                     10            333            252           1470
-------------------------------------------------------------------------------
SUM:                          1436          26025          28452          99214
-------------------------------------------------------------------------------

こんな感じのファイルとソースコード量に対して

github.com/AlDanial/cloc v 1.76  T=1.03 s (17.5 files/s, 1645.8 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Swift                           18            144            157           1389
-------------------------------------------------------------------------------
SUM:                            18            144            157           1389
-------------------------------------------------------------------------------

こんな量しか書けていません…。

Q UITestは書いていますか?

まだ手をつけられていません。

ただ同じiOSエンジニアの方がUI Testsに関して色々調べていて共有は頂いているので意味合い取れた時に書こうかと思っています。

終わりに

以上、登壇内容のまとめを書きました。

勉強会で登壇したら、発表内容を記事にするまでが勉強会。

ということで、これからも他の勉強会で登壇していければと思います!

以上になります。