int*_*ted 37 vim unit-testing functional-testing
我正在寻找一些测试vim脚本的工具.要么是vim脚本那么
我知道有几个vim脚本进行单元测试,但是它们有点模糊记录,可能实际上可能有用,也可能没用:
因此,非常欢迎来自使用这两个现有模块之一的人员的信息,和/或指向其他更明确可用的选项的链接.
Jus*_*yes 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
Run Code Online (Sandbox Code Playgroud)
如果您打开了测试文件,则可以像这样运行它:
:Vader %
Run Code Online (Sandbox Code Playgroud)
或者您可以指向文件路径:
:Vader ./test.vader
Run Code Online (Sandbox Code Playgroud)
Pau*_*cur 11
我已经成功地使用Andrew Radev的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
Run Code Online (Sandbox Code Playgroud)
如果你想要更多细节,我已经在"使用RSpec和Vimrunner测试Travis CI上的Vim插件"中详细介绍了它.
我正在维护另一个(纯VimL)UT插件.
它有记录,它有几个例子,我的其他插件也使用它.
它仅旨在测试功能结果,并在quickfix窗口中显示故障.异常调用堆栈也被解码.AFAIK,它是目前为止(或至少第一个)填充quickfix窗口的唯一插件.从那时起,我添加了帮助程序脚本以生成rspec(+ Vimrunner)的测试结果
请注意,为了测试缓冲区如何使用映射/片段/ ...进行更改,我建议使用其他插件.例如,我使用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]
Run Code Online (Sandbox Code Playgroud)
我以前用过vim-unit
。至少这意味着您不必编写自己的AssertEquals
函数AssertTrue
。它还有一个很好的功能,可以让您运行当前函数(如果它以“Test”开头),方法是将光标放在函数体内并键入:call VUAutoRun()
。
该文档有点不确定且未完成,但如果您有使用其他 XUnit 测试库的经验,它对您来说不会陌生。
提到的两个脚本都没有方法来检查 vim 特定功能 - 您无法更改缓冲区,然后检查结果的预期 - 因此您必须以可测试的方式编写 vim 脚本。例如,将字符串传递到函数中,而不是在getline()
函数本身内部将它们从缓冲区中取出,返回字符串而不是使用setline()
诸如此类的事情。