Автоматическое тестирование действий в пользовательском режиме на агенте сборки TFS - PullRequest
0 голосов
/ 30 января 2012

Я пишу приложение, которое реагирует на действия клавиатуры.Чтобы автоматизировать тестирование, я написал симулятор клавиатуры, который использует User32.dll / SendInput для автоматизации нажатий и отпусканий клавиш.Этот подход прекрасно работает на локальном компьютере разработчика, но завершается неудачно при регистрации и запуске на агенте сборки TFS.Я предполагаю, что действия в пользовательском режиме обрабатываются не так, как ожидалось, поскольку они выполняются как служба.Есть ли способ автоматизации нажатий и выпусков клавиатуры, который совместим с автоматическим тестированием в качестве службы?

Настройка: размещенный TFS (tfspreview.com) Visual Studio 2010 Ultimate MSTest, xUnit.NET Windows 7 Pro (dev)Windows 2008 R2 (контроллер сборки / агент сборки)

Код обидования:

Контрольный пример:

            KeyboardSimulator.PressKey(Keys.A);

Симулятор клавиатуры:

    public static void PushKeyDown(Keys key)
    {
        SendKeyboardInput(key, (uint)FLAGS.NONE);
    }

    public static void ReleaseKey(Keys key)
    {
        SendKeyboardInput(key, (uint)FLAGS.KEYUP);
    }

    public static void PressKey(Keys key)
    {
        PushKeyDown(key);
        ReleaseKey(key);
    }

    #region Internals

    private static KEYBDINPUT createKeybdInput(Keys key, uint flag)
    {
        KEYBDINPUT i = new KEYBDINPUT();
        i.wVk = (ushort)key;
        i.wScan = 0;
        i.time = 0;
        i.dwExtraInfo = IntPtr.Zero;
        i.dwFlags = flag;
        return i;
    }

    private static void SendKeyboardInput(Keys key, uint flag)
    {
        INPUT[] inputs = new INPUT[1];
        inputs[0].type = INPUT_KEYBOARD;
        inputs[0].ki = createKeybdInput(key, flag);
        uint intReturn = SendInput(1, inputs, System.Runtime.InteropServices.Marshal.SizeOf(inputs[0]));
        if (intReturn != 1) throw new ApplicationException("Could not send key");
    }

    [DllImport("User32.dll")]
    private static extern uint SendInput(uint numberOfInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] input, int structSize);

1 Ответ

4 голосов
/ 30 января 2012

Сервер Team Foundation Build по умолчанию работает как служба Windows. Как вы уже догадались, это означает, что он не может взаимодействовать с рабочим столом (у него нет).

Вам необходимо настроить службу сборки для запуска в интерактивном режиме . Выполните следующие действия:

  1. Откройте консоль администрирования TFS,
  2. Выберите конфигурацию сборки,
  3. Нажмите Свойства на BuildService
  4. Выбрать Run build service as: Interactive Process

Конечно, вам нужно оставаться на этой машине в течение всего времени. Если это отдельный сервер сборки, вы можете настроить автоматический вход в систему и добавить TfsBuildServiceHost.exe в список автоматического запуска. При такой конфигурации вам не нужно будет снова входить в нее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...