【发布时间】:2012-01-30 12:04:56
【问题描述】:
我正在编写一个响应键盘操作的应用程序。为了自动化测试,我编写了一个键盘模拟器,它使用 User32.dll / SendInput 来自动化按键和释放。这种方法在本地开发人员机器上运行良好,但在签入并在 TFS 构建代理上运行时会失败。我的猜测是用户模式活动没有按预期得到处理,因为它是作为服务运行的。是否有与自动化测试即服务兼容的自动化键盘按下和释放方法?
设置: 托管 TFS (tfspreview.com) Visual Studio 2010 终极版 MSTest,xUnit.NET Windows 7 专业版(开发版) 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);
【问题讨论】:
标签: c# unit-testing tfs keyboard