2015-07-22 5 views
2

Привет У меня есть единичный тест, который подключается к событию и обновляет счетчик, основанный на свойстве eventArgs в обработчике, таком как так:Тест модуля MSTest проходит в режиме «отладки», но не выполняется окончательное утверждение в режиме «запуска»

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

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

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

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

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

+0

Итак, у вас есть многократные тесты (именно поэтому вы добавили блокировку) одновременно? Если это так: статический dictionnay сбрасывается при каждом тестировании, и это может вызвать некоторую проблему, поскольку тест может начаться, пока другой все еще находится в инициализации – Daneau

+0

. Я добавил блокировку вокруг приращения, потому что я знал, что в сам одиночный тест многих потоков может потенциально коснуться одного и того же элемента в Словаре одновременно, а не из-за того, что разные тесты могут получить доступ к нему одновременно. Если это была проблема, тогда тест не будет передавать утверждения при запуске в сочетании с другими, но он не может утверждать даже при запуске сам по себе. Он проходит только при запуске в режиме «отладки». –

+0

так что в отладке это работает, но не в релизе? – Daneau

ответ

1

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

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

Смежные вопросы