用于测试vim插件的工具

时间:2010-06-12 19:42:45

标签: unit-testing functional-testing vim

我正在寻找一些测试vim脚本的工具。 的vim脚本

  • 进行单元/功能测试,或
  • 一些其他库的类(例如Python的unittest模块),方便了它们
    • 使用参数运行vim,使其对其环境进行一些测试,
    • 从输出中确定是否通过了给定的测试。

我知道有几个vim脚本可以进行单元测试,但是它们有点模糊记录,可能实际上也可能没有用:

vim-unit

  • 声称“为vim脚本提供简单的单元测试框架和工具”
  • 第一个也是唯一一个版本(v0.1)于2004年发布
  • 文件没有提及它是否可靠地工作,除了声明它是“完成的票价[原文如此”。

unit-test.vim

  • 这个看起来也很实验,可能不太可靠。
  • 可能已被遗弃或被搁置:最后一次提交是在2009-11(> 6个月前)
  • 未创建任何已标记的修订(即没有发布)

因此,非常欢迎来自使用这两个现有模块之一的人员的信息,和/或指向其他更明确可用的选项的链接。

7 个答案:

答案 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 VimrunnerRSpec来测试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。至少,这意味着您不必编写自己的AssertEqualsAssertTrue函数。它还有一个很好的功能,它允许你运行当前函数,如果它以“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包含指向视频和文章的链接,以帮助您入门: