技術・科学

テストファースト

投稿日:

RailsによるアジャイルWebアプリケーション開発」のチュートリアルをコーディングし、動かしながら少しずつRailsの強力さと、アジャイルな開発の面白さを実感している。
まだいくつかのイテレーションが残っているのだが、ちょっと先を読んでみると、テストについて結構なページが割かれていることがわかる。
Railsではgenerateスクリプトを使ってコントローラやモデルをある程度自動生成するようになっている。実際のところ、仕組みがわかってくるとスクリプトを使わずにコードをいきなり書くこともできないわけではないのだが、そうすると大きなメリットを失うことになる。
generateスクリプトを使うと、テスト用のスタブが自動生成されるのだ。DBも開発用、テスト用、本番用と分けて作るようになっている。当然テストの中身は自分で書かなければならないのだが、テスト用の環境を作るための工夫が随所にあって、なにもないところからテストを始めるよりずっと便利のようだ。
たとえば、DBがらみのテストをすることになるとデータを用意するのが大変だが、テスト用のデータを何度でも生成できるようにするためにテスト用データを書いておくフラットファイルが表毎に準備されていて、その中身を作っておけばテストのときにDB表にデータを初期化できて便利だったりするのだ。
あくまでもテストやテストデータは自分で作る必要があるけれども、それらを準備するフレームワークが最初からきちんとそろっているというところがすごい。
でもって、このテスト支援の仕組みがあることによってテスト駆動型の開発が容易になる。
テスト駆動型開発というのは、実際に動かすためのプログラムを書く前にその機能をテストするためのプログラムを書き、そのテストが通るようなターゲットプログラムを作るという開発手法のことだ。
テストを先に書くことで機能要件が明確になり、全てのテストをパスすればプログラムの開発が完了となるわけで開発作業の終わりが明確になるというメリットもある。しかもテストがプログラム化されるから自動テストが可能になる。と言われている。
が、僕はこの手法に懐疑的だった。なぜなら実際のプログラムを書く前にテストプログラムを書くとしたら、そのテストプログラムの妥当性が問題じゃないかと思ったからだ。これはテスト用の環境やツールが整っていない通常の開発環境を念頭に置けば当然の疑問だと思う。
しかし、Railsの具体的なテスト支援機能を学んで(まだだけど)みると、あながちできないことではないのだなと思うようになってきた。
Railsではモデルのテストをユニットテスト、コントローラのテストを機能テストとよんでいる。そして、それらを支援するためのアサーションとかヘルパーとかいったような機能がきっちり提供されているのだ。学んでいないので用語の中身は理解できていないのだが(^^;
とにかく、きちんとテストが書けるのである。それも、本体のプログラムとは違う検証用の機能を使って書けるというのが重要なポイントだ。物差しの精度を測るには別の方法による測定が必要なように、テストも本体とは異なるアプローチで書けなければいけない。それができるのである。
しかもテストはビューのHTML/CSSを決めるガイドとしても使えてしまうという。
ここまできたらもうテストだけの問題じゃなくて、外部仕様の大半が論理的に記述できるということで、ソフトウエア技術者にとってはひとつの夢の実現(というか悪夢からの開放)なのである。
テストの自動化ができれば、リファクタリングだって怖くない。テスト環境をきっちり分離して作ることができれば新しい試みだって試し放題だ。
テスト駆動型開発というのはRailsの専売ってわけじゃなくて、Javaなんかでも試されてきたし、環境やツールもそろっているようだけど、Railsのようにオールインワンになっているケースはほとんどないのではないだろうか。Railsはフレームワークを決め、ライブラリを用意しただけじゃなくて、開発やテストに必要な道具までわかりやすく揃った類稀なるフレームワークなのである。
こんなすごさを感じていると、Railsの延長線上に、自動プログラミングとか、自動テストのような世界が広がっているように思えてくる。まだ道ははるかに遠いと思われるけれども。







書いた人

nyao

nyao

本を書きたい人にITの基礎から学んでもらって、Kindleで著者デビューするまでをサポートします。 ITってよくわからないという人のために勉強会をやっています。 「読書と編集」という屋号でお仕事をしています。

プロフィールを表示 →

-技術・科学

Copyright© NyaoPress 読書と日常 , 2019 All Rights Reserved.