TestStack.White Работа с меню в зависимости от состояния занятости системы - PullRequest
0 голосов
/ 07 января 2019

Это автоматическое тестирование пользовательского интерфейса Windows 10 через nunit3.ConsoleRunner.

Это действительно довольно странно, но тот же код, который работал безупречно до моего отпуска, теперь зависает до 2 часов и более. Я создал свой собственный метод MenuClick() для наших тестов, потому что стандартный метод MenuBar.MenuItem() также часто зависал при навигации по пунктам меню 2-го уровня. Мой метод работал хорошо до моего отпуска, как я уже сказал.

Во всяком случае, теперь, Menu.SubMenu() вызов часто занимает 2 часа или более, чтобы завершить, что недопустимо.

Еще одна странность в том, что тестовый код щелкает элементы меню 3-го уровня попарно, где они оба открывают диалоговое окно «Обзор папки». Первый, чтобы выбрать исходную папку, а другой, чтобы выбрать папку назначения. «Зависание» происходит ТОЛЬКО (пока) при попытке получить 2-й уровень submenu для второго в паре щелчков по пунктам меню 3-го уровня.

Чтобы обойти это в настоящее время, я создаю новый поток, который вызывает 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;
}

1 Ответ

0 голосов
/ 09 января 2019

ОК, я определил, что операции меню 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");
        }
    }
}
...