Тестирование пользовательского интерфейса в кодировке WPF случайно завершается со странным ArgumentException - PullRequest
0 голосов
/ 27 февраля 2019

Я закодировал тесты пользовательского интерфейса в приложении WPF, и они иногда терпят неудачу со следующим исключением:

Сообщение: метод теста MyMethodNameGoesHere выбросил исключение: System.ArgumentException: параметр недопустим.

и StackTrace:

at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format)
at System.Drawing.Bitmap..ctor(Int32 width, Int32 height)
at Microsoft.VisualStudio.TestTools.UITesting.LoggerUtility.GetDesktopImage()
at Microsoft.VisualStudio.TestTools.UITesting.LoggerUtility.CaptureScreenShotAndDrawBounds(Int32 x, Int32 y, Int32 width, Int32 height, Int32 borderWidth, Boolean isActualControlBounds)
at Microsoft.VisualStudio.TestTools.UITest.Extension.LoggerUtilities.CaptureScreenShotAndDrawBounds(Rectangle bounds, Int32 borderWidth, Boolean isActualControlBounds)
at Microsoft.VisualStudio.TestTools.UITesting.Playback.CaptureScreenShot(UITestControl control)
at Microsoft.VisualStudio.TestTools.UITesting.Playback.GetUITestControlString(UITestControl control)
at Microsoft.VisualStudio.TestTools.UITesting.Playback.MapControlNotFoundException(COMException ex, IPlaybackContext context)
at Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowComException(COMException innerException, IPlaybackContext context)
at Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowException(Exception exception, IPlaybackContext context)
at Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowException(Exception exception, String queryId)
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.FindFirstDescendant(String queryId, Int32 maxDepth, Int32& timeLeft)
at Microsoft.VisualStudio.TestTools.UITesting.SearchHelper.GetElement(Boolean useCache, ISearchArgument searchArg)
at Microsoft.VisualStudio.TestTools.UITesting.SearchHelper.Search(ISearchArgument searchArg)
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.FindInternal()
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.<Find>b__175_0()
at Microsoft.VisualStudio.TestTools.UITesting.CodedUITestMethodInvoker.InvokeMethod[T](Func`1 function, UITestControl control, Boolean firePlaybackErrorEvent, Boolean logAsAction)
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.Find()
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.GetPropertyPrivate(String propertyName)
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.GetPropertyOfType[T](String propertyName)
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.get_Exists()
at MyProjectNamespace.UITests.TestButtonExists() in E:\...\UITests.cs:line 177

Любой код, который пытается получить доступ к свойствам UITestControl, например Exists, Checked или Selected, выбрасывает его.Например:

WpfButton button = UIControlBuilder<WpfButton>.Builder()
    .Parent(MainPane)
    .AutomationID(MyButtonId)
    .Build();

// ...    

Assert.IsTrue(button.Exists);

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

Из моего исследования среда тестирования пользовательского интерфейса ловит исключение в FindFirstDescendant и пытается сделать снимок экрана, чтобы сообщить об этом исключении, но тоже не может этого сделать:

// decompiled UI test framework's UITestControl.cs code
internal UITestControl FindFirstDescendant(string queryId, int maxDepth, ref int timeLeft)
{
    // ...
    try
    {
        element = this.ScreenElement.FindScreenElement(queryId, maxDepth);
    }
    catch (Exception ex) // catches exception here
    {
        // but this method does also throw exception, because of a bug:
        Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowException(ex, queryId); 
        throw;
    }
}

Еще интереснее то, чтоЭто очень общая ошибка, которая возникает в конструкторе .NET Bitmap (неверный параметр width или height?).

Из-за этой проблемы Bitmap я не могу получить исходное исключение, поэтому не могу понять, что происходит.Playback.CaptureScreenShot помечен атрибутом подавления предупреждений компилятора, который четко указывает, что этот метод не должен вызывать никаких исключений.
Это ошибка в структуре тестирования пользовательского интерфейса?

Еще одно интересное наблюдение.Он создает скриншоты в моей тестовой директории, но окно приложения неправильно выделяется на скриншотах.Вот как это выглядит.Красный - моя настройка дисплея, синий - то, где на самом деле находится главное окно, зеленый - то, как WPF выделяет на скриншоте результатов теста:

How screenshot looks like

Расстояние зеленогоузкая линия и синяя узкая линия для углов равны, так что для меня это выглядит так, как будто она берет смещение окна приложения в пределах одного основного дисплея, но затем пытается сделать снимок экрана, применяя смещение ко всем дисплеям.Может ли это быть причиной ошибки (например, выхода за пределы экрана) или это просто другое?

1 Ответ

0 голосов
/ 06 марта 2019

Так как это выглядело как ошибка, я задал тот же вопрос на DeveloperCommunity .

Похоже, что мультиэкран просто не поддерживается:

Спасибо за исследование по этой проблеме.Похоже, вы запускаете тестирование пользовательского интерфейса с несколькими экранами.На самом деле это неподдерживаемый сценарий.

Также кодированный тест пользовательского интерфейса находится в пути устаревания.Проверьте https://docs.microsoft.com/en-us/visualstudio/test/use-ui-automation-to-test-your-code?view=vs-2017

Мы предлагаем перейти на Selenium или Appium с WinAppDriver, в зависимости от ситуации

...