如何模拟键盘输入到控制台应用程序?

时间:2011-09-28 22:22:33

标签: bash testing automated-tests

我在bash中开发了一个应用程序,它使用“whiptail”在终端中显示对话框。 (我个人不喜欢这种UI,但我只是一个开发者,我不做决定......)。无论如何,现在我必须测试它,我想模拟键入值的用户,按“Enter”,“Echap”,“Tab”,“向下箭头”,“向上箭头”

我没有期待正常工作,似乎无法实现(http://oldsite.debianhelp.org/node/11812)。

编辑:机器上没有X,所以xdotool不合适。我正在寻找一种不需要安装任何东西的解决方案(因为我们不允许将程序添加到系统中进行测试)。

长篇故事简短,我正在寻找一个解决方案,比如“在进程的stdin中写入字节”或“在/ dev中的键盘设备上写”,就像那样。

由于

2 个答案:

答案 0 :(得分:2)

你应该能够传入像

这样的输入文件
 $ yourscript.sh < inputfile

答案 1 :(得分:1)

您的Bash应用程序需要pseudo terminal才能正常运行。它需要屏幕大小和光标位置,但如果您使用管道输入(<|)运行它,则不会创建伪终端。

伪终端在Unix中由sshxtermscreen等日常应用程序创建。 (Expect会为您的应用创建一个伪终端,并允许您运行自动化测试。它支持使用autoexpect生成测试,并且using Expect for terminal screen-scraping上有一篇论文。)

如果您无法使用Expect,可以尝试使用screen进行自动终端I / O:

# Create a detached screen
screen -S screenname -d -m -s ./my_app

# Send input to it
screen -S screenname -p windownum -X eval \
  "register . \"arbitrary\ntext, newlines and control chars\n\"" paste

# Wait for the application to process the input
sleep 0.1s

# Dump the screen to a file
screen -S screenname -p windownum -X hardcopy ./screen_dump

# Check the dump
grep 'Login successful' ./screen_dump || exit 1

# Rinse and repeat

# Close the screen
screen -S screenname -X quit