2016-11-17 41 views
2

我正在为Vim开发一个插件,我想在启动时测试它的行为,当用户编辑文件e.t.c.如何将密钥输入到终端进行单元测试

要做到这一点,我想要启动一个终端,并向它提供键。 我正在考虑从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) 

回答

3

我想你应该检查你的插件Vim内部的核心功能,使用单元测试。有各种各样的Vim插件,但大多数提供了一些额外的映射或命令,由用户调用,他们通常会在缓冲区,输出或打开的窗口中留下一些副作用。这可以从Vim内部进行验证。有很多种方法,我的是runVimTests test framework;插件页面有几个选择的链接。

由于涵盖了核心功能,几乎没有什么可以“交互式”测试。 (我的意思是忘记调试输出,执行时间过长,显示混乱等。)由于你通常是Vim的大用户和你自己的插件,所以大部分都会覆盖它。


当然,如果你的插件嵌入自己紧紧地给Vim(像“IDE为XXX”;虽然这通常是令人难以接受的),你可以考虑一些外部的测试车手。也许其他人会为一些通用的,终端驱动的测试框架做出贡献。我几乎可以肯定这样的存在。

+0

非常有用的答案。我已经接受了这个答案,因为这更接近我决定要做的事情。 我把我所有的测试代码放在一个.vimrc文件中,我将它复制到一个tempdir中。 然后我开始像这样的vim: 'cd $ tmpdir && HOME =。 vim -X' 然后,我开始在vim8-timer上进行实际测试,因此在插件加载完成后。 – XPlatformer

+0

谢谢,快乐测试;从一开始就系统地做这件事具有不可否认的好处!你的方法听起来不错;如果你不想依赖Vim版本8,你也可以使用':autocmd VimEnter * call StartTests()'来触发它们。 –

+0

与autocmd的绝妙主意,但剧本无论如何需要vim8 :-) – XPlatformer

2

虽然我保留的plugin允许在VimL函数上运行单元测试并为quickfix窗口提供结果,但我使用另外几个工具在某些操作后检查缓冲区的状态,甚至运行来自travis - > vimrunner + rspec的东西,以及用于安装依赖关系的VimFlavour。 (我隐约记得一个Python替代灵感来自vimrunner)

它大多运作良好。唉它使用客户端服务器功能和:redir(而不是更新的​​函数)。即使使用:silent:redir也会捕获它返回给客户端的噪音。因此有时候我会对非常奇怪的测试失败。我还发现自己插入了一些伪暂停,以确保Vim已经完成了解释我馈送它的内容。

你会在我的一些插件中找到使用的例子。例如,见lh-bracketslh-cpp测试(.travis.yml文件+ .rspec/目录+ Rakefile + Gemfile +从vim-UT一些佣工)从你和Luc Hermitte