我正在编写一个响应键盘操作的应用程序。为了自动化测试,我编写了一个键盘模拟器,它使用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);
答案 0 :(得分:4)
默认情况下,Team Foundation Build服务器作为Windows服务运行。正如您所猜测的那样,这意味着它无法与桌面交互(它没有)。
您需要将构建服务配置为以交互模式运行。请按照以下步骤操作:
Run build service as: Interactive Process
当然,您需要在此期间保持登录该计算机。如果它是单独的构建服务器,则可以配置自动登录并将TfsBuildServiceHost.exe
添加到自动启动列表中。使用此配置,您无需再次登录。