コードがガベージを生成するかどうかを検出したかったのです。そこで、次の単体テストを作成しました。
[TestClass]
public class AllocationTest
{
int[] generationCollections = new int[3];
[TestMethod]
public void TestGarbageGeneration()
{
generationCollections[0] = GC.CollectionCount(0);
generationCollections[1] = GC.CollectionCount(1);
generationCollections[2] = GC.CollectionCount(2);
// Test for garbage here
for (int generation = 0; generation < generationCollections.Length; generation++)
{
Assert.AreEqual(GC.CollectionCount(generation), generationCollections[generation]);
}
}
}
問題のコードを「ここでガベージをテストしてください」というコメントがある場所に配置しましたが、結果は予測できません。これは、GC が別のスレッドで実行され、テスト以外のコードによっていつでもトリガーされる可能性があるためです。
テスト コードの前後で GC.Collect を強制的にコレクションを実行しようとしましたが、コレクション カウントが常に増加するため、テストは常に失敗することに気付きました。
単体テストでガベージをテストする有意義な方法はありますか?