Выполнение юнит-тестов с большим шагом аранжировки с родинками идет медленно - PullRequest
1 голос
/ 31 августа 2011

Я немного пользуюсь родинками и считаю, что это очень полезно для небольших проектов.

Однако при работе с модульными тестами, требующими более сложных задач компоновки, модульные тесты требуют FOREVER.

Если я запускаю код модульного теста без назначения атрибута HostType ("Moles"), компоновкаоперация занимает <10 секунд (при запуске заданного контекста его операция <2 секунды).Добавление атрибута хоста Moles увеличивает это время до 4-5 минут. </p>

Что происходит и что я могу с этим сделать?

---- Обновление в отношениина ответ BryanBCook.

Ниже приведен код (немного отредактированный), который, похоже, является проблемой.Если проблема заключается в переписывании родинок IL, то, кажется, это происходит в месте, которое я не ожидал бы, что должно.Вы знаете, переписывает ли это все?Думаю, мне также любопытно узнать, является ли это просто проблемой с масштабированием в хост-процессе moles.

[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 не пройдут тест, а будут проверены), это все же лучше, чем платить штраф.Тем более, что входные данные конструкции жестко контролируются.

При этом я также заметил, что в хост-процессе moles используется только около 138 МБ оперативной памяти и 13% процессора.Без кротов (и добавления всех зависимостей к модульному тесту) стандартный хост будет использовать гораздо больше (у этого компа есть i7 Quad и 8 Гбайт оперативной памяти - есть много места для запаса).Похоже, что процесс хоста родинок достиг своего рода предела.

1 Ответ

2 голосов
/ 31 августа 2011

Причина, по которой Moles работает медленно, заключается в том, что он использует ProfilerAPI для перехвата IL и его перезаписи. Подобное замедление будет наблюдаться, если вы будете запускать тесты с включенным покрытием кода или при использовании функции TestImpact в Visual Studio 2010. в среднем тесты занимают в 4-5 раз больше времени.

4-10 минут кажется экстремальным. Я предполагаю, что разница между выполнением тестов с покрытием кода и Moles заключается в том, что для покрытия кода инструментарий и настройка для тестов происходят один раз, и именно здесь происходит большая часть задержки. Для Moles возможно, что стоимость установки для инициализации ProfilerAPI фиксирована и происходит для каждого теста.

...