オブジェクト自体ではなく、オブジェクト データをモックアップしたいと思います。つまり、n 個のオブジェクトのコレクションを生成し、それをランダムなデータ文字列と数値を生成する関数に渡したいと考えています。これを行うことはありますか?オブジェクト データのLorem Ipsumと考えてください。数値範囲などの制約は必要ありませんが、おまけになります。
5 に答える
あなたの質問を読んで最初に思いついたのは、Haskell のテスト ツールである QuickCheck でした。QuickCheck では、関数が持つべきプロパティ (不変条件) を指定し、入力の有効な範囲 (さらに多くの機能) を指定できます。QuickCheck はランダムな入力データの束を生成し、それを関数にスローしてチェックします。出力が仕様と一致する場合。少し調べてみると、F# への移植版があり、.net の世界に QuickCheck が存在することがわかりました。
あなたが考えていることに近いかもしれないMS ResearchプロジェクトPexもあります:
http://research.microsoft.com/en-us/projects/Pex/
「...Pex は、メソッドの興味深い入出力値を検出します。これは、コード カバレッジの高い小さなテスト スイートとして保存できます。Microsoft Pex は、.NET Framework アプリケーションをテストするための Visual Studio アドインです。」
以前に使用したことはありませんが、関数のすべての分岐を実行するエッジ ケース データを生成するのに適しているように見えました。本当にランダムなものを投げるだけではなく、実際に関数を分析します。
また、Ruby Faker
gem の .NET ポートもあるようです。これは、Ruby で偽のデータ オブジェクトを操作するためによく使用されます。私はそれを使用していませんが、調べる価値があるかもしれません:
AutoFixture についてまだ誰も言及していないことに驚いています。
[TestMethod]
public void IntroductoryTest()
{
// Fixture setup
Fixture fixture = new Fixture();
int expectedNumber = fixture.CreateAnonymous<int>();
MyClass sut = fixture.CreateAnonymous<MyClass>();
// Exercise system
int result = sut.Echo(expectedNumber);
// Verify outcome
Assert.AreEqual<int>(expectedNumber, result, "Echo");
// Teardown
}
ObjectRandomizer
オブジェクトの配列を受け取り、リフレクションを使用してオブジェクトのプライベートメンバーを調べ、リフレクションを使用してそのメンバーにランダムな値を設定するクラスを設定できます。これは、オブジェクトごとのランダムデータがどのように見えるかを気にしない場合にのみ機能します。
または、ランダムデータを生成するデータオブジェクトごとにクラスのセットを作成することもできます。これは、実際のアセンブリ内にランダム生成メソッドを含めたくない場合にうまく機能する可能性があります。たとえば、クラスがある場合、テストアセンブリにクラスPerson
を含めることができます。PersonRandomizer
テストクラス(またはRandomizer
クラス)で、リフレクションを使用してタイプを検索し、PersonRandomizer
存在する場合はを呼び出しますPersonRandomizer.Randomize(Person p)
。
yahyaの提案に賛成する場合は、ランダム化をサポートするオブジェクトのインターフェイスを作成するか、実行時に検出できるIRandomizable
新しい属性でオブジェクトをマークすることをお勧めします。Randomizable
私のテストでは、作成したすべてのクラスに、これを行うメソッドを追加し、それをランダム化と呼びます。各クラスは、そのクラスのオブジェクトの正当なデータがどのように見えるべきかを知っています。オブジェクトを作成したら、単純にその randomize メソッドを呼び出して、ランダムなモックアップ データを入力します。特殊なメソッドを追加して、制約に基づいてランダムなデータ文字列または数値を生成することもできます。これらの特殊なメソッドは、すべてのクラスで共有できます。