使用Moles进​​行大排列步骤的运行单元测试很慢

时间:2011-08-30 21:24:00

标签: performance visual-studio-2010 unit-testing moles

我现在一直在使用摩尔,并发现它对小型项目非常有用。

然而,当处理需要更广泛安排任务的单元测试时,单元测试需要永远。

如果我在不指定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内存 - 有足够的余地)。似乎鼹鼠的主持过程正在达到某种限制。

1 个答案:

答案 0 :(得分:2)

Moles运行缓慢的原因是因为它使用ProfilerAPI拦截IL并重写它。如果您在启用代码覆盖率或使用Visual Studio 2010的TestImpact功能的情况下运行测试,您会看到类似的速度减慢。平均测试需要长4-5倍。

然而,4-10分钟似乎极端。我的猜测是运行测试与代码覆盖率之间的差异,而Moles是代码覆盖,测试和测试设置发生一次,这是大部分延迟发生的地方。对于Moles,初始化ProfilerAPI的设置成本可能是固定的,并且每次测试都会发生。