AutoFixture AutoMoqData замедляется по мере добавления дополнительных тестов

Используя nunit 2.6.4 и AutoMoqData, бегун Resharper, по-видимому, оценивает все параметры, которые должны быть переданы во все тесты, до выполнения одного теста, даже если все, что я хочу сделать, это запустить один тест/небольшой набор тестов. Прямо сейчас (у нас тысячи тестов) запуск одного теста занимает 2-3 минуты, что не работает для TDD.

Я попытался переключиться на Xunit, чтобы увидеть, не была ли проблема в nunit, и все еще была большая задержка перед запуском первого теста.

Следует ли ожидать такого поведения? Или мы что-то делаем не так?


person Carl    schedule 24.05.2015    source источник
comment
Можете ли вы поделиться решением, демонстрирующим проблему? Тот, который мы могли бы скачать локально и профилировать? Это происходит с консольными раннерами?   -  person Adam C    schedule 25.05.2015
comment
Также известный как SSCCE.   -  person Mark Seemann    schedule 25.05.2015
comment
Это не ожидается. У меня есть различные наборы тестов, использующие AutoFixture и AutoMoqData, выполняющие около тысячи тестов менее чем за десять секунд на ультрабуке.   -  person Mark Seemann    schedule 25.05.2015
comment
Домен представляет собой довольно сложный граф EF, и мое примитивное профилирование указывает на то, что AutoMoqData создает множество объектов в качестве узкого места. Я добавил очень простые регистрации для каждого объекта (их около 100), которые не имели никакого значения, но примитивное профилирование показало, что большая часть времени уходит на создание IFixtures. Теперь я использую одноэлементное приспособление (с регистрацией), и это сократило время тестирования до более разумных 8 секунд. Для справки, использование одноэлементного прибора без регистрации не имело большого значения по сравнению с исходными таймингами.   -  person Carl    schedule 25.05.2015
comment
Проблема с использованием одного прибора заключается в том, что любые замороженные службы навсегда заморожены. Вернуться к доске для рисования...   -  person Carl    schedule 26.05.2015
comment
довольно сложный график EF ... Одна вещь, которую я заметил в AutoFixture, заключается в том, что если вы используете его для больших графов объектов, он имеет тенденцию замедляться. Если ваши графики достаточно большие, это может быть объяснением. Это не особенно ожидаемое поведение, но AutoFixture (будучи инструментом TDD) никогда не предназначался для построения больших графиков. Насколько велики ваши графики?   -  person Mark Seemann    schedule 02.06.2015
comment
Слишком большой :) Я обработал это, и я создаю только объект и один уровень вниз, с пустыми коллекциями, и это имело огромное значение, вплоть до 8s.   -  person Carl    schedule 03.06.2015
comment
Корень моих проблем — дизайн приложения и API. Я пытался игнорировать ваши предупреждения @Mark, но, в конце концов, это просто означает дополнительную работу по рефакторингу/редизайну приложения. Однако хороший опыт обучения :)   -  person Carl    schedule 03.06.2015
comment
При рассмотрении удивительно похожей проблемы с @Carl AutoFixture.Kernel.RecursionGuard занимает 8,46% времени общего теста.   -  person John Zabroski    schedule 29.04.2021


Ответы (1)


Итак, результаты моего исследования таковы: когда nunit обнаруживает тесты, он проходит через атрибуты и создает объекты, а nunit (2) обнаруживает все тесты, даже если вас интересует только запуск 1. Очевидно, в какой-то момент это изменится. за ночь 3.

Сложный и большой граф объектов был причиной того, что тесты замедлялись, и благодаря настройке Autofixture для жесткого сокращения этого графа тесты теперь намного (260–8 с) быстрее.

Я попытался использовать Autofixture.AutoEntityFramework, но, хотя он делал то, что я хотел, прироста скорости было недостаточно для эффективного TDD (260 с - около 100 с).

person Carl    schedule 03.06.2015