13

一部の私のプロジェクトでは、VSTS2008 で単体テストを実行しているときに、VSTestHost のメモリ消費量が増加することに気付きました。私のソリューションには非常に多くのテストがあるため、最終的に OutOfMemroyException につながります。MSTest が単体テストごとに新しい AppDomain を作成すると確信していたので、それは私にとって非常に奇妙に見えます。そうでなければ、静的フィールドをどのようにリセットしますか? ただし、テストごとに AppDomain が作成されている場合は、メモリがリークすることはありません。しかし、そうです。

問題は、VS がテスト クラスごとに AppDomain を作成する必要があるかどうかです。はいの場合、どうすればそれを確認できますか。ProcessExplorer と Performance スナップインでトレースしてみました。テストの実行中、「Total appdomain unloaded」の値は常に 0 です。

4

6 に答える 6

8

単体テスト エンジンがテストごとに新しい AppDomain を作成するとは思わない。AppDomain の作成は比較的コストのかかる操作であるため、テストごとにこれを行うと、単体テストの実行が大幅に遅くなります。

Visual Studio 2008 は、vstesthost.exe という別の実行可能ファイルを使用して単体テストを実行します。VS は vstesthost.exe と通信して (どのようにこれを行うのかはわかりません)、実行するテストを指示します。vstesthost.exe は実行結果を VS に返し、VS はそれらの結果を表示します。

単体テストを実行しているときに OutOfMemoryExceptions が発生した場合は、テスト対象のコードが実際にクリーンアップされていないことを示す強力な指標であると言えます。アンマネージド オブジェクト/メモリへのハンドルを保持していませんか? パフォーマンス分析で単体テストを実行することをお勧めします ([テスト ビュー] で単体テストを見つけて右クリックし、[パフォーマンス セッションの作成] を選択すると実行できます)。これにより、少なくともオブジェクトの割り当てに光が当たる可能性があります。

于 2008-11-02T05:48:12.610 に答える
7

ユニットテストごとに個別の AppDomains を使用することについて、私は間違っていました。

ここに証拠があります:シングルトン

public class Singleton
{
    public static Singleton Instance = new Singleton();

    private Guid _token;
    private Singleton()
    {
        _token = Guid.NewGuid();
    }

    public Guid Token
    {
        get { return _token; }
    }
}

および 2 つのテスト:

[TestClass]
public class UnitTest2
{
    [TestMethod]
    public void TestMethod1()
    {
        Console.WriteLine(Singleton.Instance.Token);
    }
}
[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        Console.WriteLine(Singleton.Instance.Token);
    }
}

両方のテストの実行中に、同じ GUID が出力されます。

于 2008-11-02T12:49:55.990 に答える
1

大規模なテスト実行で同じ問題が発生しました。私の理論は次のとおりです。この場合のメモリ不足は、MSTest テスト結果ファイルが XML であるためです。したがって、ディスクにシリアル化する前に、テストの実行が終了するまで、すべてのログ結果をメモリに保持する必要があります。XML 万歳 :-)

しばらく前にこの問題を接続の問題として投稿しましたが、MSTest 10 (64 ビットに移行) で修正されているはずですが、VS2010 に移行した他のすべての問題のため、まだ確認できていません。ネット 4.0。

于 2011-03-30T08:38:36.597 に答える
0

これはMSTest2010では解決されていないようです。私はこのような多くの同様の問題を経験しています。ユニットテストでガベージコレクションが機能しないのはなぜですか?

私の理解では、UTフレームワークが実行されたすべてのテストの処理を処理しましたが、これは、コードにあるいくつかのシングルトンパターンには当てはまらないようです。

于 2011-06-07T20:34:47.627 に答える