MATLAB と自動テスト環境 (教員のための Mac Tips:10)

背景

Rails の開発に関しては、autotest + spork + watchr の組み合わせで、ファイル保存時の関連ファイルのみの差分テストが実行されています。私はせっせとテストを書いて保存だけすれば、裏で勝手にテストが実行されて、自動的にテストが失敗します。その後、実装を書いて保存だけすれば、裏で再度テストが実行されて、自動的にテストが成功します。この差分テストで問題がなければ、リポジトリにコミットすることで、今度は Jenkins が自動的に全体テストを実行してくれて、作業記録の保存までしてくれます。この結果、個別に行った修正が全体に影響を与えていないかを確認することができています。

MATLAB のライブラリ開発でも Jenkins を導入したので、コミット後の生成物に対するテストは自動化されました。しかし、開発中のプログラムに関しては今まで同様手動でテストをしていました。やはり一度楽な世界を覚えてしまうと、ファイルを保存しただけでテストを実行してくれないかと考えてしまいます。それを実現するのが、fswatch です。

fswatch について

以前の記事で書いたように、Mac には Time Machine という素晴らしいバックアップの仕組みがあります。このバックアップ処理を高速に実現することを可能にしているのが、FSEvent になります。FSEvent については、Leopard 登場時に掲載された記事が参考になるかと思います。要約すると、フォルダ単位になるもののファイルの更新を簡単に監視することができるということです。

こんな便利なものを使わない手はありませんので、この仕組みをコマンドラインで使えるようにしたのが fswatch になります。homebrew を使っているなら、

brew install fswatch

とするだけでインストール可能です。使い方は簡単でコマンドラインから

fswatch 監視したいフォルダ名 プログラム名

とするだけです。監視したいフォルダ内のファイルが更新されると、自動的にプログラムが起動します。

MATLAB の自動テスト

そんなわけで、fswatch は以下のようにして使っています。

cd Documents/MATLAB
fswatch myMatlab/@MD "matlab_test.sh MDTest"

本当は myMatlab を指定して全部テストしてもいいんですが、それは Jenkins の役目ですし、git いじっただけでもテストが動作するのは嫌なのでサブフォルダのみにしています。@MDTest 内のファイルを書き換えた時にテストが動きませんが、テストが書き終わったら、@MD 内の何かのファイルを上書き保存することにしています。

MATLAB 内のエディタでプログラムを書いているだけで、自動的に別のコンソール画面でテストが勝手に実行されるのはやはり楽ですね。

written by iHatenaSync