Unit testing 用于测试vim插件的工具

Unit testing 用于测试vim插件的工具,unit-testing,functional-testing,vim,Unit Testing,Functional Testing,Vim,我正在寻找一些用于测试vim脚本的工具。要么vim脚本 进行单元/功能测试,或 用于其他库(例如Python的模块)的类,这些库使 使用参数运行vim,使其在其环境上执行一些测试,然后 根据输出确定给定测试是否通过 我知道有两个vim脚本可以进行单元测试,但它们的文档记录不清楚,可能有用,也可能不有用: : 声称“为vim脚本提供一个简单的单元测试框架和工具” 第一个也是唯一一个版本(v0.1)于2004年发布 文档中并没有提到它是否可靠工作,只是说它是“从完成到完成” : 这一个

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

  • 进行单元/功能测试,或
  • 用于其他库(例如Python的模块)的类,这些库使
    • 使用参数运行vim,使其在其环境上执行一些测试,然后
    • 根据输出确定给定测试是否通过
我知道有两个vim脚本可以进行单元测试,但它们的文档记录不清楚,可能有用,也可能不有用:

:

  • 声称“为vim脚本提供一个简单的单元测试框架和工具”
  • 第一个也是唯一一个版本(v0.1)于2004年发布
  • 文档中并没有提到它是否可靠工作,只是说它是“从完成到完成”
:

  • 这一个似乎也相当实验性,可能不是特别可靠
  • 可能已被放弃或搁置:上次提交是在2009-11年(超过6个月前)
  • 没有创建带标签的修订(即没有发布)

因此,非常欢迎使用这两个现有模块中的一个模块的用户提供信息和/或链接到其他更清晰可用的选项。

我以前使用过
vim单元。至少这意味着您不必编写自己的
AssertEquals
AssertTrue
函数。它还有一个很好的功能,如果当前函数以“Test”开头,则可以通过将光标放在函数体中并键入
:call vuautrun()
来运行当前函数

文档有点不确定,也没有完成,但是如果您有其他XUnit测试库的经验,您对它并不陌生

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

我正在维护另一个(纯Vimscript)

它是有文档记录的,有几个例子,我的其他插件也使用它

它旨在测试功能结果和缓冲区内容,并在quickfix窗口中显示故障。异常调用堆栈也被解码。好吧,这是目前为止唯一一个(至少是第一个)用来填充quickfix窗口的插件。从那以后,我添加了助手脚本,用rspec(+Vimrunner)生成测试结果

自v2.0(2020年5月)以来,该插件还可以测试缓冲区内容——在它被映射/代码片段/更改之后。。。。到那时为止,我一直在使用其他插件。例如,我曾经用VimRuns+RSPEC.</P>测试特拉维斯上的C++片段(从LH CPP)。 关于语法,例如:

Assert 1 > 2
Assert 1 > 0
Assert s:foo > s:Bar(g:var + 28) / strlen("foobar")

debug AssertTxt (s:foo > s:Bar(g:var+28)
      \, s:foo." isn't bigger than s:Bar(".g:var."+28)")
AssertEquals!('a', 'a')
AssertDiffers('a', 'a')
let dict = {}
AssertIs(dict, dict)
AssertIsNot(dict, dict)
AssertMatch('abc', 'a')
AssertRelation(1, '<', 2)
AssertThrows 0 + [0]
(在quickfix窗口中点击
D
,将在一个新选项卡中打开在diff模式下产生的结果和预期结果)

我已经成功地结合使用来测试两个Vim插件并在持续集成服务器上设置它们

简而言之,Vimrunner使用Vim的客户机服务器功能启动Vim服务器,然后发送远程命令,以便您可以检查(和验证)结果。这是一个RubyGem,所以您至少需要熟悉Ruby,但是如果您投入时间,那么您就可以充分利用RSpec来编写测试

例如,一个名为
spec/runspec.vim_spec.rb
的文件:

需要“vimrunner”
需要“fileutils”
描述“runspec.vim”的用法
在(:suite)之前做什么
VIM=Vimrunner.start\u gui\u VIM
添加插件(File.expand\u路径(“../…”、“\u文件”、“plugin/runspec.VIM”)
结束
在…之后做
维姆·基尔
结束
它“如果以_test.rb结尾,则返回当前路径”do
echo('runspec#SpecPath(“foo_test.rb”))。应该==“foo_test.rb”
echo('runspec#SpecPath(“bar/foo_test.rb”))。应该==“bar/foo_test.rb”
结束
上下文“带有规范目录”do
在做之前
FileUtils.mkdir(“spec”)
结束
事后
FileUtils.remove\u entry\u secure(“规范”)
结束
它“查找具有相同名称的规范”是否执行
FileUtils.touch(“spec/foo_spec.rb”)
echo('runspec#SpecPath(“foo.rb”))。应该==“spec/foo#u spec.rb”
结束
结束
结束
我在《如果你想了解更多细节的话》一书中详细介绍了这一点。

很简单,也很神奇。它没有外部依赖项(不需要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 ./test.vader

另外几个候选人:

-与VimRunner类似,它是用Ruby编写的,允许您远程控制vim实例。是为与单元测试框架RSpec一起使用而构建的


-与VimBot相同,不同之处在于使用Python而不是Ruby(从VimBot作为直接端口启动),因此如果您更熟悉Python的单元测试框架,可以使用它。

对于功能测试,有一个工具称为。它有一些局限性,可能需要几秒钟到几分钟才能完成一个规模良好的项目的全面测试,但它有一个很好的测试/文档格式,支持vim语法突出显示

它用于测试插件和一些类似的项目。您可以查看那里的vroom/dir作为示例。

那里有。 您的测试是用vimscript编写的,您可以使用BDD样式(descripe、it、expect等)编写它们

GitHub提供了一个视频和一篇文章的链接,可以帮助您入门:

  • [视频]
  • [文章]

是否支持配置vim启动?例如,我可以指定只加载一个特定的插件吗?不可以,但是你可以用--noplugin和-u来伪装它
tests/lh/README.vim|78 error| assertion failed: Observed buffer does not match Expected reference:
|| ---
|| +++
|| @@ -1,3 +1,3 @@
||  1
|| -4
|| +2
||  3
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
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