hiyoko-programingの日記

プログラミングを勉強したてのひよっ子。   エンジニア目指して勉強中。

テストの概念

テストとは

プログラミングにおけるテストとは、「プログラムが意図した通りに動くことを確かめる」ことを言う。このテストもまたプログラムによって行っているが、便宜的に、本番の環境で実際に作動するプログラムを「プロダクションコード」、テストを行うためのプログラムのことを「テストコード」と呼ぶことにする。

Railsにおけるテストについて

Ruby on Railsにおいては、基本的にはモデルとコントローラのファイルに対してテストコードを作成する。その際はRSpecという独自の言語を利用する。

 RSpec

RSpecは、Rubyを元に作成されたテストに特化した言語である。 「rspec-rails」というGemをインストールすると、RSpecを利用できる。

テストコードの大切さ

テストコードはとても大切である。テストコードを書かなければ、プログラムは想定していなかった動きを見せる可能性が高くなる。

もしもテストコードを書いていなかった場合の失敗例

例えばあなたが、毎日1万人が訪れるサイトのシステムを担当しているエンジニアだとする。この度、新機能を追加することになった。コードが完成し、いよいよ実際に動作しているサイトに適用する。しかし、テストコード無しで、つまりプログラムが意図した通りに動くことを確かめずに記述していったあなたのコードには、思いもよらない原因で発生するバグが潜んでいた。
うっかりバグが残ったままのコードを本番のアプリケーションに適用してしまったせいで、アプリケーションが停止してしまった。そして、毎日利用している1万人ものユーザーが迷惑を被る。そのことによる金銭的な損失や信用の喪失は、計り知れないものになったのだった・・・。

テストは、こういった事態を防ぐために必要である。
あらゆるケースを想定し、「バグがないことを確かめてから」本番に適用するようにするのがテストコードを書く意義である。

テストを書くメリット

基本的に、ひとつのプロダクションコードに対してはひとつのテストコードが必要である。
例えばRuby on Railsにおいては、モデルクラスやコントローラークラスひとつにつきひとつのテストコードを書かなければいけない。これは面倒に感じるかもしれないが、それを補いなお余るほどのメリットも存在する。それは、主に以下の3つ。

1.仕様漏れを減らすことができる

テストをするにあたっては、対象のメソッドがどのような目的で作成されどんな挙動をしなければいけないのかということを全て洗い出す。結果的に仕様を良く確認することになり、バグを引き起こす仕様漏れを少なくすることができる。

2.リファクタリングや機能追加をしやすくなる

リファクタリングとは、コードをより綺麗なかたちに修正する作業のこと。一度テストを通過してしまえば、最終的な結果を維持しリファクタリングをするのが簡単になる。また、新たな機能を追加する際も、従来の箇所は間違いなく動いていることを確認できているので、その結果を崩さないようにするだけで安全に実装することができる。

3.楽しくコードを書ける

テストを通過するという快適な体験を重ねることで、コードを書く作業が楽しくなる。注意力が必要で神経をすり減らしやすいプログラミングという作業において、楽しくコードが書ける、ということは非常に重要である。

テストコードを書く際の心がけ

テストコードを書く際は、開発にスピードを求めることはない。また、コードがある程度似たものの繰り返しになることも許容する必要がある。

スピードは求めない

コードを書く量が増えるので、開発スピードが遅くなることは許容。

DRYを意識し過ぎない

DRYとは、Don't Repeat Yourselfの頭文字をとったもので、「同じような記述はなるべくまとめられないか考える」というプログラミングの原則。
しかし、テストコードを書く際はわかりやすさ優先である。DRYを意識し過ぎるとわかりづらくなることがあるので注意する。

テストの種類について

テストは、主に単体テスト統合テストという2種類に分類される。単体テストとは、単体で動くプログラムが正常に動作するか確かめるテストのこと。統合テストとは、複数のプログラムが組み合わさった機能が正常に動作するか確かめるテストのこと。

単体テストとは

ひとつのプログラムのまとまりに関して、それ単体が正常に動くか確かめるテストのことを単体テストと呼ぶ。例えばRailsであれば、モデルクラスひとつ、コントローラークラスひとつにつきそれぞれテストコードを書く。

統合テストとは

複数のプログラムが連動して行われる処理が意図した通りに行われるかを確かめるテストのことを統合テストと呼ぶ。例えばRailsであれば、ユーザーの新規登録における一連の処理をテストすることが考えられる。ユーザーの新規登録用画面から値を入力、送信して、データベースにレコードが追加されるまでの一連の流れをシミュレートするテストコードを書く。