首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MSTest和AppDomains

MSTest和AppDomains
EN

Stack Overflow用户
提问于 2008-11-02 01:13:11
回答 6查看 7.8K关注 0票数 13

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

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-11-02 05:48:13

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

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

如果你在运行你的单元测试时得到了OutOfMemoryExceptions,我会说这是一个强烈的信号,表明你测试的代码实际上并没有清理干净。您确定不保留非托管对象/内存的句柄吗?我建议在Performance Analysis下运行您的单元测试(您可以在"Test View“下找到单元测试,右键单击它,然后选择"Create Performance Session")。这可能会给你的对象分配带来一些启发。

票数 8
EN

Stack Overflow用户

发布于 2009-02-14 17:11:21

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

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

票数 13
EN

Stack Overflow用户

发布于 2008-11-02 12:49:56

我错误地认为每个单元测试都有单独的AppDomains。

这是证据:一个独生子女

代码语言:javascript
复制
public class Singleton
{
    public static Singleton Instance = new Singleton();

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

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

和两个测试:

代码语言:javascript
复制
[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。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/256354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档