テスト対象のシステムからクラスを抽出するときに、ユニットテストをリファクタリングする必要がありますか?


13

いくつかのことを行うこのクラスを作成しました(おそらくこれは単一責任原則の違反です)。私はプロジェクトのいくつかの他の部分が必要であることを今実感作品そのロジックのを、私はそれを公開するつもりだ方法は、私のオリジナルテスト対象システムのうち、クラスを抽出することです。

テストコードを変更せずにこれを行うことができると予想していますが、完了したら、テストはユニットテストではなくなったと主張できます。元のクラス抽出したクラスをテストします。つまり、テストケースは1つですが、テスト対象のシステムは2つになります。

完了したら、テストコードをリファクタリングすることになっていますか?IE:ExtractedClassTestを作成し、関連するすべてのテストをOriginalClassTestからそこに移動しますか?これは少しリスクが高いようです:プロセスのカバレッジを失う可能性があります。テストを移動するほど簡単ではないかもしれません。等

一方、OriginalClassTestをそのままにしておくと、これがテストメンテナンスの問題であることがわかります。ExtractedClassのテストがどこにあるかを見つけるのは少し混乱するでしょう。あなたの第一印象は、それが存在しないということです。量産コードのリファクタリングが多くなると、これは深刻な問題になる可能性があります。

私はTDDが初めてなので、専門家のアドバイスをお願いします。ありがとう!

回答:


7

この素晴らしい講演「Ian Cooper:TDD、どこでうまくいかなかった」を見た後、@ pdrに反対するつもりです。元のテストのみを保持する必要があると思います。テストを壊したり、書いたり、変更したりすることなく、テスト対象のシステムをリファクタリングする能力は、そもそもテストを書くことの全体的な目的です。

抽出されたクラスをテストする場合、動作ではなく実装をテストします。その結果、将来、私のコードはリファクタリングがより難しくなります。これらの新しいテストは、動作がまだ機能していても失敗する可能性があります。


6

開発期間中は、両方を用意してください。何も壊していないことを保証するために古いテストを保持し、新しいテストを(最初から)書いて、クラスをあるべき設計に役立てます。

最後に、古いテストで無効だったものをすべて実行して削除します。この分析には注意してください。あなたはそれが機能しないと思うので、何かを削除しないでください。もはや必要ない理由を自分自身(または他の誰か、またはゴム製のアヒル)に示してください。テストを中断し、別のテストが中断することを確認します。

古いテストに残っているものは、ケースバイケースで取得する必要がありますが、ほとんどは新しい構造に書き換える必要があります。

あなたは正しいので、メンテナンスの悪夢に取り残されたくありません。しかし、以前よりも少ないパスカバレッジを望んでいません。


1
私はこれをやったばかりで、かなりやる気がないと言わざるを得ません。私の変更は単純なものでしたが、テストを正しくリファクタリングしたことを確認するのに約2時間かかりました。物事を確認していることを確認するために、新しいテストにいくつかのテストを追加する必要があることが明らかになりました。クラスを抽出し、2つのシステムをテスト中のままにしておく方が効率的だったと思います。この作業量は、テストの作成が不十分だったことを示唆していますか?
ダニエルカプラン

1
@tieTYT:そこに座ってあなたを見ながら答えることは難しい。時にはTDDは価値がある以上の作業のように思えます。また、気になる理由を思い出すこともあります。そして、それを難し​​くしているのはあなたです。違いを理解することは、TDDを上手に使うための大きな部分です。
pdr

この場合、テストをリファクタリングするべきではなかった可能性があると思いますか、そうではないと思いますか?
ダニエルカプラン

1
@tieTYT:ありそうもない、はい。ありえない
pdr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.