八発白中

はてなブログに引越しました。

Day 1: Prove

これは fukamachi products advent calendar 2016 の1日目の記事です。

最初なのでこのアドベントカレンダーの説明をしておくと、僕が今まで作ったプロダクトをネタとして年代を追って話をするというとても気楽なものです。酒でも飲みながら昔話を聴いているというつもりで毎日お付き合いください。

始まりはShibuya.lisp Hackathon

僕が最初にCommon Lispライブラリを作ったのは2010年の10月でした。

ある日曜日、青山にあるセキュリティの厳重な日本オラクルのオフィスを借りてShibuya.lisp Hackathon #1というイベントが開催されました。主催はShibuya.lispの運営の1人のyshigeruさん。当時はオラクル社員だった@ymotongpooさんが会場の案内をしてくれたことも覚えています。

その頃の僕はCommon Lispのプロダクトなんて一つもなくて、ClojureS式で書けるプレゼンツールを公開したりしていました。仕事ではアリエル・ネットワークという会社でJavaを書いていました。

6年前のCommon Lispのライブラリ環境

Clojureから入った僕にとって、当時のCommon Lispのライブラリ環境は貧弱でした。Quicklispがようやく数週間前にリリースされたばかり *1 でまだ全く普及しておらず、まだ存在すら知らない人もいたほどです。

ライブラリのインストールにはasdf-installというツールを使っていました。これは現在どの言語にもあるような中央管理型のパッケージシステムなんかではなく、独自にHTTPアクセス可能な場所にtarballを置いてCLikiにページを作るという素朴なもの。まだ今ほどにGitHubを誰でも使っているというわけでもなかったので、自前のサーバにホスティングするものだからそのサーバが落ちているとライブラリがダウンロード不可能だったりして。ダウンロードはできてもそれぞれのライブラリの結合テストなんてされてないので、バージョンが上がる度にコンパイルエラーが出るなんて珍しくありませんでした。

テストフレームワーク

そんなときにCommon Lispに入門していざプログラムを書こうと思った矢先、テストフレームワークがどうも求めるものがない。Clojureclojure.testPerlTest::Moreのようにシンプルなものはlisp-unitというものがあったのだけど、出力がTAP (Test Anything Protocol) 形式ではない。

ないなら作ってしまえという短気さで、Hackathonで作ることにしました。

名は「CL-TEST-MORE」で、PerlTest::MoreAPIを移植したようなものです。スクリプトとしてテスト実行できるところや、ASDFだけでなくcl-test-more.lispのファイル一つをロードするだけで使えるという手軽さ、そして出力がTAPであるという点を特徴としていました。

Hackathonの終わりの発表会で早速発表しました。

終わったあとに@imakadoさんから「TAP形式だとHudson (Jenkins) でも使えて便利ですね!」と言われたのをなぜかよく覚えています。

ASDF対応から、Proveへ

当然ながらその後の僕の作ったプロダクトはすべてCL-TEST-MOREを使ってテストを書いていくことになります。それに応じてCL-TEST-MOREも進化してきました。

Quicklispの普及に伴ってスクリプトとして実行できるという要求がなくなったので、ASDFでの利用を主眼としたりして。

その後、JenkinsでのテストからTravis CIでのテストが主流になってTAP形式が今ほど重要ではなくなったた全面的に書き直すことになり、出力形式を増やして成功と失敗で色付けしたりモダンな見た目を目指しました。名前もより短く「Prove」に変更しました。

現在はRoswellスクリプトの「run-prove」を使うことでコマンドラインから簡単にテストを走らせることができるようになっています。Travis CIで走らせるテストなどにはとても便利です。COVERALLS=trueにするとカバレッジを計測してcoveralls.ioに投稿する機能もあります。

テストという一歩

当時は確かテストファーストとかが声高に言われていたような時代で、言語に関わらず公開するプロダクトには自動テストを書こうという風潮が強くなっていた頃です。

その中で、今後Common Lispでプロダクトを継続して作っていくならば、まずはこの一段を盤石にしなければならないという思いがありました。

ちなみに当時の僕がShibuya.lispのLTで発表していたスライドが出てきたので貼っておきます。かなり過激で強気ですが、当時はこれくらいの勢いがないとやっていけなかったのでしょうね。

Lispで仕事をするために / SlideShare

おわりに

ProveはGitHubで公開しており、現在Starは107。95のプロジェクトで利用されています。

明日のアドベントカレンダーは2日目のClackについてです。お楽しみに。

*1:ハッカソンが10/24、Quicklispのリリースの10/7の17日後です