ボクココ

個人開発に関するテックブログ

テストコードとプログラミング能力

テストを書くべきだ、と人は言う。テストを書けば大きな変更にも柔軟に対応することができるそうだ。

テストをほとんど書いてなかったかつての自分にとってそれはよくわからないものだった。テストを動かすまでの手間や書いたとしてもテストを通すようにするまでにとても時間がかかっていた。

まぁ簡単に言えばテストの書き方をよく知らなかったのでテストを書くのが面倒だった。

テストを書かなかった場合

ここで1例を見てみよう。

class User
  field :f_name, type: String
  field :l_name, type: String
  field :nickname, type: String
  field :email, type: String
  field :tel, type: String
  field :sex, type: Integer, default: 0
  field :avatar_url, type: String
  field :character, type: Array
  field :description, type: String
end

こんな感じのモデルクラスがあったとする。このユーザは至る所で更新や作成が行われているとしよう。
ある日、バリデーションのコードを書かないといけなくなった。なので、こんな感じで追加する。

  validates_confirmation_of :password, on: :create
  validates_uniqueness_of   :email
  validates_presence_of     :email, on: :create
  validates_email_format_of :email, on: :create
  validates :password, length: {:within => 8..255}, on: :create
  validates_length_of :f_name, in: 1..255, allow_nil: true
  validates_length_of :l_name, in: 1..255, allow_nil: true
  validates_length_of :nickname, in: 1..255, allow_nil: true

はて。追加したはいいものの、既存のアプリはこれで全部動くのだろうか?
一個一個ユーザの作成、更新部分をまたアプリから実行しないといけない。これは面倒。そして思いついた一つの箇所以外にユーザの更新部分があったとしたら?これですぐにバグが発生する。
だから変更するとテストが大変だからあまり修正入れたくない。そうすると柔軟な仕様変更にすぐ対応できなくなる。アプリの機能追加もままならなくなる。ライバルに先を越される。急いだらバグが出て問い合わせ殺到。
てな感じの運命になる。

テストの魅力

テストを書けば、その箇所がエラーになる(可能性が高い)のですぐ検知できる。ソースとテストコードを修正していけばわざわざアプリから見なくても大丈夫な場合だってあるだろう。
コードを修正してテストコードで問題が検知できた瞬間。まさにこの時こそ「テストコードを書いていてよかったなぁ」と感じる瞬間だ。

どうすればテストをかけるのか

これはプログラミング能力を向上させないと厳しいと思ってる。テストを書くにはそれぞれのクラスでしっかりとした役割分担をしたコードを書くことが前提となる。1つのクラスで全てを任せてしまうようなコードを書いているとテストはかけない。当時の自分がそうだったように、これが原因でテストを書きにくくし、テストを書くモチベーションを下げさせる。
だから最初テストが書けないのは仕方ないことだと思う。まずはちゃんとクラス設計できるようになり、モジュール化された簡素なコードを書けるようにするのを目標にした方がいい。そのためには自分でコードを書いて、それをメンテナンスする経験が必要だ。それで自分(他人)の書いたクソコードを見て反省し、それをリファクタリングするなり次のコーディングに活かすなりをして成長していくのだ。