我现在一直在使用摩尔,并发现它对小型项目非常有用。
然而,当处理需要更广泛安排任务的单元测试时,单元测试需要永远。
如果我在不指定HostType(“Moles”)属性的情况下运行单元测试代码,则排列操作采用< 10秒(当运行预期的上下文时,其a< 2秒op)。添加Moles主机属性会将此时间延长到大约4-5分钟。
发生了什么,我该怎么办?
---- 关于BryanBCook答案的更新。
以下是似乎是问题的代码(有点编辑)。如果问题是IL重写的痣,它似乎发生在我不希望它应该的地方。你知道它是否会改写一切吗?我想我也很想知道它是否只是在鼹鼠宿主过程中缩放的问题。
[ClassInitialize()]
public static void ClassInit(TestContext ctx)
{
Common.Logging.Moles.MExceptionEvent.LogExceptionStringStringStringString = delegate(Exception ex, string a, string b, string c, string d)
{
Debug.WriteLine(String.Format("Exception occurred in test context '{0}' : {1} ", ctx.TestName, ex.ToString()));
};
Common.Logging.Moles.MCriticalEvent.LogStringStringTraceEventTypeStringString = delegate(string a, string b, TraceEventType tet, string c, string d)
{
Debug.WriteLine(String.Format("Critical Event occurred in test context '{0}' : {1} ", ctx.TestName, a));
};
Common.Logging.Moles.MDebugEvent.LogStringStringTraceEventTypeStringString = delegate(string a, string b, TraceEventType tet, string c, string d)
{
//Debug.WriteLine(String.Format("Debug Event occurred in test context '{0}' : {1} ", ctx.TestName, a));
};
/*there are about 1MM lines of code that generate this dataset.*/
DataSet _ds = dg.STDDataHelper.GenerateDataSet();
/*This is where the delay occurs*/
m_std = new STD(_ds);
/*Now another object (implements web caching) gets moled to use the newly constructed object*/
BizObjects.Moles.MSCO.STDs = delegate()
{
return m_std;
};
m_co1 = new Company(dg.Company.CTSDataHelper.COMPANY_ONE_CODE);
m_co1.HydrateCoTaxDefinitions(dg.Company.CTSDataHelper.GenerateCompanyOneDataset());
m_co2 = new Company(dg.Company.CTSDataHelper.COMPANY_ONE_CODE);
m_co2.HydrateCoTaxDefinitions(dg.Company.CTSDataHelper.GenerateCompanyTwoDataset());
}
---另一次更新
因此重新安排类init以便在STD初始化之后发生日志记录并删除3个调试日志语句(它们真的没用),因为整个STD对象构造树已将排列操作减少到大约一分钟,并且半。
虽然这不是最佳的(STD对象树构造中的异常将使测试失败而不是实际测试的东西),但它仍然比支付这个惩罚更好。特别是因为施工输入受到严格控制。
话虽如此,我还注意到,鼹鼠主机进程仅使用大约138MB的RAM和13%的处理器。没有痣(并将所有依赖项添加到单元测试中),标准主机将使用更多(此comp有一个i7 Quad和8GB内存 - 有足够的余地)。似乎鼹鼠的主持过程正在达到某种限制。
答案 0 :(得分:2)
Moles运行缓慢的原因是因为它使用ProfilerAPI拦截IL并重写它。如果您在启用代码覆盖率或使用Visual Studio 2010的TestImpact功能的情况下运行测试,您会看到类似的速度减慢。平均测试需要长4-5倍。
然而,4-10分钟似乎极端。我的猜测是运行测试与代码覆盖率之间的差异,而Moles是代码覆盖,测试和测试设置发生一次,这是大部分延迟发生的地方。对于Moles,初始化ProfilerAPI的设置成本可能是固定的,并且每次测试都会发生。