MSTest和AppDomains

Shr*_*ike 12 unit-testing mstest visual-studio

在我的一些项目中,我注意到在VSTS2008下执行单元测试期间,其VSTestHost的内存消耗增长.因为我在我的解决方案中有很多测试,所以最终会导致OutOfMemroyException.这对我来说非常奇怪,因为我确信MSTest为每个单元测试创​​建了一个新的AppDomain.否则它将如何重置静态字段?但是如果为每个测试创建AppDomain,那么内存不应该泄漏.但确实如此.

所以问题是:VS应该为每个测试类创建AppDomain吗?如果是,我怎么检查它是否成功.我试过跟踪ProcessExpolorer和Performance管理单元.在测试运行期间,"Total appdomain unloaded"的值始终为0.

Dom*_*ton 11

MsTest为每个测试程序集创建一个应用程序域,除非您使用noisolation,在这种情况下没有AppDomain隔离.

如果您看到泄漏,可能是您的测试代码或产品代码.确保你没有把东西塞进字典并留在那里.

  • 每个程序集+1,app域.但是 - 它还为每个测试创建了一个新的测试类实例,因此它实际上应该是GC的字段.我也有一些MS测试的内存问题,我不知道为什么.我认为测试跑者有一些问题. (3认同)

Jer*_*ebe 8

我不认为单元测试引擎为每个测试创建一个新的AppDomain.由于创建AppDomain是一项相对昂贵的操作,因此每次测试都会大大减慢单元测试的执行速度!

Visual Studio 2008使用名为vstesthost.exe的单独可执行文件来运行单元测试.VS与vstesthost.exe(我怎么做,我不知道)通信告诉它要运行什么测试.vstesthost.exe将执行结果返回给VS,后者显示这些结果.

如果您在运行单元测试时获得OutOfMemoryExceptions,我会说这是一个强有力的指标,表明您的测试代码实际上并没有清理.您确定不保留非托管对象/内存的句柄吗?我建议在性能分析下运行单元测试(可以通过在"测试视图"下找到单元测试,右键单击它,然后选择"创建性能会话")来完成.这可能至少会对您的对象分配产生一些影响.


Shr*_*ike 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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

和两个测试:

[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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在执行两个测试期间输出相同的guid.