質問: Javaのアサーションと単体テストについての質問です。 ある入力値に対してその戻り値が目的の結果となるかを確認するテストにアサーションは向きません。 さらに、アサーションを用いるとコードは当然のことながら長くなってしまいます。 そうすると、なぜアサーションを用いるのでしょうか。 全てのテストをテストクラスに書いて行った方がよくないですか? アサーションの意義や有用性はどういったものになるのでしょうか。
回答: > > アサーションの意義や有用性はどういったものになるのでしょうか。 > > > アサーション(assertion)とテスト(test)とでは目的が異なります。また互いに相補的なものですから、両方を記述していくのが好ましいです。 * アサーション=アルゴリズムや内部処理ステップの正当性を保証すもの。主に不変条件を確認する。 * テスト=メソッドの外部仕様/外からみた振る舞いを保証するもの。主に事後条件を確認する。 > > さらに、アサーションを用いるとコードは当然のことながら長くなってしまいます。 > > > アルゴリズムや内部処理の区切りに、不変条件を確認する`assert`文を配置する程度であれば、コードの肥大化を気にする必要はないと思います。アサーションにより得られる正当性の保証は、ソースコードが多少間延びするデメリットを大きく上回るはずです。 Javaのアサーション(`assert`文)については、下記サイトが参考になります: * Java公式 アサーションを使用したプログラミング * JPCERT MET01-J. メソッドの引数の検証にassertを使わない * IPA Javaのアサーション (IPAのドキュメントは情報が古いためか、「事前条件のアサーション」の節は不適切です。理由はJPCERTの指摘を参照ください。) > > そもそもメソッドの引数チェックってするものなのでしょうか。 > > > するものです。 > > 重要なメソッドだったら、引数チェックの必要があり、assertを使うと無効にされる恐れがあるから、ちゃんとしたチェックにしろ、という意味でしょうか。 > > > 外部公開する(≒publicな)メソッドでは、常に引数チェックを行うべきです。assert文は無効化される可能性もあるため、外部メソッドの引数チェックとしては不適切です。 > > もし、そうだとすれば、なぜpublicでないメソッドの方はassetionで良いということになるのでしょうか。 > > > 引数チェックのようなメソッドの事前条件チェックは、クラス内部(自分)とその外部(他人)の責任分界点を明確化したうえで行う、防衛的プログラミングの一種です。publicでないメソッドは、呼び出し元も自分の責任ですから、assertionでも十分という判断になります(もちろん、publicメソッド同様に引数チェックしてもよいです)。