2014年04月

複雑な構造を生むのはTDDのせいなのか

いろいろ腑に落ちない。

テストファーストのユニットテストは、中間的オブジェクトや間接的で過剰に複雑な構造を生みがちだ。「遅い」ものをすべて避けようとするのがその理由で、データベースやファイルIOなどを避ける。ブラウザを使ってシステム全体をテストするのも避けようとする。結果として、本当に恐ろしく巨大なアーキテクチャが生まれてしまう。

TDDは死んだ。テスティングよ栄えよ。 by DHH

テストファーストでなければ、ユニットテストは複雑な構造を生まないのだろうか。先に書こうが後で書こうが、遅いものをすべて避けようとすれば、ユニットテストは複雑な構造を生むだろう。TDDは無関係ではないか。

また、DHHは「すべての依存関係をモックにし、何千というテストが数秒で終わるようなユニットテスト」は「Railsアプリケーションのテスティングにおいてはいいやり方ではない」というが、その根拠がよく分からない。


ぼく自身は、複雑な構造を避けたいなら、そういう構造を要請するユニットテストを排するしかないと思う。そのかわり、システムテストを重視すればよい。その点においては、DHHの意見に賛同できる。

だが、DHHは「システムテストがすべてだ!」といった極論には与しないという。どうしたらよいのか。


DHHの挙げている参考文献(Why Most Unit Testing is Waste by James Coplien)では、どんなときにユニットテストを書くべきで、どんなときにシステムテストを書くべきか議論されている。

  • Keep regression tests around for up to a year — but most of those will be system-level tests rather than unit tests.
  • Keep unit tests that test key algorithms for which there is a broad, formal, independent oracle of correctness, and for which there is ascribable business value.
  • Except for the preceding case, if X has business value and you can text X with either a system test or a unit test, use a system test — context is everything.

"In most businesses, the only tests that have business value are those that are derived from business requirements. Most unit tests are derived from programmers' fantasies about how the function should work; that has no provable value." だって。

HTTP PUT/DELETEをブラウザがサポートしたら面白そう

どうしてもブラウザからHTTP PUT/DELETEリクエストを(JavaScriptを使わずに)発行したい、というユースケースがあるとして、それをサポートすべきは、HTMLではなくブラウザなのではないか。

DELETEメソッドのほうから考えると、要は、URIを指定してDELETEリクエストを送れればよいだけの話だ。選択したアンカーをDELETEできるコンテキストメニューとか、表示中のURIをDELETEできるボタンとか、そうしたインターフェースがあれば済む。

PUTメソッドにしても、保存先URIを指定してファイルをアップロードできるようにするとか、表示中のリソースを直接編集して更新できるようにするとか、そんなインターフェースがあればよい。

そういうものがないからPOSTで代替したりJavaScriptで頑張ったりしているわけだけれど、ぼく自身は現状のままで充分だと思う反面、前記のようなインターフェースが実際に普及したら面白そうだとも思う。

記事検索
Twitter