代码之家  ›  专栏  ›  技术社区  ›  Shrike

MSTest和AppDomains

  •  12
  • Shrike  · 技术社区  · 16 年前

    这对我来说很奇怪,因为我确信MSTest会为每个单元测试创建一个新的AppDomain。否则它将如何重置静态字段? 但如果为每个测试创建AppDomain,则内存不应泄漏。但确实如此。

    所以问题是:VS是否应该为每个测试类创建AppDomain?如果是,那么我如何检查它是否成功。

    6 回复  |  直到 16 年前
        1
  •  13
  •   Dominic Hopton    16 年前

    MsTest为每个测试创建一个应用程序域

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

        2
  •  8
  •   Jeremy Wiebe Tomas Reimers    13 年前

    我不认为单元测试引擎会为每个测试创建一个新的AppDomain。因为创建AppDomain是一个相对昂贵的操作,所以对每个测试这样做会大大降低单元测试的执行速度!

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

        3
  •  7
  •   svidgen    9 年前

    我错误地认为每个单元测试都有单独的应用程序域。

    以下是证据:

    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);
        }
    }
    

        4
  •  1
  •   Brumlemannen    13 年前

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

    connect issue 前一段时间,它应该在MSTest 10中修复(使用64位),但我还无法验证这一点,因为我们在迁移到VS2010和.NET 4.0时遇到了所有其他问题。

        5
  •  1
  •   Michael Reed Schmidt    8 年前

        6
  •  0
  •   n8CodeGuru    13 年前

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

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