調べたので以下、メモ。
runVimTestsはテストを実行するためのフレームワーク
runVimTests単体でもテストは実行できるけど、CppUnitのようなユニットテストライブラリにある
CPPUNIT_ASSERT()のような評価用マクロ(というか関数)をrunVimTests自身は持っていない。
runVimTestsはこれらの機能のためにVimTAPを利用している。
VimTAPはユニットテストのための関数群
テストを実行するには
テストを実行するためのシェル(バッチ)スクリプトが用意されている。
*NIX向けにshスクリプト、
Windows向けにバッチファイルが用意されているので、環境問わず利用することができる。
(とはいってもWindows環境でしか試してないけど)
runVimTests [オプション] <テスト対象>
<テスト対象>にはディレクトリ,テスト対象.vimファイル,.suiteファイルを指定することができる。
.suiteファイルについては後述する。
オプション
-0,--pure | .vimrc、プラグインをまったく使わない |
-1,--default | ~/.vimrcとユーザ環境のプラグインを使わない |
-2,--user | ユーザ設定も有効にした状態でテストを行う(デフォルト) |
-source | テスト実行前に読み込むファイル |
-runtime | テスト実行前に読み込む&runtimepath内のファイル(--pure実行時に使う。テスト対象が依存するファイルのみを読み込むために使用する) |
--vimexecutable | vim.exeのパスを指定する(vimディレクトリへのパスを通していない場合に使う) |
--vimversion | vimのバージョンを指定する(WindowsでのVimインストール先ディレクトリを特定するために使われるみたい) |
-g,--graphical | GVimを使ってテストする |
--summaryonly | サマリのみを表示 |
-v,--verbose | 詳細を表示 |
-d,--debug | デバッグモード |
VimTAPの提供する関数
ある式を評価したらこういう結果になるはずというような判定は VimTAPが提供する関数を使う。
以下、主なVimTAPの関数
vimtap#Plan
いくつテストがあるかをvimTAP側に知らせるために使う。何の役に立つのかはわからない
vimtap#Isnt
vimtap#Isの否定形
vimtap#Unlike
vimtap#Likeの否定形
vimtap#Pass
無条件で成功
call vimtap#Pass('OKです')
vimtap#Fail
無条件で失敗
call vimtap#Fail('死亡確認')
ほかにもいくつかあるけど省略。VimTAPのヘルプに書いてある。
runvimtestが提供する関数
vimtest#Quit
テストスクリプトの実行を終了する
vimtest#System
外部コマンドを実行する。外部コマンドの標準出力の内容はecho出力される。
vimtest#StartTap
VimTAPの使用を開始する。vimtap#...を使う前にこれを呼ぶ必要があるみたい。
ほか
ほかにもBailOut,Error,Skip,SkipOut,SkipOut,SkipAndQuitIf,RequestInputなどの関数があったけど省略。
okファイルとmsgokファイル
テストスクリプトを実行した結果、バッファの内容はこうなるはず、という評価をしたい場合は、
テストスクリプトに対応する.okファイルを用意する。
.okファイルに期待するバッファの内容を記述しておくと、
テストスクリプト実行後に、バッファの内容とokファイルの内容を比較してくれる。
また、こういうecho出力がなされるはず、という評価をしたい場合は、
テストスクリプトに対応する.msgokファイルを用意する。
テストスクリプト実行中のecho出力はrunVimTestsによってリダイレクトされ、
テストスクリプト実行後に、リダイレクト先の内容とmsgokファイルの内容を比較してくれるようだ。
suiteファイル
複数のテストスクリプトを実行する場合は.suiteファイルを作成しておくと便利。
下記のように書く。
# test001〜test003.vimを実行 test001.vim test002.vim test003.vim # 別のsuiteファイルを実行 another.suite # サブディレクトリsubdir内のすべてのテストを実行 subdir
こんな感じでテキストファイルを作成しておき、
runVimTestsのパラメータとして渡すと、一括してテストを実行することができる。