その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

テストフレームワークには3つの軽さが必要なんじゃないかって話

スピリッチャルな与太話ですので、いつにも増して言葉が雑になります。
具体的に言うと、次の行から雑になります。
ウェーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーイ


※ここで言う「テストフレームワーク」って言うのは JUnit とか RSpec とか Test::More とか、
 そういうものを指す。もっと適切な言葉があるかも知れない。その場合はご一報下さると助かります。


さて、テストフレームワークには3つの軽さが必要だと思う。少なくとも僕はそう思ってる。
その3つの軽さっていうのは

の事で、これらが揃っているテストフレームワークっていうのが良いフレームワークなんだと思う。

フレームワーク自体の容量が軽いこと (小さい事)

おおざっぱにいうと、「テストフレームワークが 2GB も 3GB もあったら嫌ですよね」っていう話。
(そんなテストフレームワークが実在するのか??? という突っ込みは脇に避けておいて)

テストフレームワークの容量が大きい (つまり重い) と導入が面倒になる。
開発マシンにテストフレームワークをインストールするのに、何時間もかかる事に耐えられるだろうか?
人間的に優れている諸賢におかれましては何時間でもジッと待たれるのかも知れないが、僕にそれは無理だ。

加えて、フレームワークの容量が大きいと、そのフレームワークのアップデートも気軽に行えない。
新しいバージョンで使える便利な記法があるのに、
フレームワークの容量が大きいから時間がかかっちゃうし、アップデートはやめておこうか……」
となってしまうのはもったいなさ過ぎるし、何より不健康だ。

導入障壁が低いことや、availability / accessibility が高い事は重要だ。
どんなに素晴らしいフレームワークであっても、使われなければ一切意味が無い。

フレームワーク自体の容量が軽いこと」は導入障壁を低める事や、availability を上げることに寄与する。
まあ、大体のフレームワークは容量が小さいから問題になることはまず無いのだけれども。

フレームワークの動作が軽いこと (軽快であること)

これは3つの軽さの中でも最も重要なファクタだと思う。
1つのテスト (アサーション) を実行するのに10秒も20秒もかかってしまうようでは、そのフレームワークは使い物にならない。
プロダクトのテスト数が少ない時であれば、それくらい時間がかかっても問題にならないかも知れないが、
開発が進むにつれてテストの数が増大してくるとそうはいかない。
テストを開始してから完了するまでに多くの時間が必要になってしまうと、継続的なテストの実行は破綻してしまう。

継続的なテストの実行が出来なくなると、
ソフトウェアの正しい動作は担保されなくなり、ソースコードの品質は下がり、
プロダクトに対する開発者の愛は次第に薄れ、会社の景気は傾き、恋人には愛想を尽かされ、
仲間は次々と社を去って行き、しまいには会社を追われる憂き目に遭うかもしれない。

なのでテストは継続的に実行しなければならない。テスト駆動開発なんかを行うのであれば尚更だ。
従って、継続的にテストを回すためにはフレームワークの動作が軽快であることが強く要求される。

そうは言っても、フレームワークの動作が重いのって大体起動時だけな気がするし、
テストに時間がかかるのって実際の所はフレームワークの重さじゃなくて DB とかが原因だったりする場合が多い。
ただまあ、テストの立ち上がりが遅いのって結構ストレスが溜まるので軽いに越したことは無いと思う。
(立ち上がりが遅いフレームワーク、結構ある。フルテストじゃなくて1つだけテストを走らせたい時とかだと、これにイライラさせられる)

フレームワークの記法が軽いこと (テストが書きやすいこと)

テストが書きやすいとテストが増加する可能性が高まる。
その一方で、テストが書きにくい場合にテストが増える事は希だ。
(もし増えたとしたら、その開発者がよっぽど高い意識を保っているか、マゾヒストか、あるいは意識の高いマゾヒストか、のいずれかだ)

テストの書きやすさは開発者のモチベーションに直結する。
テストが書きやすければ「テストを書こう」という意識は高まると思う。
だが、テストが書きにくい場合に「テストを書くぞ!!」という気持ちになるだろうか?

想像してみて欲しい。極端な例だが、
「1つのテストを書くのに、○○を継承したクラスをいくつもいくつも作らなければならない」
だとか、
「1つのテストを書くだけなのに、おまじないとも思えるプログラムを20行も30行も書かなくてはならない」
だとか、そういう破滅的なフレームワークでテストを書けと言われたら、貴方はテストを書きたいだろうか? これは反語である。

そんなのスニペットでなんとかするよ! という向きもあるかもしれないので例えを変えよう。
「1つのテストを書くのにあたって、1回、針で尻のあたりを刺されなきゃなりませんが書きますか?」
という話みたいなものだと思って頂きたい *1

端的に言うと、テストが書きにくいフレームワークでテストが書かれる事は無い。
テストの無いプロダクトに待ちかまえているのは破滅だ。
破滅を回避するためにテストは多く書かれるべきだし、そのためにはテストが書きやすくなければならない。
(テストは負債だ、という話はちょっと今だけは忘れてもらって)
また、テストが書きやすければ、テスト駆動開発を行う際の障害も少なくなるはずである。

正直な所、書きにくいテストフレームワークは少なくない。
1つのアサーションに対して、書かなければならない文が多いするフレームワークはカジュアルに存在する。
それは「軽い」感覚で書けないフレームワーク、つまりは重いフレームワークだ。

十分な覚悟が無ければ書けないテストよりも、気軽に書けるテストの方が良いと思う。



はー、だいたいこんな感じです。テストフレームワーク、軽い方が良いと思いました。

*1:正気か