Developers開発の実験等々、クイックサーブのメンバーが好き好きに書き込んでいく場所です。Rspecで始めるユニットテスト(単体テスト)コメントを残す概要ユニットテスト(単体テスト)をあまり書いたことがない人が、RubyのテスティングフレームワークであるRSpecを用いてユニットテストの第一歩を踏み出すお話。本記事では、RSpecを使って極単純なクラスの各種メソッドについてのユニットテストを作成する。ともにテストする手法である[1]。ユニットとはアプリケーションのテスト可能な最小の部品単位である、と直観的にとらえることができる端的にいうと、クラス及び各種メソッドが、仕様通りに動作しているかを機械的に検証する仕組み。ユニットテストを書くとどんな旨味があるのかは以下の通りコード修正時の影響範囲を検証できるので、デグレーションなどを防げるテストコードを書きやすくするためには、元のユニットもシンプルにわかりやすく書き上げる必要があるので、コード品質が高まるテストコードを書く時はユニットの利用者になるので、利用者的に使いやすいコードを書けるようになるクラス/メソッドの使い方とその結果がテストコードに記述されるので、ドキュメントにもなるなどなど。「テスト」というからには「正しく動いていることを確認する」ことに目的を起きがちだが、実はテストを書くことで元のコードを高品質に書けるようになるという大きなメリットがあるようだ。RSpecとはRubyでユニットテストを作成する手段はいくつもあり、minitest/unitはRubyに標準で含まれている(2.0系)ので、すぐに利用できる。本記事では、その中でも人気のRSpecを用いてユニットテストを作成する。RSpecの主な特徴は以下の通りRubyで最もポピュラーなテスティングフレームワークメタ視点でのテストが書けるため、テストコードが自然言語っぽくなる(※但し英語を用いた場合に限る)初期はRailsでも標準のテスティングフレームワークだった(学習コストを考慮して現在ではminitestになってるみたい)ユニットテストに限らず、結合テストやブラウザテストなどにも使えるビヘイビア駆動開発を想定したやや独特な記法を用いるので学習コストが微妙に高いなんともしっくりこない特徴がチラホラあるが、本記事ではあまり影響しないので気にせず使う。RSpecのインストールRSpecはgemでインストールできる。今回はグローバルインストールするので以下のようにインストールする。--initspecディレクトリが作成され、中にspec_helper.rbが作成される。このファイルはRspecの振る舞いを定義した設定ファイルで、デフォルトで色々記述されているが、本記事では特に編集しないのでそのまま利用する。今回は初めてのユニットテストなので、極シンプルな以下のクラスを実装する。以下Calcクラスは、オブジェクト生成後、各種メソッドを用いて、足し算/引き算/かけ算/割り算を行うことができる。endendこれを、calc.rbというファイル名で、srcディレクトリ直下に配置する。これから作成する、Calcクラスをテストするテストスクリプト(calc_spec.rb)を、specディレクトリ直下に配置する。ディレクトリ構造は以下の通り。files以降では、このClacクラスについてのユニットテストをcalc_spec.rbに記述する。足し算メソッドをテストするまずは、前項で作成したCalcクラスの、addメソッドについてテストする。1で2が返ってくるはずだ。endend細かいことは学びながら身に付けていけば良いが、describeはテスト対象を、itは期待する振る舞いに関する説明を宣言して、その中にテストコードを記述する。bは、aがbと一致していることを検証する手法で、本記事ではこれしか使わないのでとりあえずここを抑えておけばよい。テストの実行はrspecコマンドをそのまま叩くことで実行できる。rspecコマンドは、作業ディレクトリ以下のテストスクリプトを探索し、それを実行して結果を標準出力する。failuresを見ると、1個のテストを実施して0個失敗した(=全て成功した)ことが確認できる。26931は、今回のテストの乱数シードを表す。今回は一つのテストしか無いが、基本的にテストは複数のテスト項目に対してまとめて実施する。その場合の実施順序を毎回ランダムにすることで、各ユニットが実行順に依存しないことを証明できる。足し算クラスのバグを検知する例えば、誰かがCalcクラスを更新して、足し算メソッドが以下のように変わってしまったとする。bend本来は2数の和を戻すメソッドなのに、2数の差が戻ってしまう。これは紛れもなくバグである。58714のようになり、どのテストで失敗したのか、期待した結果と実際に得られた結果がどう違ったのかなどを確認することができ、迅速にコードの修正を行うことができる。複数のテストをまとめて実行する同様に、引き算/かけ算/割り算についてのテストも記述する。endend同じようにrspecコマンドでテストを実行すると、全てのテストが実行され、問題ないことが確認できる。差が0未満の場合、nilを戻す改変したコードが以下の通り。ここからは簡略化のために、足し算メソッド/引き算メソッドのみにします。endend境界値分析を行う足し算メソッドは、和が10を超えた場合にnilを返す。なると、分岐の境界になる、和が10、もしくは11になる入力のケースが最もバグが生まれやすいと考えられる。同様に、引き算メソッドは0が境界になるので、差が0、もしくは-1になる入力のケースが怪しい。以上のような境界値分析を考慮して、以下のようにテストを追加する。endenddescribeは、テスト対象を定義すると述べたが、これは入れ子で表現することもできる。そのため、Calcに対するテストの中に、「足し算に関するテスト」「引き算に関するテスト」を入れ子でdescribeに定義したことで、何のテストを行っているのかをよりわかりやすくした。コメントをキャンセルメールアドレスが公開されることはありません。