【问题标题】:tools for testing vim plugins用于测试 vim 插件的工具
【发布时间】:2011-03-03 01:46:46
【问题描述】:

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

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

我知道有几个 vim 脚本可以进行单元测试,但它们的文档有点模糊,可能真的有用,也可能没用:

vim-unit:

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

unit-test.vim:

  • 这个似乎也很实验性,可能不是特别可靠。
  • 可能已被放弃或搁置:最后一次提交是在 2009-11 年(> 6 个月前)
  • 没有创建标记修订(即没有发布)

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

【问题讨论】:

    标签: unit-testing functional-testing vim


    【解决方案1】:

    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
    

    【讨论】:

    • 最重要的是作者快速回复问题。
    【解决方案2】:

    我已经成功使用 Andrew Radev's VimrunnerRSpec 来测试 Vim 插件并将它们设置在持续集成服务器上。

    简而言之,Vimrunner 使用 Vim 的客户端-服务器功能来启动 Vim 服务器,然后发送远程命令,以便您可以检查(和验证)结果。它是一个 Ruby gem,因此您至少需要对 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" 中详细介绍了它。

    【讨论】:

      【解决方案3】:

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

      它已被记录,它带有几个示例,我的其他插件也使用它。

      它旨在测试函数结果和缓冲区内容,并在快速修复窗口中显示失败。异常调用堆栈也被解码。 AFAIK,它是迄今为止唯一(或至少是第一个)旨在填充快速修复窗口的插件。从那时起,我添加了帮助脚本以使用 rspec (+Vimrunner) 生成测试结果

      自 v2.0(2020 年 5 月)以来,该插件还可以测试缓冲区内容——在使用 mappings/sn-ps/.... 对其进行更改之后。直到那时我一直在使用其他插件。例如,我曾经使用 VimRunner+RSpec 在 travis 上测试我的 C++ sn-ps(来自 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]
      

      会产生:

      tests/lh/README.vim|| SUITE <[lh#UT] Demonstrate assertions in README>
      tests/lh/README.vim|27 error| assertion failed: 1 > 2
      tests/lh/README.vim|31 error| assertion failed: s:foo > s:Bar(g:var + 28) / strlen("foobar")
      tests/lh/README.vim|33 error| assertion failed: -1 isn't bigger than s:Bar(5+28)
      tests/lh/README.vim|37 error| assertion failed: 'a' is not different from 'a'
      tests/lh/README.vim|40 error| assertion failed: {} is not identical to {}
      

      或者,如果我们想测试缓冲区内容

      silent! call lh#window#create_window_with('new') " work around possible E36
      try
          " :SetBufferContent a/file/name.txt 
          " or
          SetBufferContent << trim EOF
          1
          3
          2
          EOF
      
          %sort
      
          " AssertBufferMatch a/file/NAME.txt
          " or
          AssertBufferMatch << trim EOF
          1
          4
          3
          EOF
      finally
          silent bw!
      endtry
      

      导致

      tests/lh/README.vim|78 error| assertion failed: Observed buffer does not match Expected reference:
      || ---
      || +++
      || @@ -1,3 +1,3 @@
      ||  1
      || -4
      || +2
      ||  3
      

      (在快速修复窗口中点击D 将在新选项卡中以差异模式打开生成的结果以及预期结果)

      【讨论】:

      • 耶文档!谢谢,我会看看这个。还注意到那里的链接部分列出了其他一些类似的工具。
      • 上述帖子中的链接无效。我认为这(github.com/LucHermitte/vim-UT)是它应该去的地方。
      • 确实如此。谷歌代码关闭后我忘了更新它。谢谢!
      【解决方案4】:

      我以前用过vim-unit。至少这意味着您不必编写自己的AssertEqualsAssertTrue 函数。它还有一个不错的功能,可以让您运行当前函数,如果它以“Test”开头,只需将光标放在函数体中并输入:call VUAutoRun()

      文档有点模糊和未完成,但如果您有使用其他 XUnit 测试库的经验,您不会感到陌生。

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

      【讨论】:

      • 是否支持配置vim启动?例如,我可以指定只加载特定的插件吗?
      • 不,但是如果有问题,您总是可以使用 --noplugin 和 -u 来伪造它。
      【解决方案5】:

      vim-vspec。 您的测试是用 vimscript 编写的,您可以使用 BDD 样式编写它们(describe、it、expect、...)

      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 上有视频和文章的链接,可帮助您入门:

      【讨论】:

        【解决方案6】:

        对于功能测试,有一个名为vroom 的工具。它有一些限制,并且可能需要几秒钟到几分钟的时间才能通过一个大型项目的全面测试,但它具有良好的文字测试/文档格式,支持 vim 语法突出显示。

        它用于测试codefmt 插件和一些类似的项目。您可以在那里查看 vroom/ 目录以获取示例。

        【讨论】:

          【解决方案7】:

          另外几个候选人:

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

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

          【讨论】:

            猜你喜欢
            • 2020-07-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多