Недавно я спросил (и ответил) на вопрос о StackOverflow о том, почему единичный тест будет работать при запуске сам по себе, а затем неудачно спорадически запускается со всей партией модульных тестов. См. Здесь: SQL Server and TransactionScope (with MSDTC): Sporadically can't get connectionКак сборщик мусора работает с модульными испытаниями?
Тестирование модулей при запуске по одному, а затем сбой при запуске - это классический признак того, что с кодом что-то серьезно не так.
Я обнаружил, что есть немного утечки ресурсов. Из-за тонкой ошибки, приводящей к тому, что соединения с SQL-сервером не были выпущены, у меня заканчивались соединения, и тесты терпели неудачу. AFAIK, это работает почти точно как утечка памяти; соединения распределяются из пула соединений и никогда не освобождаются так же, как память может быть выделена, а затем не освобождена.
Однако это оставляет мне задающий вопрос вопрос? В чем разница между запуском моих тестов по одному и запуском их как набора? Если тесты проходят при каждом запуске, а затем сбой при запуске вместе, тогда должно происходить какие-то попытки очистки между тестовыми прогонами, которые происходят только тогда, когда тесты запускаются по одному за раз.
Я предполагаю, что это может иметь какое-то отношение к тому, что делает сборщик мусора .net, который делает или не делает между испытаниями. В одном случае соединения освобождаются между тестами; в другом случае это не так.
Как я могу это объяснить?
Обновление: Тем, кто вас спрашивает о специфике кода, это довольно просто. Я объявляю новый объект TransactionScope
в своем методе установки и удаляю его в моем методе Teardown
. Тем не менее, проблемным тестом был тест, основанный на данных, с 100 тестовыми примерами; тестируемый код заполнил объект SqlDataReader
из оператора select, используя класс SqlHelper, а затем не вызвал метод закрытия на SqlDataReader
. Поскольку я использовал класс SqlHelper для получения SqlDataReader, я ожидал, что соединения будут обработаны для меня. Не так!
Но уточнить, я не спрашиваю о моей конкретной ситуации. Я хочу знать, как: как распределяются ресурсы между тестами? Я бы предположил, что это будет какое-то применение сборщика мусора. Интересно, может ли сборщик мусора еще очистить предыдущий тест в следующем испытании (состояние гонки?)
Обновление: Что я знаю о сборке мусора с помощью Unit Tests. Следуя моему собственному любопытству, я вытащил модульные тесты, которые терпели неудачу, потому что соединение было оставлено открытым объектом SqlDataReader
. Я попытался добавить System.GC.Collect()
в конце каждого теста. Это успешно освободило соединения, но накладывает штраф на 50%.
Если у вас заканчиваются соединения, потому что вы не выпускаете достаточно их между тестами, я подозреваю, что есть проблемы с вашими методами срыва. При запуске их по одному ОС ОС позаботится о каком-то разрыве, но запуститься как набор, использование ресурсов сохраняется дольше. – MikeD
Возможно, вам просто нужно еще несколько вызовов 'Dispose' или' Close'? – Gabe