Вопрос

Я ищу общие мысли и / или ссылки на тему в целом, хотя моя специфическая мотивация на данный момент - это задачи пользовательских пользовательских интерфейсов, связанные с отчетом о прогрессе с использованием фонового работника и / или TPL. Мой уровень опыта с Async Programming в целом является новичок. Инструменты тестирования, которые я знаю, лучший - Нунит и носорог.

Некоторые мозги штурмовывают идеи с верхней части головы:

  1. Не беспокойтесь - это слишком сложно, и вы просто заводили тестирование BGW или TPL.
  2. Сделайте какую -то фальшивую или издевательную.
  3. Используйте EventWaithandles
Это было полезно?

Решение

Устройство тестирования асинхронного кода не самая простая вещь в мире, как я узнал при написании модульных тестов для моего Nito.async. библиотека. :)

Во -первых, вы хотите определить, что вы на самом деле хотите проверить. Вы просто хотите проверить, выполняется ли асинхронное действие, или вы хотите убедиться, что ваши задачи BGW/задачи должным образом синхронизируют свои отчеты по прогрессу пользовательского интерфейса?

Тестирование действия довольно простое: просто подождите, пока действие не будет завершено, а затем проверьте наличие поступлений. (Тем не менее, осознайте, что BGW RunWorkerCompleted будет поднят на ThreadPool Тема, если вы не дадите ему контекст синхронизации, как пример ниже).

Тестирование надлежащей синхронизации (например, что каждый кусок кода работает на правильном потоке), более сложный.

Для каждого теста вам нужно будет установить контекст синхронизации. Это будет издеваться над контекстом синхронизации пользовательского интерфейса. Моя библиотека Nito.async может помочь с этим; У него есть АН ActionThread который является отдельной нитью, которая содержит контекст синхронизации, подходящий для владения компонентами EAP (например, BGW) и задач планирования (например, TaskScheduler.FromCurrentSynchronizationContext).

Его можно использовать как это (используя пример MSTEST):

[TestMethod]
public void Test()
{
  using (ActionThread thread = new ActionThread())
  {
    thread.Start();

    // Anything passed to Do is executed in that ActionThread.
    thread.Do(() =>
    {
      // Create BGW or call TaskScheduler.FromCurrentSynchronizationContext.
    });

    // The thread is gracefully exited at the end of the using block.
  }
}

я нахожу Thread.CurrentThread.ManagedThreadId и Thread.CurrentThread.IsThreadPoolThread быть самыми простыми способами проверить правильную синхронизацию. Если ваш тестовый код запускается изнутри ActionThread.Do, тогда он должен синхронизировать свои обновления прогресса (и уведомление об окончании) к этому ActionThread.

Множество тестов Nito.async используют ActionThread Таким образом, вы можете посмотреть там для различных примеров.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top