SwiftでParameterized Test を書く
最近 iOS 向けのライブラリを Swift で書いています。
ライブラリの試験コードももちろん Swift で書いているのですが、JUnit などで使える Parameterized Test (または Data Driven Test ) を行う方法が標準で XCTest の環境には無いことに気づきました。
さすがに手元でどうにかしたかったのでいろいろ試し、一応形にしたので貼っておきます。
Parameterized Test とは
一言でいうと、ある試験を入力データをいろいろ変えて試験を行うものです。
入力データごとに試験コードを書くのは大変なので、試験する関数とデータセットを別に定義して試験をおこなうものです。
下記の例が JUnit ですがわかりやすいかと思います。
この例ではフィボナッチ数列の n と期待値 an をデータセットとしてあたえて試験してる感じですね。
JUnit だとこんな感じの良い記述方法があるんですが、Swift のテスト環境 XCTest には同じようなものが見つからないんですよねー。困った
XCTest で Parameterized Test っぽいものをするコード
というわけで、Swift の XCTest でどうにか Parameterized Test っぽいことをするコードを書いてみました。
Gist にあげたので引用します。
こちらも参考にどうぞ
動作原理ですが、XCTestCase クラスがテスト実行にデフォルトのテストセットとして defaultTestSuite
プロパティを参照するので、このプロパティをオーバーライドして defaultTestSuite
が参照された際に本来のテスト * データセット分試験を自動生成するというものです。
この処理を ParameterizedTest
クラスの defaultTestSuite
として定義し、Parameterized Test を行いたい試験に関してはこのクラスを継承して独自のテストデータ型と試験コードを定義するという感じの使い方です。
Generics を使ったりしたらもう少し簡単にかけるかと思ったのですが、
- NSInvocation が Swift からは参照できない
- Generics を使ったクラスは XCTest にテストクラスとして認識されない
といった制約があり、サンプルコードの方も少しややこしい処理を入れないといけなくなってしまいました。無念。
さいごに
どうにかできる範囲でやってみたという感じですが、正直制約もあるし、書き方もスマートじゃないので、公式にサポートしてほしいところです。
または、もっと良い方法あれば教えてくださいです。
最後まで読んでいただきありがとうございます。 このブログを「いいな」と感じていただけましたら、Twiter にてフォローいただけるとうれしいです。ブログ更新情報などもお届けします。
Follow @ryuta461
この記事をシェアする