TestStack.White 受系统忙状态影响的菜单操作
TestStack.White Menu Operations Affected by System Busy State
这是 Windows 10 UI 通过 nunit3.ConsoleRunner
进行的自动化测试。
这真的很奇怪,但在我假期前完美运行的相同代码现在挂起长达 2 小时或更长时间。我为我们的测试创建了自己的 MenuClick()
方法,因为标准 MenuBar.MenuItem()
方法在导航过去的二级菜单项时也经常挂起。正如我所说,我的方法在我假期前很有效。
不管怎样,现在Menu.SubMenu()
调用经常需要2个小时或更长时间才能完成,这是不可接受的。
另外一点奇怪的是,测试代码成对单击第 3 级菜单项,它们都在其中打开“浏览文件夹”对话框。第一个 select 源文件夹,另一个 select 目标文件夹。 "hang" 仅在尝试获得第 2 级 submenu
时发生(到目前为止)在一对第 3 级菜单项点击中的第二个 submenu
。
目前为了解决这个问题,我生成了一个调用 menu = menuBar.MenuItem() 的新线程。在主线程中,我等待菜单为非空或超时发生,然后再继续检查之间的 500 毫秒睡眠。这至少让我可以重试。但是,出现这种情况时,整个被测应用程序中的其余菜单操作都被挂起,所以我无法重试。似乎是 TestStack.White 菜单处理区域中的错误。
public static void GetSubMenu(object obj)
{
string[] menuNames = obj as string[];
menu = menuBar.MenuItem(menuNames);
}
private static MenuBar menuBar = null;
private static Menu menu = null;
public static int ClickMenu(MenuBar mainMenu, params string[] menuItems)
{
menuBar = mainMenu;
bool bDone = false;
menu = null;
System.Threading.Thread t = new System.Threading.Thread(GetSubMenu);
t.Start(menuItems);
System.Threading.Thread.Sleep(500);
DateTime timeOut = DateTime.Now + TimeSpan.FromSeconds(10);
while (menu == null && DateTime.Now < timeOut)
{
System.Threading.Thread.Sleep(500);
}
if (menu != null)
{
menu.Click();
bDone = true;
log.Info($"ClickMenu success");
}
t.Abort();
return bDone ? 1 : 2;
}
好的,我确定 TestStack.White
菜单操作容易受到系统繁忙状态的影响,在这种状态下,尝试执行操作的线程没有足够的时间片来工作,因此可以采取非常非常长的时间。
将工作线程优先级设置为 ThreadPriority.Highest
是我实现测试套件 ClickMenu()
方法的关键,如下所示:
public static class Util
{
static log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private static MenuBar menuBar = null;
public static void MenuItem(object obj)
{
string[] path = obj as string[];
menuBar.MenuItem(path).Click();
}
public static void ClickMenu(MenuBar mainMenu, params string[] menuItems)
{
menuBar = mainMenu;
System.Threading.Thread t = new System.Threading.Thread(MenuItem);
t.Priority = System.Threading.ThreadPriority.Highest;
t.Start(menuItems);
DateTime startTime = DateTime.Now;
while (t.IsAlive)
{
System.Threading.Thread.Sleep(100);
}
DateTime endTime = DateTime.Now;
TimeSpan duration = endTime - startTime;
if (duration.Seconds > 60)
{
log.Info($"Menu Operation duration = {duration.Seconds} sec");
}
}
}
这是 Windows 10 UI 通过 nunit3.ConsoleRunner
进行的自动化测试。
这真的很奇怪,但在我假期前完美运行的相同代码现在挂起长达 2 小时或更长时间。我为我们的测试创建了自己的 MenuClick()
方法,因为标准 MenuBar.MenuItem()
方法在导航过去的二级菜单项时也经常挂起。正如我所说,我的方法在我假期前很有效。
不管怎样,现在Menu.SubMenu()
调用经常需要2个小时或更长时间才能完成,这是不可接受的。
另外一点奇怪的是,测试代码成对单击第 3 级菜单项,它们都在其中打开“浏览文件夹”对话框。第一个 select 源文件夹,另一个 select 目标文件夹。 "hang" 仅在尝试获得第 2 级 submenu
时发生(到目前为止)在一对第 3 级菜单项点击中的第二个 submenu
。
目前为了解决这个问题,我生成了一个调用 menu = menuBar.MenuItem() 的新线程。在主线程中,我等待菜单为非空或超时发生,然后再继续检查之间的 500 毫秒睡眠。这至少让我可以重试。但是,出现这种情况时,整个被测应用程序中的其余菜单操作都被挂起,所以我无法重试。似乎是 TestStack.White 菜单处理区域中的错误。
public static void GetSubMenu(object obj)
{
string[] menuNames = obj as string[];
menu = menuBar.MenuItem(menuNames);
}
private static MenuBar menuBar = null;
private static Menu menu = null;
public static int ClickMenu(MenuBar mainMenu, params string[] menuItems)
{
menuBar = mainMenu;
bool bDone = false;
menu = null;
System.Threading.Thread t = new System.Threading.Thread(GetSubMenu);
t.Start(menuItems);
System.Threading.Thread.Sleep(500);
DateTime timeOut = DateTime.Now + TimeSpan.FromSeconds(10);
while (menu == null && DateTime.Now < timeOut)
{
System.Threading.Thread.Sleep(500);
}
if (menu != null)
{
menu.Click();
bDone = true;
log.Info($"ClickMenu success");
}
t.Abort();
return bDone ? 1 : 2;
}
好的,我确定 TestStack.White
菜单操作容易受到系统繁忙状态的影响,在这种状态下,尝试执行操作的线程没有足够的时间片来工作,因此可以采取非常非常长的时间。
将工作线程优先级设置为 ThreadPriority.Highest
是我实现测试套件 ClickMenu()
方法的关键,如下所示:
public static class Util
{
static log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private static MenuBar menuBar = null;
public static void MenuItem(object obj)
{
string[] path = obj as string[];
menuBar.MenuItem(path).Click();
}
public static void ClickMenu(MenuBar mainMenu, params string[] menuItems)
{
menuBar = mainMenu;
System.Threading.Thread t = new System.Threading.Thread(MenuItem);
t.Priority = System.Threading.ThreadPriority.Highest;
t.Start(menuItems);
DateTime startTime = DateTime.Now;
while (t.IsAlive)
{
System.Threading.Thread.Sleep(100);
}
DateTime endTime = DateTime.Now;
TimeSpan duration = endTime - startTime;
if (duration.Seconds > 60)
{
log.Info($"Menu Operation duration = {duration.Seconds} sec");
}
}
}