RSpecを使ったテストコードを読もう:Railsコードリーディング〜scaffoldのその先へ〜(2)(2/4 ページ)
優れたプログラマはコードを書くのと同じくらい、コードを読みこなせなくてはならない。優れたコードを読むことで、自身のスキルも上達するのだ(編集部)
RSpecについて
RSpecとは、Rubyで書かれたプログラムの動作を確認するための、テストコードを記述・実行するためのフレームワークのことです。実際に動くプログラムの動作のことを振る舞い(ビヘイビア)と呼ぶことから、それまでのテスト駆動開発のやり方をビヘイビア駆動開発(BDD)と呼ぶようになっています。
振る舞いとはすなわち、プログラムの仕様にほかなりませんから、テストコードと呼ばずにスペックと呼ぶようになっていますので、今回の記事中でも、以降はスペックと表現することにします。
Railsアプリケーションでは標準のままだと、Test::Unitというテスティングフレームワークを用います。しかし、SKIPの開発チームでは、RSpecをあえて導入しています。その理由は、Test::Unitに比べて以下に示すようなメリットがあると感じているからです。
- 仕様(スペック)として記述できるため、非常に読み書きしやすい
- 標準でモックやスタブといったテスト記述のための支援機能が使える
- テスト実行の結果を、さまざまな形式で出力できる
- ほかのツールとの連携、統合がされている
もちろん、Ruby on Railsとの親和性の高さも、選択した理由の一つです。
参考までに、以下にRSpecの出力のサンプルを掲載します。
SKIPの開発チームでは、当初は品質向上の目的のためにRSpecを導入したのですが、徐々にRSpecの開発スタイルに慣れてくるに従い、BDDの開発スタイルに変化し、いまでは設計開発のツールとして使うようになりました。
BDDに関する詳しい解説は、今回のコードリーディングの範疇(はんちゅう)を超えてしまいますので割愛します。その代わり、大変参考になる記事のURLを紹介しておきます。
グループ機能のデータ構造
早速、SKIPのスペックを読んでいきたいところですが、その前に、SKIPアプリケーションにおけるグループ機能のデータ構造について解説をしておきます。グループ機能の説明は、第1回をご覧ください。
第1回では、いわゆるMVCモデルのViewとControllerに当たる部分のソースコードを中心に説明しましたが、RSpecのスペックを書くのに一番適しているのは、Model(モデル)部分になりますので、まずは、RailsにおけるModelとSKIPにおけるデータ構造について説明します。
Railsにおけるモデルは、データベース上のテーブルとそこに蓄積されたデータを扱うための役割と、データに関連する処理ロジックを表現する役割を持っています。Railsのモデルのフレームワークに当たるActiveRecordには、主な機能として以下のようなものがあります。
- カラムの情報から自動的にオブジェクトのメソッドを生成し、カラムの値にアクセスできる
- 保存時の検査(バリデーション)を定義して結果をモデル内に保存できる
- 1対1、1対多、多対多といったテーブル間の関連を簡単に表現できる
モデルに関する詳しい説明は、次回以降のテーマとして取り上げる予定です。
今回も事例としてSKIPのグループ機能を使いますが、その周辺のテーブル構造は以下の図のようになっています。
グループには、名前や説明のほかに「参加制約」というカラムを持っています。これは、グループへの参加を「承認制」にするか「自由参加」にするかのフラグになります。
承認制だと、グループを作成した管理者の許可を得ないと、参加することができないようになります。こうすることで、秘密の情報などが漏えいしないような仕組みとなっています。
グループ参加状況という中間テーブルを置くことで、ユーザーは複数のグループに所属することが可能なようにしています。
Copyright © ITmedia, Inc. All Rights Reserved.