MSTest&应用程序域

时间:2008-11-02 01:13:11

标签: visual-studio unit-testing mstest

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

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

6 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:8)

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

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

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

答案 2 :(得分: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; }
    }
}

和两个测试:

[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。

答案 3 :(得分:1)

在大型测试运行中看到同样的问题。我的理论如下。在这种情况下,内存耗尽是由于MSTest测试结果文件是XML。因此,在序列化到磁盘之前,它需要将所有日志结果保留在内存中,直到测试运行结束。 Hurray for XML: - )

我已经把这个问题作为connect issue发布了一段时间后它应该已经修复了MSTest 10(64位)但我还没有能够验证这个问题,因为我们遇到了所有其他问题已经转向VS2010和.NET 4.0。

答案 4 :(得分:1)

处理单例的唯一方法是处置appDomain。单例是一个静态保持自身,因此它基本上是一个循环引用。在appdomain消失之前,真正的单身人士不会被处置。

答案 5 :(得分:0)

这在MSTest 2010中似乎没有解决。我遇到了很多类似的问题。为什么垃圾收集在单元测试中不起作用?

我的理解是UT框架负责处理所有已执行的测试,但我们在代码中遇到的一些单例模式似乎并非如此。