如何将密钥输入终端以进行单元测试
Posted
技术标签:
【中文标题】如何将密钥输入终端以进行单元测试【英文标题】:How can I feed keys in to a terminal for unittesting purposes 【发布时间】:2017-04-01 02:20:06 【问题描述】:我正在为 Vim 开发一个插件,我想测试它在启动时的行为是否正确,当用户编辑文件等时
为此,我想启动一个终端,并将密钥输入其中。 我正在考虑从 python 脚本中完成这一切。有没有办法做到这一点?
在伪 python 中它可能看起来像这样:
#start a terminal. Here konsole
konsole = os.system('konsole --width=200 --height=150')
#start vim in that terminal
konsole.feed_keys("vim\n")
#run the vim function to be tested
konsole.feed_keys(":let my_list = MyVimFunction()\n")
#save the return value to the file system
konsole.feed_keys(":writefile(my_list, '/tmp/result')\n")
#load result into python
with open('/tmp/result', 'r') as myfile:
data = myfile.read()
#validate the result
assertEqual('expect result', data)
【问题讨论】:
【参考方案1】:我认为您应该使用单元测试在 Vim 中验证插件的核心功能。 Vim 插件种类繁多,但大多数都提供了一些额外的映射或命令,供用户调用,它们通常会在缓冲区、输出或打开的窗口中留下一些副作用。这可以从 Vim 内部验证。有多种方法,我的是runVimTests test framework;插件页面有几个选项的链接。
有了如此覆盖的核心功能,几乎没有什么可以“交互式”测试了。 (我的意思是诸如忘记调试输出、执行时间过长、显示混乱等问题。)由于您通常是 Vim 和您的插件的重度用户,因此大部分内容都涵盖了。
当然,如果您的插件将自己紧密嵌入到 Vim 中(例如“XXX IDE”;尽管这通常不受欢迎),您可以考虑使用一些外部测试驱动程序。也许其他人会为一些通用的、终端驱动的测试框架提供指针。我几乎可以肯定这样的存在。
【讨论】:
您和 Luc Hermitte 提供的非常有用的答案。我已将此答案设置为接受,因为这更接近我决定做的事情。我将所有测试代码放在一个 .vimrc 文件中,然后将其复制到 tempdir。然后我像这样启动 vim:cd $tmpdir && HOME=. vim -X
然后我在 vim8-timer 上开始实际测试,因此在加载插件之后。
谢谢,祝测试愉快;从一开始就系统地执行此操作具有不可否认的好处!你的方法听起来不错;如果你不想依赖 Vim 8,你也可以使用:autocmd VimEnter * call StartTests()
来触发它们。
autocmd 的好主意,但脚本无论如何都需要 vim8 :-)【参考方案2】:
虽然我正在维护一个plugin,它允许对 VimL 函数运行单元测试并将结果提供给 quickfix 窗口,但我使用另外几个工具在一些操作后检查缓冲区的状态,甚至运行来自 travis -> vimrunner+rspec 的东西,以及用于安装依赖项的 VimFlavour。 (我依稀记得一个受 vimrunner 启发的 Python 替代方案)
它大多运作良好。唉,它使用客户端-服务器功能和:redir
(而不是更新的execute()
功能)。即使使用:silent
,:redir
也会捕捉到返回给客户端的噪音。因此,有时我会与因非常奇怪的原因而失败的测试作斗争。我还发现自己插入了一些伪暂停,以确保 Vim 已经完成了对我输入的内容的解释。
您会在我的一些插件中找到使用示例。参见例如 lh-brackets 或 lh-cpp 测试(.travis.yml
文件 + .rspec/
目录 + Rakefile
+ Gemfile
+ 来自 vim-UT 的一些助手)
【讨论】:
以上是关于如何将密钥输入终端以进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章