Как ускорить модульные тесты, использующие отражение в Visual Studio 2010? - PullRequest
2 голосов
/ 26 апреля 2011

Я думал об использовании отражения для модульных тестов, где 2 объекта будут сравниваться на равенство, а методы GetProperties () и GetFields () будут широко использоваться.Однако я знаю, что влияние на производительность будет очень значительным.Фактически, несколько моих коллег использовали отражение для глубокой копии некоторого исходного объекта для нацеливания на объект.Код абсолютно элегантный, красивый и делает именно то, что должен.Проблема в том, что им пришлось отказаться, потому что это было очень медленно.Итак, все ли потеряно, когда речь идет об использовании отражения в модульных тестах, или есть способ реализовать его без смешного снижения производительности?Заранее большое спасибо.

Ответы [ 5 ]

2 голосов
/ 26 апреля 2011

Вы можете взглянуть на HyperDescriptor , который может ускорить процесс по сравнению с отражением.

1 голос
/ 26 апреля 2011

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

Если у вас нет измерений, вы этого не знаете.Вы можете заподозрить это ...

Самый простой способ избежать затрат на рефлексию - это использовать рефлексию для генерации модульного теста.Тогда модульный тест сам по себе не имеет отражения.

1 голос
/ 26 апреля 2011

Оформить Автофиксирование Сходство . Это именно то, что вы описали выше. Затем вы можете проверить, считаете ли вы производительность приемлемой.

См. Этот другой вопрос для примера использования: Как сравнить два объекта в модульном тесте?

0 голосов
/ 26 апреля 2011

Один из подходов - попытаться ускорить отражение вызовов.Учитывая, что для достижения этой цели вы полагаетесь на низкоуровневое оборудование, я не вижу здесь большой надежды.

Другой подход заключается в том, чтобы оплатить стоимость, но оплачивать ее следует только тогда, когда тестирование снова необходимо.(Если вы не изменяете тестируемый код, вам не нужно тестировать его снова).

Наш C # инструмент для охвата тестов может отслеживать отношения между (абстрактные тесты)) и проверенный код.Он может определить необходимость повторного запуска (абстрактного) теста, изучив его охват по отношению к измененному коду, который он определяет путем сравнения файлов кода на уровне методов.Если есть пересечение, вам нужно снова запустить (абстрактный) тест.В противном случае вы можете просто пропустить эти тесты и любые дорогостоящие накладные расходы («отражения»), которые они могут содержать.

Ласковые слова «абстрактный тест» просто означают, что вы определяете, какой набор тестовых операций соответствует обнаруживаемой повторно проверяемой единице;Вы можете решить отслеживать каждый модульный тест или группировать их другими удобными способами.В идеале вы хотите получить лучшие тесты для анализа зерна, которые вы можете получить, чтобы минимизировать реальное повторное тестирование;иногда лучше просто объединить группу тестов.

0 голосов
/ 26 апреля 2011

Как быстро должны выполняться ваши юнит-тесты?Является ли обходной путь (избегая размышлений) более эффективным использованием вашего времени для экономии времени на модульное тестирование?

Сколько времени занимают ваши тесты прямо сейчас?Пока вы не реализуете свои модульные тесты с использованием рефлексии, вы не будете знать, насколько они быстры (или медленны), и не сможете сравнить альтернативы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...