entry-header-eye-catch.html
entry-title-container.html

entry-header-author-info.html
Article by

「iOS Test Night #9 二周年」でよく使うテストヘルパーを紹介しました #ios_test_night

おばんです、スマブラではリトルマック使いの田中です。対戦相手ウェルカムです。

さて、DeNA株式会社のSWET主催の、iOSのテストにフォーカスした勉強会であるiOS Test Nightが先日で2周年を迎えました。 今回はそこで登壇させていただいた内容について紹介します。非常にライトな話なので、仕事に疲れたら筆休めにでも読んでいってください。

TL;DR

  • そのテストの本質でないものは目立たせない、表立たせない
  • ライブラリは汎用化されたものなので、そのテストに適する形に書き換える
  • ヘルパーに対してもテストが必要であれば書く

やりたいことは事前準備じゃなくてテストなんだ...!

テストは事前準備が大事なのは確かなのですが、それに時間を取られすぎていると気持ちが萎えてしまいます。 それを助けるためによく使う、超簡単!明日から使えるヘルパーを紹介します。

JSONファイルからテストデータを取得するやつ

たとえばPresenterやViewModelのテストをするとき、依存しているDomain層のコンポーネントが返却する値をStubで設定することはよくあると思います。 私はテストで使うデータは、JSONファイルとしてテストターゲットに含めて、それを読み込んでオブジェクト化することをよくします。 そんな時に利用するのがこのスライドのプログラムです。

テストで知りたいのはどんな事前準備があるかだけなのに、ずいぶんとおおげさに行数を使ってくれます。

本来やりたいのは、これくらいの分量でStubとなるhogeを用意することのはずです。 まずは欲しいインターフェースから考えて、テストヘルパーを実装していきます。

難しいコードではありません。先ほどのもやっとするコードをほぼそのままクラスとしてまとめました。 違いとしてはジェネリクスを使ってDecodable準拠のオブジェクトを扱えるように一般化しているところです。

また、force tryやforce unwrapしているコードがみられますが、テストデータとして用意したものはまず存在するでしょう(nilになることはないでしょう)という考えで簡略化しています。 もっと丁寧にしたい人は、エラーハンドリングしてあげてください。

連続した通信で順番を担保しつつResponseを返すHTTP Stub

たとえば1つのメソッドの中で複数の通信が発生するようなもののテストをしたいこともあると思います。 アクセストークンのリフレッシュ、からのリトライ処理などがイメージつきやすいでしょうか。

このコードはOHHTTPStubsを用いてHTTP通信をStub化している例です。 やりたいことは通信が起こるたびに、事前に用意しておいたHTTP Responseを順番に返却させることです。 ここでの困りごとは、テストファンクションで気にすべきでない不必要なロジックが丸出しになっている点です。

やりたいことに対してはこのようなインターフェースがあれば十分です。 不必要な条件はなるべく見えるところに置きたくありません。

その実装がこちら。 JSONのヘルパーの例と同様に、テストファンクション側に書かれているものを切り出しています。 ここのこだわりポイントは、activateとdeactivateを対応づけて作っている点です。

まとめ: テストヘルパーを作る指針

ライブラリは汎用化されたものなので、読みやすいテストを書いていくためには最適化していくことをオススメします。

また、書いたヘルパーに対しても不安があればテストを書くことをオススメします。

さいごに

今回のコードはBOOTH iOSアプリで実際に利用しているコードです。 もっと具体的な内容を見たいとか、こんなちょっとしたテスト話も興味があるよってiOSエンジニアの方はぜひ気軽にお話しましょう。

あとスマブラの対戦者もお待ちしています。

20191219010506
danbo-tanaka
2018年6月に中途入社。M県S市杜王町出身のiOSエンジニア。主に百合と、BOOTHのiOSアプリを担当しています。 最近の個人的なホットトピックは設計・テスト・リファクタリング。