50個のリストによって関数が壊れ、リスト要素の1つのみに問題がある場合、StreamDataを使用することで問題のある要素を特定することができます。このテストライブラリは2つのメインモジュールを持っています。ランダムデータのストリームを生成します。生成されたデータを用いた関数のテスト実行を可能にします。入力値がわからないのに、関数のテストとして意味があるのか疑問に思うかもしれません。続きを読んでください!StreamDataのインストールまずは、新しいMixプロジェクトを作成します。記載されたバージョンに従って置き換えてください。deps.getStreamDataの使用StreamDataの機能を説明するために、値を繰り返す簡単なユーティリティ関数をいくつか作ります。ような関数を作ると仮定しましょう。文字列まずは、文字列を複製する関数を作りましょう。この関数にはどのような要件があるでしょうか?1つ目の引数は文字列である。これが複製対象とする文字列である。2つ目の引数は正の整数である。これは1つ目の引数を何回繰り返すかを表す。この新しい文字列は、単にオリジナルの文字列を0回以上繰り返す文字列である。簡単にテストすることができます。endendただし、これは包括的なテストではありません。巨大なサイズの文字列でも関数は動作するのでしょうか?エッジケースと巨大文字列の例を書くこともできますが、ここではStreamDataを使い、コードを増やすことなくこの関数をより厳密にテストできるかどうか見てみましょう。これによってテストしているプロパティをドキュメント化できます。テストで使用するデータのセットアップを可能にするマクロです。ランダムな文字列を生成します。モジュール名を省略できます。ランダムな整数を生成します。ガード句のようなもので、テストで生成するランダムな整数が0以上となることを保証します。関数で受け入れ可能としているので、私たちが欲しいものとは少し違います。単なる擬似コードです。times)...ですが、これは単に関数の実装を使用しているだけで、意味がありません。expected_lengthこれは無いよりはましですが、理想的ではありません。このテストは、関数がランダムな文字列を正しい長さで生成してもパスしてしまいます。#1を検証するコードは既に持っています。#2を検証するために、最終的な文字列をオリジナルの文字列で分割し、0回以上の空文字列が繰り返されていることを検証しましょう。endend元のテストと比較すると、StreamDataバージョンでは倍の長さになっていることがわかります。endend...StreamDataバージョンの方が実際には短いのです。StreamDataは、開発者が忘れるかもしれないエッジケースのテストもカバーしてくれます。リストそれでは、リストを繰り返す関数を書いてみましょう。これによって、どのような型にもなるランダムな長さのリストを生成します。結果を比較しています。要素が入っていないことを確認しています。最初のアサーションと条件式の組み合わせは、オリジナルのリストと最終的なリストが共に空であることを示しているので、それ以上の比較が必要ないことがわかります。2つ目の引数に正の整数を必要とします。タプル最後に、タプルの要素を繰り返す関数を実装しましょう。:c}これにアプローチできる1つの方法は、タプルをリストに変換し、リストを複製し、そしてデータ構造をタプルに戻すことです。今回は、今までとは違う方法でアプローチしてみましょう。文字列やリストでは、最終的なデータの長さと、データに含まれるコンテンツのないようをアサートしていました。タプルでも同様のアプローチを使うことは可能ですが、テストコードはそこまで簡単にはならないかもしれません。呼んでいるのパターンの応用です。これら両方の操作シーケンスで同じ結果が得られることを期待します。私たちのテストでこのアプローチを使ってみましょう。endendまとめこれで、文字列、リスト要素、タプル要素を繰り返す3つの関数ができました。プロパティベースのテストがいくつかあることで、実装が正しいことを強く確信できます。testあなたが書いたStreamDataのテストはデフォルトで100回実行されるということを覚えておいてください。加えて、いくつかのStreamDataのランダムデータは他のものよりも生成するのに時間がかかります。これらの効果が累積して、このようなの種類のテストは例ベースのユニットテストよりも実行が遅くなります。それでも、プロパティベースのテストは例ベースのユニットテストの良い補完になります。様々な種類の入力をカバーする簡潔なテストを書くことができます。テスト実行の間で状態を維持する必要がないのであれば、StreamDataはプロパティベースのテストを記述するための優れた構文を提供します。