読者です 読者をやめる 読者になる 読者になる

VimTestプラグインを更新した。コマンドライン実行とか(0.0.5)

vim vimtest

Vim scriptのテスティングフレームワーク
https://github.com/kannokanno/vimtest

更新しました。
ChangeLogから抜粋。

  • vimtest_configにauto_source追加
  • vimtest_configにauto_cmd追加
  • コマンドライン実行の機能追加(ただしWindows除く)

vimtest_configにauto_source追加

テスト前に実装コードをsourceするかしないかを指定するためのフラグです。

vimtest_configにauto_cmd追加

自動テストする際の処理を追加。後述で説明。

コマンドライン実行の機能追加(ただしWindows除く)

vimtest/bin/vimtest というshを作りました。
これの引数にテスト対象のパスを渡せばコマンドにて結果が出力されます。
Windows版もやりたかったんですが、手元にWindowsがないので後回しにします。

あとヘルプにも書いたけど、Vimを2度立ち上げるのでそれが一瞬見えてチカチカする。
イケてない。けど動くのでとりあえず更新しました。

autotestっぽくできる!

Vim上でテストを行うのは手軽でいいのですが、以下の問題がありました。

  • 実行時のVim設定(.vimrcとか)に依存するので、テストするのに正しい状態かわからない
  • ソース上からは消した関数定義や変数定義はVimを再起動するまで残っているので、期待しない動きをすることがある。
    • なので毎回Vimを再起動するのがいいけど、それはめんどい

これらの問題を解決するために、コマンドライン実行の仕組みが欲しいなと思ったわけです。

  • .vimrcを指定して起動したVimでテストできるようにしたい
  • 編集中のVimはそのままに別Vimでテストしたい
  • その辺をある程度自動化したい=コマンドラインから実行しっぱなしにしたい

で、今回の変更を用いて次のように設定すると、私がやりたかったことができます。
(ヘルプにも同じような設定は書いています)

.vimrcのvimtest設定を以下のようにする
let g:vimtest_config = {
      \ 'autotest_watch_patterns': ['~/.vim/bundle/vimtest/test/*.vim', '~/.vim/bundle/vimtest/autoload/vimtest/*.vim'],
      \ 'autotest_testpath': '~/.vim/bundle/vimtest/test/autoload',
      \ }
function! g:vimtest_config.autotest_cmd(testpath)
  execute 'silent! !cd ~/.vim/bundle/vimtest; ./bin/vimtest test/autoload'
endfunction

各パスやパターンは条件に応じて変える必要があります。
この設定がやっていることは次のとおりです。

  • autotest_watch_patternsで自動テストの監視パターンを追加
    • 該当パス配下のファイルが更新されると自動でテストが走る
  • autotest_testpathで自動テストする際のテスト対象を指定
    • ディレクトリ指定にしてあるので、ディレクトリ配下のテストがすべて実行される
  • autotest_cmdで自動テスト時の処理を定義
    • テストを実行するディレクトリまで移動
    • bin/vimtestを実行
      • テスト対象を"test/autoload"で固定にしているけど、引数のa:testpathでもいいと思う
tail -f でコマンド実行結果を監視

vimtestコマンドは結果をbin/vimtest_result.txtに書き出します。
なのでこのファイルをtailで見ていればテストが走るたびに表示されるわけです。
一般的なログ監視と同じですね。

サンプル

サンプルはvim-jp/vital.vimです。
落としてきて既存のテスト数件をvimtestで書き換えています。

  • testディレクトリとテストファイルとテスト用の.vimrcを追加
/Users/kanno/tmp/vital% ls -la test
total 24
drwxr-xr-x   5 kanno  staff   170B  4  6 19:57 .
drwxr-xr-x  11 kanno  staff   374B  4  6 19:53 ..
-rw-r--r--   1 kanno  staff    44B  4  6 19:57 .vimrc
-rw-r--r--   1 kanno  staff   166B  3 12 05:48 math_test.vim
-rw-r--r--   1 kanno  staff   590B  3 12 06:07 prelude_test.vim
  • テストで使われるVimの.vimrc。
let &runtimepath = '/Users/kanno/tmp/vital'
  • math_test.vim
let s:testcase = vimtest#new()
let s:M = vital#of('vital').import('Math')

function! s:testcase.modulo()
  call self.assert.equals(1, s:M.modulo(10, 3))
endfunction
  • prelude_test.vim
scriptencoding utf-8
let s:testcase = vimtest#new()
let s:M = vital#of('vital')

function! s:testcase.is_numeric()
  call self.assert.equals(1, s:M.is_numeric(3))
  call self.assert.equals(1, s:M.is_numeric(3.14159))
  call self.assert.equals(0, s:M.is_numeric(""))
endfunction

function! s:testcase.is_integer()
  call self.assert.equals(1, s:M.is_integer(3))
  call self.assert.equals(0, s:M.is_integer(3.14159))
  call self.assert.equals(0, s:M.is_integer(""))
endfunction

function! s:testcase.truncate()
  call self.assert.equals("あ", s:M.truncate('あいうえお', 2))
endfunction
  • 実行してみる


  • 編集で使う(いつもの).vimrcにvimtest設定を用意
let g:vimtest_config = {
      \ 'autotest_watch_patterns': ['~/tmp/vital/test/*.vim', '~/tmp/vital/autoload/*.vim'],
      \ 'autotest_testpath': '.',
      \ }
function! g:vimtest_config.autotest_cmd(testpath)
  execute 'silent! !cd ~/tmp/vital/test; ~/.vim/bundle/vimtest/bin/vimtest .'
endfunction
  • tailで監視する
/Users/kanno/tmp/vital/test% tail -f ~/.vim/bundle/vimtest/bin/vimtest_result.txt
  • 実装コードを編集->保存すると勝手にテスト走る

「return a:n +」の「+」を「-」に変えて保存する。


ちゃんとテストが失敗したようです。



  • テストコードを編集->保存すると勝手にテスト走る

「s:M.modulo(10, 3)」を「s:M.modulo(11, 3)」に変えて保存する。


ちゃんとテストが失敗したようです。


いえい。

と、これを書くために試して気づいたのですが、
ターミナル上のVim(CUI)でやると実行後に表示崩れますね...。
お、お使いの際はGVimで!

感想

自分で使う分にはとても便利になったんですが、
提供する機能としてはまだまだ質が低くて残念。Windows版ないし。色も付かないし。
でも気にしてると他のやりたいことが始められないのでリリースしました。

今後の予定

次はモック機能の追加に手を出す。