このサイトについて

Pythonでプログラムのテストを続けるための3つの習慣

Pythonでプログラムのテストを続けるための3つの習慣

テストをなかなか始められない人が多いように思います。
テストの効用として,コードのクオリティが高くなったりメンテナンス性がよくなったり,といったことはよく言われることです。また,テストのことを考えな がらコードを書くようになるので事前に十分な思考実験をするクセがついて,行き当たりばったりの開発をしなくなります。テストしやすいコードを書くように なるので,コードのモジュール性が高くなり,結果として再利用性の高い高品質なコードを書けるようになる,という利点もあります。
全部分かっていても,テストは面倒だし,テストを書くためには予備知識も必要なので,そんなことがハードルになってなかなかテストを書くというクセがつかないというのが,テストをなかなか始められない方のおおかたの意見なのではないかと思います。
定期的に開催しているPythonの勉強会の「Python Code Reading」10回 目では,Pythonの標準モジュールに含まれるテストコードを見ながら,Pythonのテストについて解説するセッションを担当します。ついでに,「どうすればテストを始められるようになるのか」というようなことも話そうと思っているのですが,このエントリは勉強会で話そうと思って いることの抜粋です。主にPythonのテストについて書いていますが,方法論は他のプログラミング言語にも適用できるはずです。

関数のテストからはじめる

新しいことを初めるための最良の方法は簡単なことから始めることです。テストで一番簡単なのは関数のテストです。クラスのテスト,DBがバックエンドにあ るコードのテストや,Webアプリのテストに比べ,単体の関数のテストはものすごく簡単です。まずは関数のテストを書くことから,テストに慣れて行きま しょう。
Pythonで関数のテストを書く方法には,「if __name__ == '__main__':」ブロックにコードを書くとか,よりPythonicなdoctestなどがあります。
doctestは関数のドキュメンテーション文字列にインタラクティブシェルで実行した結果を貼り付けるという面白いテスト手法です。「関数を書く -> インタラクティブシェルで関数を使う -> テストとして貼り付ける」というサイクルになるため,テストを先に書くべしとする純粋なテスト駆動開発には利用できないのですが,手軽だし,テストと同時 に関数のドキュメンテーション(テストを見れば関数の使い方が分かるので)かできてしまうなど,とにかく手軽です。テストの世界への入り口としてはこの上 なく最適。
オブジェクトの生成や,データベース接続,htppd経由のアクセスなど環境の準備が必要なテストにはdoctestを使わないことです。引数を渡して結果を得るシンプルな関数のテストを書くことで,まずはテストに慣れましょう。

エラーになるケースのテストも書く

どんなケースでテストをすればいいのか,というのは意外に深淵な話題なのですが,関数の場合であれば「正しく動くケース」「正しく動くケースのウチ,ギリ ギリの値(境界値)」のテストを必ず書くようにします。また,これは忘れがちなのですが,エラーになるケースも必ず書くようにしましょう。エラーになるべ きケースがエラーにならなかったとしても,関数は正しく動いていないことになります。
エラーケースをテストすることは,良い副作用をもたらしてくれます。まず,テストを書くことに対する「心理的ストレス」が和らぎます。自分が正しいと思っ て書いたコードに対するテストをわざわざ書くわけですから,テストには「コードを書く自分自身を疑う行為」という側面があるのです。OKなケースだけでな く,エラーになるケースもテストに含めることで,自分の書いたコードを否定する,という意味が少し和らぐはずです。
また,エラーになるケースをテストに含めるように習慣づけることで,自分の書いたコードに対する視野が広がります。コードを書く前,設計の段階でテストについても考えるわけで,エラーにすべき引数,与えられ得る引数のバリエーションについて考えるようになるわけです。

便利なツールを積極的に使う

関数のテストに慣れてきたら,徐々にテストの幅を広げてゆきましょう。インスタンス生成を伴うクラスのテストをするにはユニットが便利です。データベース接続やhttpd経由のアクセスのテストなど,環境の整備が伴うテストには,専用のツールを使うとよいでしょう。
Pythonの標準モジュールにはUnitTestというユニットテスト用のクラスが備わっています。より便利なテスト用のツールとしてnoseなどがあります。このようなツール を使うと,より手早くテストを書くことができます。ツールを使いこなすためには学習コストが必要で,つまり使い方を学ぶ時間が必要なのですが,学習に費やした時間は,ツールが削減してくれる時間で相殺されて余りあるものなのです。
最近のフレームワークはテストを装備していて,カバレッジ(テストの適用範囲)も広いものが多いようです。Webからコードのリポジトリを見て,testディレクトリ以下にあるテストコードを読んでみると,より複雑なテストへのヒントをたくさん発見できるはずです。



2010-08-27 04:51