13

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

所以问题是:VS 是否应该为每个测试类创建 AppDomain?如果是,那么我该如何检查它是否做到了。我尝试通过 ProcessExplorer 和 Performance 管理单元进行跟踪。“Total appdomain unloaded”的值在测试运行期间始终为 0。

4

6 回答 6

13

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

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

于 2009-02-14T17:11:20.730 回答
8

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

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

和两个测试:

[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 回答
1

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

于 2016-04-01T14:35:39.090 回答
0

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

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

于 2011-06-07T20:34:47.627 回答