我正在寻找一些测试vim脚本的工具。 我知道有几个vim脚本可以进行单元测试,但是它们有点模糊记录,可能实际上也可能没有用: 因此,非常欢迎来自使用这两个现有模块之一的人员的信息,和/或指向其他更明确可用的选项的链接。
答案 0 :(得分:15)
vader.vim很简单,也很棒。它有没有外部依赖(不需要ruby / rake),它是一个纯粹的vimscript插件。这是一个完全指定的测试:
Given (description of test):
foo bar baz
Do (move around, insert some text):
2Wiab\<Enter>c
Expect:
foo bar ab
cbaz
如果您打开了测试文件,可以像这样运行:
:Vader %
或者您可以指向文件路径:
:Vader ./test.vader
答案 1 :(得分:10)
我成功地使用Andrew Radev's Vimrunner和RSpec来测试Vim插件并在持续集成服务器上设置它们。
简而言之,Vimrunner使用Vim的客户端 - 服务器功能启动Vim服务器,然后发送远程命令,以便您可以检查(并验证)结果。它是一个Ruby宝石,所以你至少需要熟悉一些Ruby,但是如果你把时间花在那时你就可以获得RSpec的全部功能来编写你的测试。
例如,名为spec/runspec.vim_spec.rb
的文件:
require "vimrunner"
require "fileutils"
describe "runspec.vim" do
before(:suite) do
VIM = Vimrunner.start_gui_vim
VIM.add_plugin(File.expand_path('../..', __FILE__), 'plugin/runspec.vim')
end
after(:all) do
VIM.kill
end
it "returns the current path if it ends in _test.rb" do
VIM.echo('runspec#SpecPath("foo_test.rb")').should == "foo_test.rb"
VIM.echo('runspec#SpecPath("bar/foo_test.rb")').should == "bar/foo_test.rb"
end
context "with a spec directory" do
before do
FileUtils.mkdir("spec")
end
after do
FileUtils.remove_entry_secure("spec")
end
it "finds a spec with the same name" do
FileUtils.touch("spec/foo_spec.rb")
VIM.echo('runspec#SpecPath("foo.rb")').should == "spec/foo_spec.rb"
end
end
end
如果你想要更多细节,我已经在"Testing Vim Plugins on Travis CI with RSpec and Vimrunner"详细地写了这篇文章。
答案 2 :(得分:8)
我正在维护另一个(纯VimL)UT plugin。
据记载,它附带了几个示例,我的其他插件也使用它。
它的目的只是测试功能结果,并在quickfix窗口中显示故障。异常调用堆栈也被解码。 AFAIK,它是目前为止(或至少第一个)填充quickfix窗口的唯一插件。从那时起,我添加了助手脚本以使用rspec(+ Vimrunner)生成测试结果
请注意,为了测试缓冲区如何使用mappings / snippets / ...进行更改,我建议使用其他插件。例如,我使用VimRunner + RSpec在travis上测试我的C ++片段(来自lh-cpp)。
关于语法,它看起来像这样:
" Old way, to test boolean expressions
Assert 1 > 2
Assert 1 > 0
Assert s:foo > s:Bar(g:var + 28) / strlen("foobar")
AssertTxt! (s:foo > s:Bar(g:var+28),
\, s:foo." isn't bigger than s:Bar(".g:var."+28)")
" New, recommended way to test relations
AssertEquals('a', 'a')
AssertDiffers('a', 'b')
let dict = {}
AssertIs(dict, dict)
AssertMatch('abc', 'a')
AssertRelation(1, '<', 2)
AssertThrows 0 + [0]
答案 3 :(得分:3)
我之前使用过vim-unit
。至少,这意味着您不必编写自己的AssertEquals
和AssertTrue
函数。它还有一个很好的功能,它允许你运行当前函数,如果它以“Test”开头,将光标放在函数体中并键入:call VUAutoRun()
。
文档有点不确定和未完成,但如果您有其他XUnit测试库的经验,那么您将不会对此感到陌生。
所提到的脚本都没有办法检查vim特定功能 - 你不能更改缓冲区然后检查结果的期望 - 所以你必须以可测试的方式编写你的vimscript。例如,将字符串传递给函数而不是将它们从函数本身的getline()
中拉出缓冲区,返回字符串而不是使用setline()
,这类事情。
答案 4 :(得分:0)
另外几位候选人:
VimBot - 与VimRunner类似,它用Ruby编写,允许您远程控制vim实例。构建用于单元测试框架RSpec。
VimDriver - 与VimBot相同,除了在Python而不是Ruby(从VimBot作为直接端口启动)中完成,因此如果您对此更熟悉,可以使用Python的单元测试框架
答案 5 :(得分:0)
对于功能测试,有一个名为vroom的工具。它有一些局限性,可以花费几秒钟到几分钟来完成一个大型项目的全面测试,但它有一个很好的文化测试/文档格式,并带有vim语法高亮支持。
它用于测试codefmt插件和一些类似的项目。你可以查看那里的vroom / dir作为例子。
答案 6 :(得分:0)
有vim-vspec。 您的测试是用vimscript编写的,您可以使用BDD样式编写它们(描述,它,期待,......)
runtime! plugin/sandwich/function.vim
describe 'Adding Quotes'
it 'should insert "" in an empty buffer'
put! = ''
call SmartQuotes("'")
Expect getline(1) == "''"
Expect col('.') == 2
end
end
GitHub包含指向视频和文章的链接,以帮助您入门: