契約による設計手法をコーディングスタイルに取り入れようとしています。事後条件は、埋め込まれた単体テストのように私にはよく見えます。ここでの私の考えは、正しい方向に進んでいるのか、それともベースから外れているのか疑問に思っています。
ウィキペディアでは、事後条件を「コードの一部のセクションの実行直後、または正式な仕様での操作後に常に真でなければならない条件または述語。事後条件は、コード自体の中でアサーションを使用してテストされる場合があります」と定義しています。
これは、状態を直接検証する(モックを使用しない)単体テストで行うこととあまり似ていませんか?
だとしたら:
1)事後条件を使用することで、テストコードを本番コードに埋め込んでいるのではないでしょうか。また、それは眉をひそめているのではないでしょうか。
2)事後条件を使用すると、単体テストの構造を変更する必要がありますか?私の最初の考えは、アサーションロジックがテストから事後条件に移行することです。つまり、テストは同じ入力を使用し、以前にテストしていたすべてのものをテストしていますが、単体テストでアサーションを作成する代わりに、事後条件が合格するかどうかについて単純なバイナリアサーションを作成しています。
3)私の第二の考えは、事後条件コードには制御フローがある可能性があるため、単純で制御フローを回避することになっているテストコードには理想的ではないということです。しかし、事後条件をテストする場合、単体テストでそれらを信頼できますか?
4)事後条件をテストするのは難しいようです。正しく理解すれば、基本的に合格または不合格であり、事後条件自体のロジックを繰り返して、それが正しいことを確認する必要があるためです。では、どのように事後条件をテストしますか?単体テストでそれらを利用せず、単体テストと事後条件が一緒に合格または不合格になることを確認して、それらをチェックしますか?
5)ユニットテストでは、メソッドによって共同作業者の状態が変化したことが確認されることがあります。標準的な方法では、事後条件はコラボレーターの状態をカバーしますか、それともそれらが定義されているクラスの状態のみをカバーしますか?