用于测试vim插件的工具

int*_*ted 37 vim unit-testing functional-testing

我正在寻找一些测试vim脚本的工具.要么是vim脚本那么

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

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

VIM-单元:

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

unit-test.vim:

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

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

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)

  • 最重要的是,作者迅速回答了问题. (4认同)

Pau*_*cur 11

我已经成功地使用Andrew Radev的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
Run Code Online (Sandbox Code Playgroud)

如果你想要更多细节,我已经在"使用RSpec和Vimrunner测试Travis CI上的Vim插件"中详细介绍了它.


Luc*_*tte 8

我正在维护另一个(纯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)


ric*_*chq 3

我以前用过vim-unit。至少这意味着您不必编写自己的AssertEquals函数AssertTrue。它还有一个很好的功能,可以让您运行当前函数(如果它以“Test”开头),方法是将光标放在函数体内并键入:call VUAutoRun()

该文档有点不确定且未完成,但如果您有使用其他 XUnit 测试库的经验,它对您来说不会陌生。

提到的两个脚本都没有方法来检查 vim 特定功能 - 您无法更改缓冲区,然后检查结果的预期 - 因此您必须以可测试的方式编写 vim 脚本。例如,将字符串传递到函数中,而不是在getline()函数本身内部将它们从缓冲区中取出,返回字符串而不是使用setline()诸如此类的事情。