物置き

runVimTests.vim

調べたので以下、メモ。


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#Ok

条件が真になるかどうか。CPPUNIT_ASSERTに相当するもの。

call vimtap#Ok(1, "つねに真")
vimtap#Is

期待値の判定。CPPUNIT_ASSERT_EQUALに相当するもの。

call vimtap#Is(x, 'good value', 'x is good value')
vimtap#Isnt

vimtap#Isの否定形

vimtap#Like

正規表現による判定

call vimtap#Like(x, '^\d$', "x is a digit")
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#...を使う前にこれを呼ぶ必要があるみたい。

vimtest#SaveOutput

その時点でのバッファの内容を<テストスクリプト名>.outというファイル名でテストスクリプトと同じディレクトリに出力。

ほか

ほかにも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のパラメータとして渡すと、一括してテストを実行することができる。