プログラムをテストするプログラム ~できるだけ楽したい~

こんにちは。製品企画室の土井です。
ここ数日で一気に気温が下がり、Tシャツ1枚では厳しくなってきました。
風邪をひかないよう体調管理には気を付けたいと思います。

今回は、テストコードについてお話したいと思います。
テストコードとは、プログラムが正常に動作しているかを確認するプログラムのことです。

どんな場面で役立つか?

例えば、あるWebアプリケーションには、アクセス可能なURLが100種類存在するとします。ちょうどシステムの改修が完了し、動作確認を行いたいと思っています。しかし、今回の改修によって、思わぬページでエラーが発生するかもしれません。心配なので、全てのURLにアクセスし、問題なく画面が表示できるかどうかを確認することにしました。

このような場面があるとします。もし、この確認作業を手作業でやるとしたらどうでしょう? おそらく100種類全てのURLを書き出し、ひとつずつ実際にアクセスして、きちんと表示されるかを確認することになるかと思います。GETリクエストならURLを入力すれば済みます。しかし、POSTリクエストの場合、入力フォームに値を入力する必要があります。さらにデータベースにきちんと登録されたところまで確認したいです。1回きりの動作確認であれば、面倒ではありますが手作業で確認することも可能だと思います。ですが、こういった動作確認はシステムを改修したタイミングで毎回必要になります。システムを改修する度に、100種類のURLを全て手作業で確認するのは非常に大変です。

そこで、動作確認を専用のプログラムに手伝ってもらうことにします。それが『テストコード』です。私の場合、Railsアプリを開発しているため、Rspec(中でも特にRequestSpec)と呼ばれるテストを使用しています。

どんなことができるか?

先ほどの場合のように、アクセスしたページがきちんと表示されるかどうかをプログラムで記述してみます。GETリクエストの場合、以下のような記述になります。

1. get "アクセスしたいURL"
2. expect(response).to have_http_status(:success)

1行目でGETリクエストを送信し、2行目でHTTPステータスコードが正常処理で返ってきたかどうかを確認しています。単純なアクセスだけなら、この2行だけで確認することができます。(画面内の表示が正しいかどうかなどの確認は別途必要になりますが…)

POSTリクエストも同様にテストすることができます。

1. expect do
2.   POST "アクセスしたいURL", params: { name: "hoge", comment: "hello" }
3. end.to change(Comment, :count).by(1)

2行目でパラメータをつけたPOSTリクエストを送信します。3行目では、2行目のリクエストの結果、データベースのCommentの件数が1増えているか(正常にデータが登録されたか)を確認しています。

テストコードで楽をしよう

このようなテストコードを書いておけば、テストを実行するだけで大量のURLを自動で動作確認することが可能です。もちろん、これだけでは動作確認としては不十分です。HTTPステータスが正常でも、画面表示がおかしくなっているなどの場合があるからです。とはいえ、エラー画面が表示されないことの確認だけなら、これぐらいのコードでも確認ができそうなので、手作業でやるよりは大分マシだと思います。画面内の表示をテストするためのFeatureSpecと呼ばれるものもありますが、今はRequestSpecの勉強だけで手いっぱいなので、またの機会にお話したいと思います。

色々書きましたが、結局「自動化できる部分は自動化しちゃったほうが楽!」というお話でした。

ABOUTこの記事をかいた人

土井 周平

茨城県は東海村から来ました土井周平と申します。 趣味は軟式テニスで相手をしてくれる方を探していますので、 興味のあるかたはぜひお声掛けください。 1日も早く胸を張って"エンジニア"と名乗れるように努力していきます。