Tech Sketch Bucket of Technical Chips by TIS Inc.

RSpec Tips -- パラメタライズドテストでテストコードをシンプルにする --

Pocket

この記事はeXcale Developer's Blogから移転されたものです。


eXcale 開発チームの平井です。

Ruby のテストフレームワークで人気の RSpec について、ハマりそうな点や知っておくと便利な機能をご紹介します。
今回は、パラメタライズドテストとすることで、冗長になりがちなテストコードをシンプルに書く方法をご紹介します。 FizzBuzz問題を例題としながら、rspec-parameterized を使う例を紹介します。


eXcaleでは期間限定でサインアップキャンペーン実施中です。
キャンペーンは3月末で終了となります。まだサインアップしていない方は、この機会に是非サインアップしてみてください。
キャンペーン内容についてはこちらを参照してください。


今回ご紹介する内容の目次です

  • 概要
  • 準備
  • 素直にテストコードを書いてみる
  • rspec-parameterizedを使ってパラメタライズドテストにする
  • パラメータを配列ではなく、テーブルっぽく書く

概要

テストメソッドの評価方法は同じだけれども、入力(とその期待する値)が違うという場合、その入力の分だけ同じようなテストを何度も書くことがあります。そのテストに対して入力となるようなパラメータを渡してテストを実行したい、と感じることはないでしょうか。そのような際に有効なのがパラメタライズドテストです。パラメタライズドテストは、テストメソッドに対して、入力を変えてテストを実行するもので、RSpecでは、rspec-parameterized などを使うことで書くことができます。パラメタライズドテストとすることで、冗長になりがちなテストコードをシンプルに書くことができます。

ここでは、有名なFizzBuzz問題を例題として、パラメタライズドテストを書いてみます。今回は、数値を引数としてfizzbuzzメソッド呼び出すと、その数値に応じてFizzやBuzz、FizzBuzz、数値が返されるというFizzBuzzクラスを実装することを考えます。

準備

Gemfile に下記の通り test グループを追加し bundle install を実施してください。

準備が完了したら、実際にテストコードを書いていきましょう。

素直にテストコードを書いてみる

まずは、テストコードをrspec-parameterized を使わず、素直に書いてみます。
以下のように、入力に応じて、その結果が期待値と同じかどうかを評価する同じようなテストコードが増えていくことになります。


rspec-parameterizedを使ってパラメタライズドテストにする

先ほどのテストコードをrspec-parameterized を使って書き換えたコードは以下となります。
rspec-parameterized を使うことで、先ほどとは異なり、入力に応じて書いていた評価部分のコードが1箇所となり、冗長だったコードがシンプルになっています。また、入力となるデータ定義部分と、テスト実行となる評価部分とがわかれ、分かりやすくなっているのではないでしょうか。
※ テスト対象メソッドに変更はありません


パラメータを配列ではなく、テーブルっぽく書く

先ほどのテストコードでは、パラメータとなる値を配列として定義していましたが、rspec-parameterized では、以下のように|で区切りテーブルのように書くこともできます。


最後に

今回は、FizzBuzz問題を例題としながら、rspec-parameterized を使ったパラメタライズドテストの書き方をご紹介しました。
パラメタライズドテストとすることで、入力(とそれに対応する期待値)と評価部分を分けることができるため、冗長になりがちなテストコードをシンプルに書くことができます。
テストコードの可読性や保守性を高めるためにもテストコードはシンプルにしたいですね。

エンジニア採用中!私たちと一緒に働いてみませんか?