PHPTweetこんにちは、斉藤です。前々回はTDDというユニットテストを使った開発方法、前回はユニットテスト実行の自動化と、触れてきました。今回もやっぱりユニットテストについてということで、方法論などをtips形式でお送りします。プライベートメソッドのテストユニットテストでは、公開されているメソッドを呼び出して実行します。クラスを書いたことがある方なら知っている通り、プライベートメソッドを外部から呼び出すことは出来ません。そのため一般的にこれは、避けた方が良いと言われていますが・・・自分はテストしたい派なので、以下の方法をご紹介します。パブリックメソッドでプライベートメソッドを呼び出す一番簡単な方法ですね。この場合だと、公開APIと非公開APIの区別が出来なくなってしまいます。クラスに手を入れることになり、テストのためだけのコードが混じってしまうことがデメリットです。}}余談ですが、objective-cでは"クラスに手をつけず、クラスの機能を拡張できる"カテゴリーという機能があります。この機能を使えば、ユニットテストの時のみ、パブリックメソッドを追加する方法が取れます。リフレクションでプライベートメソッドを呼び出すPHP、JAVAなどは、リフレクションという"プログラム自身を読み取る"機能が使えますので、それを使いましょう。これをテストコードの中のみに記述しておけば、実際に使うときには使われないので安全です。以下の例では、上記HogeクラスのdoSomethingメソッドをリフレクションで外部から実行しています。void型メソッドのテスト値を返さないメソッドをどうやってテストするの?って思いますよね?割と方法が考えられています。プロパティが変化するなら、その値に対してassertをかけるそのメソッド内でプロパティの値が変化するなら、その内容でテストをすることが出来ます。このプロパティがパブリックである、もしくはアクセスできるメソッドが公開されている場合に限ります。←コメントで、リフレクションを使えば良いということを教えていただきました。メソッド後にassertを置くそのメソッドが呼び出されたことだけを確認するならば、テスト失敗時に実行が止まることを利用して、メソッドの後にテストを記述します。実行結果は分からないですが、とりあえずエラー無く実行できた、ということを判断したい場合にはこれでもテスト可能です。exceptionを吐く可能性のあるメソッドに対して、有効ですね。その内容を必要な人に伝えるようにするこの方法は目からウロコですね。全てを自動化する、ということは出来ないという例でもあります。メソッドの内容によっては、システムが自動的にリカバリーすることは難しいといったケースもあります。いう時はメールを飛ばすなりで、運用者が気づくようにする、ということが必要になります。"ユーザーが使って買い物をする、WEBシステムで二重課金されてしまった"というパターンでは、運用者が手動でキャンセルをする、ということになります。テストを走らせることを忘れてしまう、面倒だと感じている手動で繰り返すと、どうしても気を抜いたときに実行しなくなってしまいます。JenkinsなどのCIツールや、watchmedoなどの監視ツールを使い、自動的に走らせるようにしましょう。そもそもユニットテストを何のために書くかもちろんメソッドがきちんと動いていることを確認するためですが・・・自分は以下のように考えています。仕様を反映したテストを書くことで、実装が正しいと認識できる正常系、異常系を記述し、プログラマー自身が実装を判断するためにも、ユニットテストは有効です。これについては、自分はこのようなことを言われています。結局ユニットテストといっても、書き手は実装するエンジニアになるので、その質はエンジニア力が求められます。「ユニットテストが動いているから、実装は正しいんだ」ではなく、「仕様に沿った正常系と異常系をテストする」という考え方をしましょう。scriptやCIツールなどを使ってテストを自動実行できます。手動で実行する手間が省けるだけでも、ユニットテストを頑張って書く甲斐はあります。実装を把握できるコードの引き継ぎを想定しています。テストが無ければ、自分が書いたときに正しい、と判断して書いていても他の人が引き継いだ際に、このメソッドが動いているのかどうかが分からない、なんていう事態も起こりうります。コードの正当性を担保しているユニットテストがあれば、新しい開発者はこれに目を通すことで何が正しいのかをメソッドレベルで確認することが出来ます。引き継ぎ自体もお忘れなく。ユニットテストについて述べてきましたが、いかがだったでしょうか。テストを書くことで、自分のコードにより自信を持つことができるようになると思います。このブログを読んでいただいた方の一人でも多くがユニットテストを書くようになれば、幸いです!それでは、また。byスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。