Shr*_*ike 12 unit-testing mstest visual-studio
在我的一些项目中,我注意到在VSTS2008下执行单元测试期间,其VSTestHost的内存消耗增长.因为我在我的解决方案中有很多测试,所以最终会导致OutOfMemroyException.这对我来说非常奇怪,因为我确信MSTest为每个单元测试创建了一个新的AppDomain.否则它将如何重置静态字段?但是如果为每个测试创建AppDomain,那么内存不应该泄漏.但确实如此.
所以问题是:VS应该为每个测试类创建AppDomain吗?如果是,我怎么检查它是否成功.我试过跟踪ProcessExpolorer和Performance管理单元.在测试运行期间,"Total appdomain unloaded"的值始终为0.
Dom*_*ton 11
MsTest为每个测试程序集创建一个应用程序域,除非您使用noisolation,在这种情况下没有AppDomain隔离.
如果您看到泄漏,可能是您的测试代码或产品代码.确保你没有把东西塞进字典并留在那里.
我不认为单元测试引擎为每个测试创建一个新的AppDomain.由于创建AppDomain是一项相对昂贵的操作,因此每次测试都会大大减慢单元测试的执行速度!
Visual Studio 2008使用名为vstesthost.exe的单独可执行文件来运行单元测试.VS与vstesthost.exe(我怎么做,我不知道)通信告诉它要运行什么测试.vstesthost.exe将执行结果返回给VS,后者显示这些结果.
如果您在运行单元测试时获得OutOfMemoryExceptions,我会说这是一个强有力的指标,表明您的测试代码实际上并没有清理.您确定不保留非托管对象/内存的句柄吗?我建议在性能分析下运行单元测试(可以通过在"测试视图"下找到单元测试,右键单击它,然后选择"创建性能会话")来完成.这可能至少会对您的对象分配产生一些影响.
我为每个单元测试分别使用AppDomains是错误的.
这是证据:单身人士
public class Singleton
{
public static Singleton Instance = new Singleton();
private Guid _token;
private Singleton()
{
_token = Guid.NewGuid();
}
public Guid Token
{
get { return _token; }
}
}
Run Code Online (Sandbox Code Playgroud)
和两个测试:
[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);
}
}
Run Code Online (Sandbox Code Playgroud)
在执行两个测试期间输出相同的guid.
归档时间: |
|
查看次数: |
7049 次 |
最近记录: |