Некоторые из этих тестов создают экземпляр формы и выполняют тесты различной логики. Конструктор вызывает InitializeComponent, который выделяет элементы управления, к которым необходим доступ некоторым тестам.
Моя проблема заключается в том, что при запуске агента сборки в действиях github
(локально развернутый Github Enterprise. Все агенты сборки — Windows Server 2019) некоторые тесты выдают «Ошибка создания дескриптора окна» при попытке создать элементы управления. Локально все работает нормально.
Я проверил все очевидные вещи, а также некоторые неочевидные вещи, которые предложил Google.
- Каждый тест использует при создании формы, поэтому я знаю, что все удаляется.
- Я проверил ограничения на дескрипторы пользователя и дескрипторы GDI для каждого процесса, они по умолчанию равны 10 000 на агенте.
- Я добавил проверку в функцию настройки, чтобы каждый модульный тест выводил значение Process.GetCurrentProcess().HandleCount на консоль и, следовательно, отображался в журналах сборки. Со временем происходит небольшое увеличение, но оно достигает максимума около 1250, поэтому на самом деле дескрипторы не заканчиваются.
- Я проверил «кучу рабочего стола», и на моем ноутбуке ситуация такая же, как и в агенте сборки.
- Он без проблем проведет несколько сотен тестов, прежде чем они начнут давать сбой. Как только он начинает давать сбой, они не все терпят неудачу. Некоторые проходят без проблем.
- Я считал, что агент сборки «безголовый» и, возможно, он не может создать форму, потому что нет способа ее отобразить. Но сотни тестов, которые делают одно и то же, работают отлично.
РЕДАКТИРОВАТЬ: Вот пример трассировки стека одного из исключений.
Код: Выделить всё
Error Message:
System.ComponentModel.Win32Exception : Error creating window handle.
Stack Trace:
at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
at System.Windows.Forms.Control.CreateHandle()
at System.Windows.Forms.Control.get_Handle()
at System.Windows.Forms.Control.PointToClientInternal(Point p)
at System.Windows.Forms.DataGridView.UpdateMouseEnteredCell(HitTestInfo hti, MouseEventArgs e)
at System.Windows.Forms.DataGridView.OnColumnHeadersHeightChanged(EventArgs e)
at System.Windows.Forms.DataGridView.SetColumnHeadersHeightInternal(Int32 columnHeadersHeight, Boolean
invalidInAdjustFillingColumns)
at System.Windows.Forms.DataGridView.set_ColumnHeadersHeight(Int32 value)
at READACTED.InitializeComponent() in
C:\ar_0\_work\REDACTED.designer.cs:line 566
at REDACTED.REDACTED() in C:\ar_0\_work\REDACTED.cs:line 82
ОБНОВЛЕНИЕ
Я переместил один из тестовых классов, в котором возникли проблемы, в отдельный тестовый проект, и проблемы для этого класса исчезли. Должна быть какая-то утечка дескрипторов, хотя я определенно избавляюсь от вещей, созданных в модульном тесте. Теперь я подозреваю, что сама форма создает что-то, что не удаляется с помощью Dispose формы. Или даже глубже.