Что мне нужно сделать, чтобы утверждения больше не блокировали автоматические тесты?

Мы запускаем автоматические тесты NUnit в наших проектах C # с использованием hudson / jenkins на нескольких виртуальных машинах, которые в основном работают без присмотра на некоторых серверах. Тесты включают запуск нескольких процессов, которые обмениваются данными, одним из которых является сам NUnit, а другие создаются модульным тестом.

Иногда один из разработчиков проверяет что-то, что вызывает утверждение (Debug.Assert()). Затем появляется окно сообщения с вопросом, что делать. Обычно это происходит в одном из «внешних» процессов, созданных модульными тестами. Они будут заблокировать этот процесс, в то время как другие процессы откажутся от него, потому что не могут взаимодействовать. Однако из-за характера системы все следующие тесты также завершатся ошибкой, пока этот процесс заблокирован, ожидая, пока кто-то щелкнет по этому окну сообщения. .

Мне сказали, что вы можете изменить настройки .NET-программы, чтобы утверждение не отображало всплывающее окно сообщения. В идеале процесс должен просто написать что-нибудь в stdout или stderr, чтобы Дженкинс записал.

Итак, что мне нужно сделать, чтобы отключить эти интерактивные диалоговые окна с утверждениями?


person sbi    schedule 31.03.2011    source источник


Ответы (2)


Вам необходимо реализовать System.Diagnostics.TraceListener, который не будет открывать диалоговое окно при сбое (т.е. вы можете сообщить об ошибке в инфраструктуру модульного тестирования) и добавить этот прослушиватель вместо прослушивателя по умолчанию с помощью Listeners.Clear / Add

public class MyListenerThatDoesNotShowDialogOnFail: System.Diagnostics.TraceListener
{....
    public override void Fail(string message, string detailMessage)
    {// do soemthing UnitTest friendly here
    }

}

System.Diagnostics.Debug.Listeners.Clear();
System.Diagnostics.Debug.Listeners.Add(new MyListenerThatDoesNotShowDialogOnFail());

Этот код должен быть в разделе настройки модульного теста. Таким образом, обычная отладочная сборка будет отображать диалоговые окна assert, но при запуске модульных тестов она будет делать что-то разумное для теста (например, Assert.Fail). Обратите внимание, что вам следует подумать о восстановлении исходных слушателей в методах разрыва теста.

person Alexei Levenkov    schedule 31.03.2011

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

person Hans Passant    schedule 31.03.2011
comment
Мы тестируем оба. Тестирование версии Debug проводится для получения обширной диагностики, если что-то взорвется. Тестирование версии Release проводится для тестирования в реальных условиях. - person sbi; 31.03.2011
comment
Думаю, мне бессмысленно указывать на бессмысленность этого. Эта «обширная диагностика» относится к модульному тесту. - person Hans Passant; 31.03.2011
comment
Эээ, я говорю о юнит-тестах. О чем ты говоришь? - person sbi; 31.03.2011
comment
Эмм, вы проводите разные тесты в версии модульного теста Debug vs Release? Почему ты бы так поступил? - person Hans Passant; 31.03.2011
comment
Нет, мы делаем точно такие же тесты. Только в Debug диагностика намного полнее. (Это распределенная параллельная система. Обычно вы не можете отлаживать это, вам нужно читать файлы журналов.) И утверждения запускаются только в режиме отладки. Это нормально (вот для чего они нужны), но они не должны разрушить остальные тесты. - person sbi; 31.03.2011
comment
Что ж, у вас необычный подход. Но вы застряли в том, что Assert активен, пока определена DEBUG. Единственный практический вариант - удалить прослушиватель трассировки по умолчанию, чтобы не на кого жаловаться. В документации для DefaultTraceListener показано, как это сделать с помощью файла .config. Вы также можете сделать это в коде. - person Hans Passant; 31.03.2011
comment
Вы намеренно пытаетесь меня неправильно истолковать? Почему вы не можете сначала прочитать мой вопрос (в котором говорится о модульных тестах), а затем ответить? Почему вы не понимаете, что мы хотим активировать эти утверждения? Что нас устраивает взорвать эти тесты? Что наша единственная проблема в том, что из-за этого все остальные тесты тоже терпят неудачу? Что такого необычного в запуске модульного теста для нескольких конфигураций? Почему вы не ответили на какие-либо мои аргументы в адрес вашей критики, а вместо этого продолжаете придумывать другую критику, опять же, не прилагая усилий, чтобы сначала понять проблему, и снова не получая оценки? - person sbi; 01.04.2011
comment
Если вы не нашли время, чтобы внимательно прочитать вопрос, сначала задайте свои вопросы, если что-то неясно, и отвечайте только после того, как вы поняли проблему и знаете ответ, почему вы вообще отвечаете? Это не значит, что вам нужна была репутация. Или это способ получить столько репутации? Публикуя дерзкий, вы делаете неправильный ответ, который обязательно получит несколько положительных голосов и намного проще, чем на самом деле пытаться разобраться с проблемой? - person sbi; 01.04.2011
comment
Хм, просто пытаюсь помочь. Неуклюжая попытка помочь - не совсем то же самое, что сказать вам, что ваши волосы выглядят забавно, не нужно обижаться. Понятно, что я понятия не имею, что вам действительно нужно. Удачи с этим. - person Hans Passant; 01.04.2011
comment
@Hans: Сейчас у меня есть ваше замечание, что наш подход был бы необычным, но я не знаю, почему, и я не могу не заметить, что вы снова уклонились от ответа на мой вопрос по этому поводу - person sbi; 01.04.2011