テストメソッドの依存関係

ほとんど同じ時期に、Martin FowlerCedricがテストメソッドの依存関係についてblogに書いているのは興味深い。Cedricのblogで書かれている

Recently, I started wondering why this principle seemed to be so important and I asked the following question to several developers: "Why is it important to have test methods that are independent of each other?".

I was quite surprised to receive pretty much only one type of answer: "So you can rerun your tests easily".

というのは間違いで、このことはblogへのコメントでも言及されている。テストメソッドが他のメソッドに依存してはならないということは、あるテストメソッドを実行する前の状態は常に同じでなければならないということを意味している。

とはいえ、これを実現するのはなかなか難しくて、目に見えないところで更新されているデータベースだとかThreadLocalのようなグローバルな状態は見のがされがちだ。テストメソッドやテストクラスを単体で実行するとテストをパスするが、全テストメソッドを実行するといくつかのテストをパスしない現象の原因は、たいていこういう所にある。

ところで、テストが失敗した時に全ての状態を初期状態にもどすことは可能なのか?JUnitの場合、tearDown()でがんばることはできる。しかし、tearDown()の実行中にエラーが発生した場合は初期状態にもどせないまま、次のテストを実行することになる。僕は、setUp()やtearDown()が失敗した場合は、他のテストの結果は信用しないようにしている。