RSpec

プログラミング開発におけるテストコードの意義について初心者向けに解説

RSpec

 

今回はプログラミング開発におけるテストコードの意義について簡単に解説したいと思います。テストコードのメリット・デメリットやその必要性、Railsにおけるテスティングフレームワークなどこの機会におさらいしておきましょう。

テスティングフレームワークとは、テストを簡単に実装することができるフレームワークのことです。

そもそもテストとは

プログラミングにおけるテストとは、作成したwebサービスが正しく動くかどうかをテストコードを書いて試験することです。これにより事前にバグを発見したり、バグになりうる箇所を特定できたり、要件漏れを防いだりと様々なメリットを享受することができます。

アプリケーションの品質を担保する上で、テストは非常に重要な役割を果たしていると言えますね。

次にテストの種類について見ていきましょう。

テストは主に単体テスト統合テスト(結合テスト)という2種類に分類されます。

単体テスト

単体テストとは、1つの機能に関して正常に動くかどうかを確かめるテストのことです。

下図の場合では、機能A〜Dについてそれぞれ個別にテストすることを単体テストと言います。Railsに置き換えると、1つのモデルクラスもしくは1つのコントローラーをそれぞれテストすることを指します。

単体テスト

統合テスト(結合テスト)

統合テスト(結合テスト)とは、複数の機能が連動して行われる処理が正常に動くかどうかを確かめるテストのことです。

下図の場合では、機能Bと機能Dがシステムをまたいで正常に機能するかどうかを統合テスト(結合テスト)と呼びます。ユーザーの新規登録における一連の処理や投稿機能の一連の処理などが挙げられます。

統合テスト

テストコードのメリット

ここまでを通して、なぜテストコードを書く必要があるのか疑問に思った方もいるのではないでしょうか。わざわざテストコードを書かなくても、ブラウザ上でポチポチして挙動を確認すれば大丈夫なのでは…と思うかもしれません。

しかしそれは違います。

ブラウザ上でポチポチして挙動を確認することよりも、テストコードを書いた方がメリットは遥かに大きいのです。

テストコードを書くメリットとしては主に以下の3つになります。

  • エンジニア間での引き継ぎが容易になる
  • 仕様書(設計書)の代わりになる
  • バグを早期発見できる

エンジニア間での引き継ぎが容易になる

基本的に開発は作って終わりではありません。サービスが存続する限り、その先も保守運用をしなければなりません。

そこで生じる問題がエンジニア間での引き継ぎです。

しかし、テストコードがあることで前任者がどこをどのくらいテストしたのか、どういった挙動になれば正しいのかといった証拠が残ることになります。後任者はこの証拠を元に開発を進めることができるため、メリットの1つであると言えます。

加えて、テスト手順や内容が簡単にドキュメント化されているとなお良いね。

仕様書(設計書)の代わりになる

この挙動の後はこのページに遷移する、ここの項目は必須、ここは特定のユーザーしか操作できないなど、実際の機能を想定してテストが行われます。

そのため「エンジニア間での引き継ぎが容易になる」にも通ずる所はありますが、テストコードはそのアプリケーションの仕様書の代わりになるというメリットがあります。

バグを早期発見できる

テストはユニットやモジュールといった小さな単位でこまめに行われます。

テストがこまめに行われることで開発途中でもバグを発見することができ、後々大幅な改修を余儀なくされるといった労力を避けることができます。

テストを行うことで、結果としてスムーズに開発できることが多いのもそのためです。

テストコードのデメリット

一方で、テストコードにもデメリットはあります。

主なデメリットとしては以下の3つが挙げられます。

  • テストコードの習得に時間がかかる
  • コード量が増えるため実装コストが増える
  • テストコードの保守運用もしなければならない

 

ここからトータルして言えることは、「テストは面倒くさい」ということです。

しかし、アプリケーションの品質を担保する上でもテストコードを書くメリットの方が遥かに大きいため、基本的にはテストは行うようにしましょう。

Railsテスティングフレームワーク

最後に、Railsにおける主なテスティングフレームワークを紹介したいと思います。

Railsのテスティングフレームワークは主に2つで、1つがRSpec、もう1つがminitestと呼ばれるものです。

これらの特徴としては、以下のようになります。

RSpecの特徴

多機能であるため、複雑なテストでも簡単に実装できること。

describe Greeting do
  it "says "Hello" do
    greeting = Greeting.new
    expect(greeting.word).to eq 'Hello'
  end
end
minitestの特徴

Railsに初期からインストールされており、セットアップがいらないこと。

class GreetingTest < Minitest::Test
  def test_say_hello
    greeting = Greeting.new
    assert_equal 'hello', greeting.word
  end
end
「test-unit」と呼ばれるテスティングフレームも存在しますが、あまり使われていないため今回は省略しました。

まとめ

  • プログラミングにおけるテストとは、作成したwebサービスが正しく動くかどうかをテストコードを書いて試験すること
  • テストは単体テストと統合テスト(結合テスト)の2種類に分類される
  • 単体テストとは、1つの機能に関して正常に動くかどうかを確かめるテストのこと
  • 統合テスト(結合テスト)とは、複数の機能が連動して行われる処理が正常に動くかどうかを確かめるテストのこと
  • テストコードのメリットとしては「引き継ぎが容易」「仕様書の代わりになる」「バグを早期発見できる」などが挙げられる
  • テストコードのデメリットとしては「習得に時間がかかる」「実装コストが増える」「保守運用」などが挙げられる
  • Railsにおける主なテスティングフレームはRSpecとminitestである

参考

 

 

今回はプログラミング開発におけるテストコードの意義について解説しました。メリット、デメリット共にありますが個人的にはテストコードは書く一択です。この記事を通してテストについて今一度考えていただけたら幸いです。