実行結果を記録して、過去の実行結果と比較する機能をPySpecに組み込みました。0.53のリリースはまだ先ですが、codeplexのPySpecのページのソースコードのところからダウンロードできます。ドキュメントは、テストコードと、サンプルコードのみですけど。
レガシーコードのテストといっても、実際はレガシーコードを改修したり、機能追加したりする、というストーリーで考えています。
少し、この記録テスト機能を使ってみた感覚から、テストのステップを考えてみました。ちなみに、記録機能は、メソッドの入力、出力を記録するかどうかを変更できます。また、プロキシとして動作し、オブジェクトのメソッド呼び出しを記録する機能に関して、今は全部のメソッド呼び出しを記録しますが、正規表現か、配列かをつかって、メソッド記録のフィルタリングは実装しようかな、と思います。
- まずはコードのエントリポイントを探す/作る
- まずは記録機能を使ってエントリポイントから起動するコードを作成
- 次に、別のテストケースで、上記コードを通常のテストとして書く(shouldを使う)
- 記録機能の内容表示機能を使うと、メソッド呼び出し記録を出力できるので、記録をみながらコード改修。
- テストが通ったのを確認する
- もし、コード改修のために記録テストが失敗するようになったら、記録をリセットしておく
- これで全部のテストがパスするので完了
最初は、普通の仕様記述の中に記録機能呼び出しも書き込んでおいたのですが、コード変更がうまくいかなくてテストが実行失敗するのか、呼び出しの順序や引数が変化したせいで実行が失敗したのか、区別がつかなくなっちゃうので、別のテストケースとしました。
ユニットテストのメリットとして、コードがテストしやすくなる、というのがあります。なぜテストしやすいかというと、プログラムを実行してみる玄関、エントリポイントが増えるからです。このレガシーコードのテスト機能であっても、まずはそこが重要になります。ここがうまく行かない場合は、手探りでエントリポイントを作成する必要が出てきて、スタートに時間がかかるようになると思います。
ここまで試してみて、追加で欲しくなった機能はカバレッジ機能。後はスタックトレース表示かな。コード実行の様子が目で見ることができれば、不要なコードの掃除もはかどるようになるように思います。