初心者プログラマを抜け出した気がするのでテストを書いてみました

初心者はテストを書かずにどんどんコーディングをしろ派なのですが、僕も 2 年ほどプログラマーをやってきてようやく全体像が見えてきた気がするのでテストを書いてみました。
phpunit という単体テストツールを使っての簡単なテストしか書いていませんが、感想としては、「開発にミスが少なくなりました。」
テストを書くメリット・デメリットについてもまとめました。
単体テストとは
単体テストとは、「1 つのメソッドが動くかどうか」だけをテストするものです。もっと複雑になると、ブラウザで実際に動かしてみるブラウザテストや、HTTP だけを動かす HTTP テスト、他のプログラムと連携させる結合テストなどがあります。
プロジェクトによってどこまでが単体でどこからが結合か、差が出てくるので完璧に定義できるわけではないと思います。
単体テストは、テストの中でも一番小さな単位で行うということだけ覚えておけばいいでしょう。
単体テストを書いてみる
このブログでは、コードは書かないので、テスト設計に関してだけ触れます。コードを書くとしたら多分 Qiita に書きます。気が向いたら。。
テストの流れは以下の通りです。
- テストをするメソッドを決める
- データを用意する
- メソッド実行後の値を決める
- データがメソッドによって正常に変わっているかをテストする
例えば、ユーザが持つ A という値を B に変えるメソッド(a_to_b)をテストするとしましょう。
用意するデータは A です。ユーザ A というデータをテストを実行する前に作成しておきます。その後 a_to_b というメソッドを実行します。
正しい動作はユーザ A がユーザ B に変わっていることなので、「ユーザが B になっている」というテストコードを書きます。
単体テストはこれだけです。
テストの何がいいのか
単体テストは最小単位でのテストなので、わざわざ書くまでもないかもしれません。しかし、使ってみると、開発中にエラーが出ることがあるんです。
メソッド名を変えたり、B じゃなくて C に変えちゃうことがあるからです。
うっかりミスを防ぐことができるので、大胆に開発ができるというか、無駄な精神力を使わなくてすみます。
また、テストを最初に書いておけば、何を実装すればいいのかが明確になるので、寄り道をすることなくゴールまでたどり着けます。
初心者はやらなくてもいいかな
テストにはメリットがありますが、初心者プログラマはテストを書かなくてもいいという意見は変わりません。
コードの全体像が見えていない人がテストの設計はできないと思っていますし、局所的な設計をしてしまうと、「全く信用できないテスト」が生み出されて、返って迷惑になってしまいます。
初心者のうちは、それなりに恵まれている職場なら先輩がコードレビューをしてくれるので、先輩がテストツールみたいなものです。
下手なテストコードを書かずに先輩に見てもらったほうが、職場全体の効率が上がります。
それでもテストを書きたい人は、個人開発でテストを書いてみたらいいのではないでしょうか。
テストが書けるかどうかはスキルに反映される
フリーランスエージェントに相談に行ったとき、「テストコードを書けるかどうか」を聞かれました。やはりテストを書く現場に入るには、テストコードが書けないといけませんからね。
実際どのくらいの人がテストを書けるのかと聞いてみたところ、「だいたい半分くらい」だそうです。みんな当たり前のように書いていると思っていたけど、意外と書いていないんだなと感じましたね。
つまり、テストを書けない人はプログラマとしてやばいなんてことは決してなく、テストが書ければスキル的に有利になると考えてもよさそうです。
プログラミング教室なんかだと、テストまで教えてなさそうですもんね。大企業だとテストコードではなく、テスターがシステムを動かしながらテストをしていますから、意外とテストを書ける人材は少ないのかもしれませんね。
というわけで、中級プログラマへの道を一歩踏み出しました。テストが書けると「テスト書けないコンプレックス」が解消されたみたいでスッキリするので、勉強してみるといいかもですね。