el-spec v0.2リリース:テスト結果からテスト定義へのジャンプ。個別のテスト実行をサポート

el-spec v0.2 をリリースします。変更点は以下です

  1. テスト結果からテスト定義へジャンプ可能に
  2. 個別のテスト実行をサポート

https://github.com/uk-ar/el-spec

変更詳細

1つ目はテスト結果からテスト定義へのジャンプです。テスト(example)が失敗した際にはテスト内容を詳しくみれると便利ですね。ertにもともと備わっている機能ですが、ertの関数をラップして使ってるのでv0.1では対応できてませんでした。今回、遅れて対応です。
使い方はertバッファ上の失敗/成功したテスト名の上で「RET」を押すことでテストを定義した場所へ飛ぶことができます。
ただし一つ制限があり、現時点ではshered-examples(include-examples)された定義には飛べません。実装を頑張らないとshared-examplesへの対応は難しそうです。

2つ目は個別のテスト実行です。テストが増えてくると全部を実行するには時間がかかるようになります。その場合、一部のテストだけを実行できると便利ですね。v0.1ではcontext単位のテスト実行をサポートしていましたが、これを拡張してexample単位で実行できるようにしました。M-x el-spec:eval-and-execute-examplesでカーソル付近のexample/contextだけを実行することができます。
挙動が分かりづらいので、スクリーンショットで説明します。

カーソル位置により実行範囲が変わり、

  • 灰色部分にあるときdescribe以下(3つのexample)が実行される
  • 青色部分にあるときit以下(各々1つのexample)が実行される
  • 黄色部分にあるときcontext以下(2つのexample)が実行される

ことになってます。shared-examplesやinclude-examplesの内部で実行しても上位のcontextなどを実行するだけなので、注意して下さい。
逆にM-x el-spec:eval-and-execute-allでdescribe以下のコンテキストを実行できます。M-C-x でevalした時の挙動も切り替えが可能で、M-x el-spec:toggle-selectionするたびにallとexamplesが切り替わります。

インストール方法

el-specはertに依存しています。
Emacs23以下の場合はert自体のインストールが必要です。
rspecのように前処理などを構造化できるEmacs Lisp用テストフレームワーク(el-spec)をリリース - むしゃくしゃしてやったを参考にしてください。
el-specのインストールは

(auto-install-from-url "https://raw.github.com/uk-ar/el-spec/52dc72aa71ddfa1dba87ba93703f1328b1496ed3/el-spec.el")

を評価するか、
marmaladeから
M-x package-install el-spec
でOKです。

感想

今回はv0.1をリリースした後すぐに対応しようと思っていた機能です。当初考えていたよりも時間がかかりました。
一つの理由はfind-functionの実装が正規表現で関数定義を探すようになっていたので、そのままでは対応が難しかったこと。もう一つはitのマクロ呼び出し時に(C言語の__LINE__的なもので)呼び出し行数を記録していけばタグファイル的なものを作れると思っていたけど、似た機能がなさそうだったことです。
結局、力技ですがdescribe以下のS式を自前でパースすることで対応しました。
その際readを使うことでメインのロジックと一部の処理を共通化することができました*1

扱いが難しいのがshared-examplesですね。サクッと対応したいところですが、泥臭い実装しか浮かびません。アイデアが欲しいところです。本家のrspecを見てみようか...