※社内共有向けにざつーに書いたので、限定共有投稿とします。予告なーく削除したり変更したりします。
はじめに
勉強会で最近知ったテスト手法を紹介します。
Swiftの記事を中心に載せますが、KotlinやJavaでも適用できるものが多いです。
パラメタライズドテスト
予めテストデータ(パラメータ)を列挙するテスト手法。
Go言語では「テーブル駆動テスト」と言われ、一般的に使われている。
JUnit5でも標準でサポートされている。
(iOSの場合)サポートされていないので、スライドを参考に工夫する必要がある。
-
スライド
https://speakerdeck.com/yusukehosonuma/swift-parameterized-test -
ライブラリ
https://github.com/YusukeHosonuma/SwiftParamTest
まだ発展途上
メリット
- テストデータの追加や削除がしやすい
- 見通しがよくなる
これでメソッドの引数を変えただけのテストメソッドが増殖されることがなくなる。
積極的に取り入れていきたい!
スナップショットテスト
画面のスクリーンショットを撮り、予め用意した画像(リファレンス画像)と差異がないか確認するテスト手法。
主に以下をテストできる。
- 端末やOSごとの表示崩れ
- 表示状態の組み合わせ
- 異常系の表示
撮ったスクリーンショットをそのまま画面カタログとして使うこともできる。
(iOSの場合)XCUITestでなくXCTestで行えるのが強み。
-
スライド
https://speakerdeck.com/susieyy/snapshot-testing-in-ios -
ライブラリ
- iOSSnapshotTestCase
https://github.com/uber/ios-snapshot-test-case
FBが作成したが現在はUberが管理している - SnapshotTesting
https://github.com/pointfreeco/swift-snapshot-testing
後発のライブラリ。強力とのこと
- iOSSnapshotTestCase
UIテストをがっつり書いている場合は不要かな、、
構造上UIテストを書けなかったり、UIテストの実行時間やFlakyが気になったりする人向けという認識でいいかも。
Viewのテストをどう行うかについては↓のやりとりを追うといいかも。
ここまで丁寧にフィードバックいただけるのとてもありがたいです!どのテストが有効かはもちろん一般的なところもあるのですが、何をテストしたいかとどこまでテストしたいかで変わるのでケースバイケースなところがあるのかなと思っています(だから難しいとも思っている) https://t.co/kmMeOHGV2f
— kariad/かりあど (@kariad_uu) 2019年4月16日
プロパティベースドテスト
テスト対象メソッドの性質(プロパティ)をアサーションに定義し、パラメータをランダムに渡すテスト手法。
-
スライド
https://speakerdeck.com/yusukehosonuma/property-based-test-beginning-with-swiftcheck -
ライブラリ
https://github.com/typelift/SwiftCheck
HaskellのQuickCheckにインスパイアされている
正直まだよくわかっていない、、
これからスライドを読み直したり、SwiftCheckの公式ドキュメントを読んだりしようと思う。
おわりに
DeNAのSWETチームつおい。
そしてiOSテスト全書の発売が待ち切れない。