在TFS Build Agent上自动测试用户模式操作

时间:2012-01-30 12:04:56

标签: c# unit-testing tfs keyboard

我正在编写一个响应键盘操作的应用程序。为了自动化测试,我编写了一个键盘模拟器,它使用User32.dll / SendInput来自动按键和释放。此方法在本地开发人员计算机上正常工作,但在签入并在TFS构建代理上运行时失败。我的猜测是用户模式活动没有按预期处理,因为它是作为服务运行的。有没有办法自动化与自动化测试即服务兼容的键盘按下和发布?

设定: 托管TFS(tfspreview.com) Visual Studio 2010 Ultimate MSTest,xUnit.NET Windows 7 Pro(开发) 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 个答案:

答案 0 :(得分:4)

默认情况下,Team Foundation Build服务器作为Windows服务运行。正如您所猜测的那样,这意味着它无法与桌面交互(它没有)。

您需要将构建服务配置为以交互模式运行。请按照以下步骤操作:

  1. 打开TFS管理控制台
  2. 选择构建配置,
  3. 单击BuildService上的“属性”
  4. 选择Run build service as: Interactive Process
  5. 当然,您需要在此期间保持登录该计算机。如果它是单独的构建服务器,则可以配置自动登录并将TfsBuildServiceHost.exe添加到自动启动列表中。使用此配置,您无需再次登录。