Модульный тест MSTest проходит в режиме отладки, но завершает проверку в режиме выполнения.

Привет, у меня есть модульный тест, который подключается к событию и обновляет счетчик на основе свойства eventArgs в обработчике, например:

protected void UpdateCounts(object sender, EventArgs eventArgs)
{
  lock (lockobject)
  {
    Counts[eventArgs.Target]++;
  }
}

Counts — это статический ресурс Dictionary, который используется всеми модульными тестами в этом классе. Я утверждаю, что в конце теста я утверждаю, что счет равен 6 для определенного значения Target (Target - это перечисление). Когда я отлаживаю этот тест, он всегда проходит это окончательное утверждение, однако, когда я просто запускаю его без каких-либо точек останова, счетчик для этого значения Target может быть 7 или 8, но никогда не 6.

Я понимаю, что многие потоки, пытающиеся получить доступ к записи в словаре, могут представлять состояние гонки, поэтому я поместил блокировку вокруг приращения. У меня также есть метод TestInitialize, который запускается перед запуском каждого теста, который выглядит следующим образом:

[TestInitialize]
public void InitTest()
{
  foreach (TargetType x in Enum.GetValues(typeof(Target)))
  {
    Counts[x] = 0;
  }
}

Есть ли у кого-нибудь понимание того, что здесь происходит?


person Allen Suner    schedule 22.07.2015    source источник
comment
Итак, у вас одновременно запущено несколько тестов (именно поэтому вы добавили блокировку)? Если это так: статический словарь сбрасывается при каждом тесте, и это может вызвать некоторые проблемы, поскольку тест может начаться, когда другой все еще находится в инициализации.   -  person Daneau    schedule 22.07.2015
comment
Я добавил блокировку вокруг приращения, потому что я знал, что в самом отдельном тесте многие потоки потенциально могут одновременно касаться одного и того же элемента в словаре, а не из-за того, что разные тесты обращаются к нему в одно и то же время. Если бы проблема заключалась в этом, то тест не прошел бы утверждения при выполнении в сочетании с другими, но он не прошел бы утверждения, даже если запускался сам по себе. Он проходит только при запуске в режиме отладки.   -  person Allen Suner    schedule 22.07.2015
comment
так что в отладке работает, а в релизе нет?   -  person Daneau    schedule 22.07.2015
comment
Нет, извините, я думаю, что мой вопрос неясен. В Visual Studio в обозревателе тестов у вас есть возможность запустить модульный тест изолированно или отладить модульный тест изолированно. Конфигурация сборки не имеет отношения.   -  person Allen Suner    schedule 22.07.2015
comment
о мой плохой оккай. Является ли проблема утверждения еще некоторыми случайными значениями, такими как 7-8, но не 6?   -  person Daneau    schedule 22.07.2015
comment
Запустите приложение с отладчиком или без него и создайте регистратор, в котором событие может быть вызвано. Таким образом, без какого-либо тестового решения вы увидите, является ли это проблемой потоковой передачи или проблемой тестового решения.   -  person Daneau    schedule 22.07.2015


Ответы (1)


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

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

person Mike Nash    schedule 22.07.2015