質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

4932閲覧

Javaのアサーションと単体テストについて

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

2クリップ

投稿2016/08/16 09:46

Javaのアサーションと単体テストについての質問です。
ある入力値に対してその戻り値が目的の結果となるかを確認するテストにアサーションは向きません。
さらに、アサーションを用いるとコードは当然のことながら長くなってしまいます。

そうすると、なぜアサーションを用いるのでしょうか。
全てのテストをテストクラスに書いて行った方がよくないですか?
アサーションの意義や有用性はどういったものになるのでしょうか。

yohhoy👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

アサーションの意義や有用性はどういったものになるのでしょうか。

アサーション(assertion)とテスト(test)とでは目的が異なります。また互いに相補的なものですから、両方を記述していくのが好ましいです。

  • アサーション=アルゴリズムや内部処理ステップの正当性を保証すもの。主に不変条件を確認する。
  • テスト=メソッドの外部仕様/外からみた振る舞いを保証するもの。主に事後条件を確認する。

さらに、アサーションを用いるとコードは当然のことながら長くなってしまいます。

アルゴリズムや内部処理の区切りに、不変条件を確認するassert文を配置する程度であれば、コードの肥大化を気にする必要はないと思います。アサーションにより得られる正当性の保証は、ソースコードが多少間延びするデメリットを大きく上回るはずです。

Javaのアサーション(assert文)については、下記サイトが参考になります:


そもそもメソッドの引数チェックってするものなのでしょうか。

するものです。

重要なメソッドだったら、引数チェックの必要があり、assertを使うと無効にされる恐れがあるから、ちゃんとしたチェックにしろ、という意味でしょうか。

外部公開する(≒publicな)メソッドでは、常に引数チェックを行うべきです。assert文は無効化される可能性もあるため、外部メソッドの引数チェックとしては不適切です。

もし、そうだとすれば、なぜpublicでないメソッドの方はassetionで良いということになるのでしょうか。

引数チェックのようなメソッドの事前条件チェックは、クラス内部(自分)とその外部(他人)の責任分界点を明確化したうえで行う、防衛的プログラミングの一種です。publicでないメソッドは、呼び出し元も自分の責任ですから、assertionでも十分という判断になります(もちろん、publicメソッド同様に引数チェックしてもよいです)。

投稿2016/08/17 01:57

編集2016/08/17 06:41
yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/08/17 05:11

事前条件 規約により、public メソッドの事前条件は、特定の指定された例外をスローする明示的なチェックによって適用されます。たとえば、 /** * Sets the refresh rate. * * @param rate refresh rate, in frames per second. * @throws IllegalArgumentException if rate <= 0 or * rate > MAX_REFRESH_RATE. */ public void setRefreshRate(int rate) { // Enforce specified precondition in public method if (rate <= 0 || rate > MAX_REFRESH_RATE) throw new IllegalArgumentException("Illegal rate: " + rate); setRefreshInterval(1000/rate); } この規約は、assert 構文を追加しても影響を受けません。public メソッドのパラメータのチェックにはアサーションを使用しないでください。public メソッドは、常に引数チェックを適用することを保証するので、assert は適していません。public メソッドは、アサーションが有効かどうかにかかわらず引数をチェックする必要があります。さらに、assert 構文は、指定した種類の例外をスローしません。assert 構文がスローできるのは、AssertionError のみです。 ただし、クライアントがクラスを使用して行う処理の内容にかかわらず true になることがわかっている public ではないメソッドの事前条件については、アサーションを使用してその事前条件をテストできます。たとえば、前述のメソッドによって呼び出される次の「ヘルパーメソッド」内ではアサーションの使用が適しています。 /** * Sets the refresh interval (which must correspond to a legal frame rate). * * @param interval refresh interval in milliseconds. */ private void setRefreshInterval(int interval) { // Confirm adherence to precondition in nonpublic method assert interval > 0 && interval <= 1000/MAX_REFRESH_RATE : interval; ... // Set the refresh interval } 回答ありがとうございます。 上を要約すると、publicが付いていたら、asserによる事前チェックはするな publicが付いていなくて、確実にtrueが返ってくるならば、assertによる事前チェックをしても良い というような内容になると思うのですが、理由がよく理解できませんでした。 「public メソッドは、常に引数チェックを適用することを保証するので、assert は適していません。public メソッドは、アサーションが有効かどうかにかかわらず引数をチェックする必要があります。」 そもそもメソッドの引数チェックってするものなのでしょうか。 重要なメソッドだったら、引数チェックの必要があり、assertを使うと無効にされる恐れがあるから、ちゃんとしたチェックにしろ、という意味でしょうか。 もし、そうだとすれば、なぜpublicでないメソッドの方はassetionで良いということになるのでしょうか。
guest

0

アサーションのメリットとしては、「動作の途中で状態チェックをできる」ということがあります。テストメソッドではメソッド単位以上の粒度で動作検証を行うことはできませんが、アサーションであれば、「この行でこの条件を満たす」ということを検証できます。

投稿2016/08/16 09:57

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Java標準のアサーションはデバッグ用であり、テスト用コードではありません。

今でこそJUnitやテストファーストの考え方があるのでクラスの単体テストを記述できる文化が浸透していますので意味はありませんが、導入される前は実装コードにデバッグ用のログ出力をわざわざ追加して動作確認することも往々にしてありましたので、有用ではありました。

投稿2016/08/16 10:10

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問