42

vim スクリプトをテストするためのツールを探しています。いずれかのvimスクリプト

  • ユニット/機能テストを行う、または
  • 便利にする他のライブラリ (Python のunittestモジュールなど) のクラス
    • その環境でいくつかのテストを実行させるパラメーターを指定して vim を実行し、
    • 出力から、特定のテストに合格したかどうかを判断します。

単体テストを行う vim スクリプトがいくつかあることは知っていますが、それらは漠然と文書化されており、実際に役立つ場合とそうでない場合があります。

vim-ユニット:

  • 「vim スクリプトに単純な単体テスト フレームワークとツールを提供すること」を目的としています。
  • 最初で唯一のバージョン (v0.1) は 2004 年にリリースされました
  • ドキュメンテーションは、それが「完了からの運賃[原文のまま]」であると述べていることを除いて、それが確実に機能するかどうかについて言及していません。

unit-test.vim :

  • これもかなり実験的なようで、特に信頼できるものではないかもしれません。
  • 放棄されたか棚上げされた可能性があります: 最後のコミットは 2009-11 年 (> 6 か月前) でした
  • タグ付けされたリビジョンは作成されていません (つまり、リリースはありません)

したがって、これら 2 つの既存のモジュールのいずれかを使用している人々からの情報、および/または他のより明確に使用可能なオプションへのリンクは大歓迎です。

4

7 に答える 7

19

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
于 2013-11-01T02:59:24.837 に答える
12

Andrew Radev の 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

詳細が必要な場合は、「RSpec と Vimrunner を使用して Travis CI で Vim プラグインをテストする」に詳しく書いています。

于 2012-04-24T07:13:44.993 に答える
9

私が維持している別の (純粋な Vimscript) UT プラグインがあります。

文書化されており、いくつかの例が付属しており、他のプラグインでも使用されています。

関数の結果とバッファの内容をテストし、クイックフィックス ウィンドウにエラーを表示することを目的としています。例外コールスタックもデコードされます。私の知る限り、これはこれまでのところ (または少なくとも最初の) 唯一のプラグインで、クイックフィックス ウィンドウを埋めることを意図しています。それ以来、rspec (+Vimrunner) でテスト結果を生成するヘルパー スクリプトを追加しました。

v2.0 (2020 年 5 月) 以降、プラグインはバッファ コンテンツをテストすることもできます。これは、マッピング/スニペット/... で変更された後です。それまでは、他のプラグインを使用していました。たとえば、VimRunner+RSpec を使用して travis で 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]

生成されます:

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クイックフィックス ウィンドウを押すと、新しいタブの差分モードで期待される結果と一緒に生成された結果が開きます)

于 2010-06-14T06:20:58.590 に答える
3

以前使ったことがありvim-unitます。少なくとも、独自の関数を作成する必要がないことを意味しAssertEqualsますAssertTrue。また、「テスト」で始まる場合は、関数本体内にカーソルを置いて「」と入力することにより、現在の関数を実行できる優れた機能もあります:call VUAutoRun()

ドキュメントは少し不格好で未完成ですが、他のXUnitテストライブラリの経験がある場合は、なじみのないものではありません。

上記のスクリプトには、vim固有の機能をチェックする方法がありません。バッファーを変更して結果の期待値をチェックすることはできないため、テスト可能な方法でvimscriptを作成する必要があります。たとえばgetline()、関数自体の内部で文字列をバッファから引き出すのではなく、関数に文字列を渡し、そのようなことを使用する代わりに文字列を返しますsetline()

于 2010-06-13T16:32:57.840 に答える
0

機能テストには、 vroomというツールがあります。いくつかの制限があり、適切なサイズのプロジェクトの完全なテストを完了するのに数秒から数分かかる場合がありますが、vim 構文の強調表示をサポートする優れた読み書きのテスト/ドキュメント形式があります。

これは、 codefmtプラグインといくつかの同様のプロジェクトをテストするために使用されます。例については、そこにある vroom/ dir を確認できます。

于 2015-02-11T02:09:00.893 に答える