在我的一些项目中,我注意到在VSTS2008下执行单元测试时,VSTestHost的内存消耗会增加。因为我的解决方案中有很多测试,所以最终会导致OutOfMemroyException。这对我来说非常奇怪,因为我确信MSTest会为每个单元测试创建一个新的AppDomain。否则它将如何重置静态字段?但是如果为每个测试创建AppDomain,那么内存就不应该泄漏。但事实确实如此。
所以问题是: VS是否应该为每个测试类创建AppDomain?如果是,那么我如何检查它是否可以这样做。我尝试通过ProcessExpolorer和性能管理单元进行跟踪。在测试运行期间,"Total appdomain unloaded“的值始终为0。
发布于 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")。这可能会给你的对象分配带来一些启发。
发布于 2009-02-14 17:11:21
MsTest为每个测试程序集创建一个应用程序域,除非您正在使用noisolation,在这种情况下没有AppDomain隔离。
如果你看到了漏洞,可能是你的测试代码或者你的产品代码中有漏洞。确保你没有把东西塞进字典里,然后把它们留在那里。
发布于 2008-11-02 12:49:56
我错误地认为每个单元测试都有单独的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。
https://stackoverflow.com/questions/256354
复制相似问题