はじめに
知人と話していて、「レガシーコードをメンテナンスしており、リファクタリングをしているが、テストは書いていない」という話を聞いて、それは違うのではないか?と思ったので、ポエムを書こうと思います
書いていることは、大体「リファクタリング」本や「レガシーソフトウェア改善ガイド」「レガシーコード改善ガイド」に書いてあることなので、まずはこれらを読みましょう。
リファクタリングとはなにか?
外から見たときの振る舞いを変えずに、内部の構造を変えることです。
外から見たときの振る舞いを変えずに、というのを検証するためにテストが必要になってきます。
テストを書かなかった場合に、どんな問題があるか?
テストを書かなかったときの問題点①
壊していても気づかない。気づけない。
テストを書かなかったときの問題点②
良い設計になっているか検証できない。 悪い設計になっている特徴として、テスタビリティが低いというのがあると思っています。 リファクタリングしたと思ったけれど、逆リファクタリング、デグレさせている可能性さえあります。
レガシーコード(テストがない)の場合の対処法
個人的には以下の選択肢があると思っています
- 先にテストを書く。書いたところだけリファクタリングする
- 結合テストを書いておいて、その上でリファクタリングし、リファクタリングした後に単体テストを書く
- (関数の抽出など振る舞いがほぼ変わらないといえるリファクタリングのみ)リファクタリングをした後に、すぐに単体テストを書く
終わりに
テストが書けないと言っている場合も、よくよく見てみるとテストをかける場合が多いと思っています。 また、こんな面倒なことにしないためにも、最初からテストを書いておきましょう。