Vim プラグインを作成するにあたって、Vim script のテストをCIツールで実行したいと思いました。
この記事では FizzBuzz プラグインをサンプルに、GitHub Actions でテストを実行する流れを掲載しています。
事前準備
GitHub にリポジトリを作成します。
今回は fizzbuzz.vim
というリポジトリ名で作成しています。
FizzBuzz プラグインの追加
「引数として任意の数値を渡すと、FizzBuzz のルールに従い文字列を返す」という関数を定義するプラグインを追加します。
function! fizzbuzz#to_fizzbuzz(number) abort
lets:divisible_by_3=(a:number % 3==0)lets:divisible_by_5=(a:number % 5==0)ifs:divisible_by_3&& !s:divisible_by_5return'Fizz'elseif!s:divisible_by_3&& s:divisible_by_5return'Buzz'elseifs:divisible_by_3&& s:divisible_by_5return'FizzBuzz'endifreturn''endfunction
themis.vim を使ったテストの追加
Vim script 用テストフレームワークの themis.vimを利用して、テストを追加します。(テーミスやテミスと発音するようです)
FizzBuzz のルールに従った戻り値が返ってくることをテストしています。
lets:suite= themis#suite('fizzbuzz')lets:assert= themis#helper('assert')function!s:suite.to_fizzbuzz_1()letl:number=1letl:response = fizzbuzz#to_fizzbuzz(l:number)calls:assert.equals(l:response,'')endfunctionfunction!s:suite.to_fizzbuzz_3()letl:number=3letl:response = fizzbuzz#to_fizzbuzz(l:number)calls:assert.equals(l:response,'Fizz')endfunctionfunction!s:suite.to_fizzbuzz_5()letl:number=5letl:response = fizzbuzz#to_fizzbuzz(l:number)calls:assert.equals(l:response,'Buzz')endfunctionfunction!s:suite.to_fizzbuzz_15()letl:number=15letl:response = fizzbuzz#to_fizzbuzz(l:number)calls:assert.equals(l:response,'FizzBuzz')endfunction
ターミナルでのテスト結果はこちら。
$ ~/.ghq/github.com/stackline/fizzbuzz.vim
$ themis
1..4
ok 1 - fizzbuzz to_fizzbuzz_1
ok 2 - fizzbuzz to_fizzbuzz_3
ok 3 - fizzbuzz to_fizzbuzz_5
ok 4 - fizzbuzz to_fizzbuzz_15
# tests 4# passes 4
GitHub Actions にワークフロー追加
Vim script のテスト環境構築と実行を行うワークフローを追加します。
GitHub Actions が提供する Simple workflowをベースに、async.vim の .travis.ymlを参考にしながら作成しました。(ローカルで Dockerfile を docker build
しながら動作確認しつつ、ある程度固まったタイミングで、ワークフローを作成)
name:Teston:pushjobs:build:runs-on:ubuntu-lateststeps:-name:Initializerun:|sudo apt-get updatesudo apt-get install -y vimsudo apt-get install -y git-name:Clone repositoriesrun:|# Test frameworkgit clone --depth 1 --branch v1.5.4 --single-branch https://github.com/thinca/vim-themis /tmp/vim-themis# Repository under testgit clone --depth 1 --branch master --single-branch https://github.com/stackline/fizzbuzz.vim /tmp/fizzbuzz.vim-name:Run testsrun:/tmp/vim-themis/bin/themisworking-directory:/tmp/fizzbuzz.vim
ワークフローをリモートリポジトリに push すると、次回から push イベントをトリガーにワークフローが実行されます。
GitHub Actions でテスト実行
例えば README.md
を追加するコミットを git push
します。
その後 GitHub で fizzbuzz.vim
リポジトリにアクセスし、Actions タブをクリックすると、実行したワークフローの一覧が表示されます。
ワークフロー名をクリックすると、以下のようなログが閲覧でき、Vim script のテストが実行されていることを確認できます。
また、ワークフローのステータスを表すバッジも所定の URL で取得できます。
GitHub 内で CI/CD まで完結できるのは便利そうですね :)