#c# #wpf #mvvm #white-framework
#c# #wpf #mvvm #white-framework
Вопрос:
Я реализовал тестовый пример white Framework для одной из функций приложения. Функциональность, которую выполняет тестовый пример, примерно такая: с главного экрана приложения он перейдет на другой экран после нажатия кнопки на главном экране, затем на целевом экране он будет повторно нажимать на кнопку 50 раз, которая выполняет операцию сохранения данных и чтения данных.
Требование тестового примера состояло в том, чтобы проверить надежность приложения, и при выполнении этого тестового примера предполагалось, что он будет выполняться в течение нескольких минут, введенных пользователем.
Значение для конфигурации COREAPPXML.Экземпляр.BusyTimeout = время выполнения, указанное пользователем в минутах * 60000 5000;
Ниже приведен код для тестового примера
[TestMethod]
public void TestcaseName()
{
// Take memory snapshot
Stopwatch sw = new Stopwatch(); // Stopwatch to compare time if it is equals
// or exceeds time enter by user.
sw.Start();
bool needToRepeate = true;
While(needToRepeate)
{
// do white framework code which will execute functionality
if(sw.Elapsed >= time enter by user in minutes)
{
needToRepeate = false;
// Take memory snapshot
sw.stop();
}
}
}
Ниже приведена полная трассировка стека
TestStack.White.UIItems.UIActionException: Window didn't respond, after waiting for X ms ---> System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Diagnostics.NtProcessInfoHelper.GetProcessInfos(IntPtr dataPtr)
at System.Diagnostics.NtProcessInfoHelper.GetProcessInfos()
at System.Diagnostics.ProcessManager.GetProcessInfos(String machineName)
at System.Diagnostics.Process.EnsureState(State state)
at System.Diagnostics.Process.get_Threads()
at MS.Internal.Automation.HwndProxyElementProvider.System.Windows.Automation.Provider.IWindowProvider.WaitForInputIdle(Int32 milliseconds)
at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
at MS.Internal.Automation.UiaCoreApi.CheckError(Int32 hr)
at TestStack.White.UIItems.WindowItems.Window.WaitForWindow() in c:TeamCitybuildAgentwork89a20b30302799esrcTestStack.WhiteUIItemsWindowItemsWindow.cs:line 223
at TestStack.White.UIItems.WindowItems.Window.WaitWhileBusy() in c:TeamCitybuildAgentwork89a20b30302799esrcTestStack.WhiteUIItemsWindowItemsWindow.cs:line 184
--- End of inner exception stack trace ---
at TestStack.White.UIItems.WindowItems.Window.WaitWhileBusy() in c:TeamCitybuildAgentwork89a20b30302799esrcTestStack.WhiteUIItemsWindowItemsWindow.cs:line 191
at TestStack.White.UIItems.Actions.Action.Handle(Window window) in c:TeamCitybuildAgentwork89a20b30302799esrcTestStack.WhiteUIItemsActionsAction.cs:line 17
at TestStack.White.UIItems.WindowItems.Window.ActionPerformed(Action action) in c:TeamCitybuildAgentwork89a20b30302799esrcTestStack.WhiteUIItemsWindowItemsWindow.cs:line 254
at TestStack.White.InputDevices.Mouse.ActionPerformed(ActionListener actionListener) in c:TeamCitybuildAgentwork89a20b30302799esrcTestStack.WhiteInputDevicesMouse.cs:line 190
at TestStack.White.InputDevices.Mouse.Click(Point point, ActionListener actionListener) in c:TeamCitybuildAgentwork89a20b30302799esrcTestStack.WhiteInputDevicesMouse.cs:line 185
at TestStack.White.UIItems.UIItem.PerformClick() in c:TeamCitybuildAgentwork89a20b30302799esrcTestStack.WhiteUIItemsUIItem.cs:line 265
at TestStack.White.UIItems.UIItem.PerformIfValid(Action action) in c:TeamCitybuildAgentwork89a20b30302799esrcTestStack.WhiteUIItemsUIItem.cs:line 242
at TestStack.White.UIItems.UIItem.Click() in c:TeamCitybuildAgentwork89a20b30302799esrcTestStack.WhiteUIItemsUIItem.cs:line 231
at TestStack.White.Bricks.DelegateInvoker.VoidActionInvokerWrapper.Call(Object[] args) in c:TeamCitybuildAgentwork89a20b30302799esrcTestStack.WhiteBricksDelegateInvoker.cs:line 309
at TestStack.White.Bricks.DynamicProxyInterceptors.Process(IInvocation invocation, CoreInterceptContext interceptedContext) in c:TeamCitybuildAgentwork89a20b30302799esrcTestStack.WhiteBricksDynamicProxyInterceptors.cs:line 21
at TestStack.White.Interceptors.CoreInterceptor.Intercept(IInvocation invocation) in c:TeamCitybuildAgentwork89a20b30302799esrcTestStack.WhiteInterceptorsCoreInterceptor.cs:line 31
at Castle.DynamicProxy.AbstractInvocation.Proceed()
at Castle.Proxies.ButtonProxy.Click()
Фактические результаты:
Произошла ошибка при непрерывном запуске тестового примера в течение 7 дней, она будет прерываться на 3-й день, зарегистрированное сообщение об ошибке «Окно не ответило, после ожидания X мс».
где X — значение, введенное пользователем, преобразованное в миллисекунды.
Ожидаемый результат: он должен запустить тестовый пример без каких-либо ошибок.
Я пытаюсь выяснить, почему исключение OutOfMemory генерируется white framework.
Кто-нибудь может мне помочь в этом, пожалуйста
Заранее спасибо
Комментарии:
1. Очевидно, что у вас утечка памяти, независимо от того, находится ли она в вашем коде или в используемой вами платформе, невозможно определить без фактического кода. Я бы предложил попробовать профилировать тестовый пример и посмотреть, что увеличивает объем памяти.
2. @gpro: Большое вам спасибо за предложение и быстрый ответ, я провел исследование по этой теме и нашел статью » automationrhapsody.com/tag/teststack-white » в котором говорится, что white framework может вызвать проблему с памятью при увеличении количества тестовых примеров. Но описанное решение невозможно реализовать в моем текущем требовании. Если у вас есть решение получше, чем упомянуто в статье, пожалуйста, предложите, это будет действительно полезно.
3. Обычно я использую сборку Visual Studio в профилировщике и использую только расширенные, если это не удается. Вы можете получить основы отсюда: Измерение производительности приложения . Если он недостаточно мощный, то для более глубоких проверок доступно больше инструментов.