Что заставляет vstest зависать после успешного выполнения всех тестов

#c# #.net #multithreading #vstest #vstest.console.exe

#c# #.net #многопоточность #vstest #vstest.console.exe

Вопрос:

Мы используем Visual Studio test Framework и C # для написания модульных тестов, и недавно мы столкнулись с проблемой, когда vstest.console.exe иногда зависает после выполнения всех тестов. Все тесты проходят, но затем vstest.console.exe просто сидит там вечно, ожидая чего-то, вместо того, чтобы выйти.

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

Чтобы лучше понять проблему, я попытался воспроизвести проблему, как показано в тестовом коде ниже. Однако, похоже, что vstest.console.exe совершенно счастлив выйти после завершения подобного теста. Похоже, его не волнуют какие-либо «дикие» потоки, которые все еще выполняются. Итак, мой вопрос заключается в следующем: что заставляет vstest ждать или не ждать потоков после выполнения всех тестов? Другими словами, как мне изменить приведенный ниже тест, чтобы vstest зависал после его завершения?

 [TestMethod]
public void FreezeVSTest()
{
    var thread = new Thread(
        new ThreadStart(
            delegate
            {
                while (true)
                {
                    Thread.Sleep(1);
                }
            }));
    thread.Start();
}
 

(Обратите внимание, что я не спрашиваю, как заставить тест зависнуть, я знаю, что добавление потока.Join() достигнет этого. Вопрос в том, что сам vstest зависает после прохождения теста.)

Комментарии:

1. Фоновые потоки , подобные вашему, не проблема, передний план вызовет замораживание. В любом случае бесконечный цикл без сигнала при закрытии — плохая идея. Не могли бы вы уточнить, какой тест у вас есть, какая библиотека и т.д.?

2. @Sinatr: цель этого вопроса — не найти решение конкретной проблемы, с которой мы столкнулись напрямую, а скорее понять принципы проблемы. Я надеюсь получить лучшее представление о том, какие ситуации приводят к зависанию vstest, и, надеюсь, это понимание приведет к возможным решениям.

3. Но если вы хотите знать, библиотека из Essential Objects . Мы вызываем его в тесте для преобразования HTML в PDF.

4. @Sinatr: Это не фоновый поток. Может быть, пример не вызывает проблемы, потому что сама переменная потока выходит за пределы области видимости? Попробуйте сохранить экземпляр потока в статическом элементе.

5. @PMF: Я протестировал это, но сохранение ссылки на поток в статическом элементе не имело значения.