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 を使ったりしたらもう少し簡単にかけるかと思ったのですが、

といった制約があり、サンプルコードの方も少しややこしい処理を入れないといけなくなってしまいました。無念。

さいごに

どうにかできる範囲でやってみたという感じですが、正直制約もあるし、書き方もスマートじゃないので、公式にサポートしてほしいところです。

または、もっと良い方法あれば教えてくださいです。


最後まで読んでいただきありがとうございます。 このブログを「いいな」と感じていただけましたら、Twiter にてフォローいただけるとうれしいです。ブログ更新情報などもお届けします。



この記事をシェアする




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA