C # Mocking Framework с параллельной поддержкой - PullRequest
3 голосов
/ 18 июля 2011

Какие фреймворки в C # допускают параллельное выполнение? (Потокобезопасность) Я пробовал RhinoMocks, но он не работает при параллельном выполнении. Эти тесты не используют внешние ресурсы.

Предыстория: я помогаю другим разработчикам в модульном тестировании с помощью MSTest и хотел использовать несколько ядер. Эта часть, кажется, работает правильно.

1 Ответ

3 голосов
/ 19 июля 2011

Обновление:

Хорошо, поэтому я первоначально разместил схему ниже, потому что был уверен, что это может быть что-то в ваших тестах, например, общее состояние - это не может бытьRhinoMocks, верно? верно ?? Ну, на ваш взгляд, я думаю, что с фреймворком есть что-то странное.Мои искренние извинения!

Используя Reflector, чтобы случайно взглянуть на источник RhinoMock, мы видим, что MockRepository имеет внутреннее статическое поле для представления текущего репозитория mock.Глядя на использование этого поля, кажется, что этот репозиторий широко используется динамическим прокси-перехватчиком, который настоятельно рекомендует ничего не поточно-ориентированного.

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

LastCall.IgnoreArguments();

Итак, чтобы ответить на ваш вопрос - я бы порекомендовал вам попробовать Moq. Исходя из источника , похоже, что Fluent API является статическим, но он помечен [ThreadStatic] , поэтому все должно быть в порядке.Конечно, это связано с предупреждением о том, что вы выполняете первоначальную настройку макетов в текущем потоке, а не между потоками.

Дайте мне знать, как это работает.


Как настроить параллельное выполнение теста в Visual Studio 2010:

Эта ссылка описывает механизм для включения параллельного выполнения теста.Короче говоря, вам нужно вручную отредактировать файл testsettings и добавить атрибут parallelTestCount в узел выполнения.Установка для параметра parallelTestCount значения 0 означает, что он автоматически сбалансирует выполнение теста по всем доступным ядрам на машине.

<TestSettings>
   <!-- etc -->
   <Execution parallelTestCount="0">
         <!-- etc -->
   </Execution>
   <!-- etc -->
</TestSettings>

Существует несколько предостережений:

  • Это работает только длястандартные "модульные тесты" MSTest (существует множество различных тестов, которые вы можете создать (заказанные, кодированные пользовательские интерфейсы, пользовательские расширения тестов и т. д.). Стандартные модульные тесты - это разновидность TestClass / TestMethod.
  • Это не такподдержка адаптеров данных. Таким образом, отсутствует поддержка параллельных тестов, управляемых базой данных
  • Он должен выполняться локально (нельзя выполнять тесты, распределенные по нескольким компьютерам параллельно.)

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

...