テストに関する疑心暗鬼

疑い始めたらキリがないという話です。ぐだぐだです。

固定した値でのテスト

例えば、FizzBuzzのテストをするとしよう。fizzBuzzを返すことをテストするときは、Objective-Cだと下記のように書く

- (void)testFizzBuzz15 {
    NSString *result = FizzBuzz.mapping(15);
    XCTAssertEqualObjects(result, @"fizzbuzz", @"");
}

単純に値に対して適切な文字列を返す関数に15を入れてAssertで正しい値が帰ってきているかをテストしている。

15だけで不安はない?

15だけがうまく言って他の15の倍数は動かないかもしれません(まともなエンジニアならそうでは無いと思いますが)。せいぜい30をしておけばいいでしょう。より複雑なメソッドは不安になるかもしれません。どのくらいやれば不安じゃなくなるでしょうか?ループで100回行えばいいでしょう?テストを動かすたびに?毎回?

ランダムに値を決める

QuickCheckを使えばランダムに値を生成され、テストを行うことが出来ます。毎回違う値でテストが行えます。これで安心できるかどうかは別として15だけ通るテストでは無いはずです。

ところでランダムのテストってどうやるの?

ランダムな値を使ってテストをしていますが、実際その値ってランダムなの?どうやって均等に分散されていることを確かめるのか?せめて概ねそれらしい確率で出てきていることを確かめたい。例えば下記のリンクのようなやり方があります。

ランダムに振る舞う機能を JUnit する #渋谷Java 第3回

ここでは統計的な手法を用いることによって解決しています。非常にステキだと思います。

まとめ

まとまらない