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

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

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

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

Q&A

5回答

4982閲覧

単体テストで引数がnullのパターンを実施する理由がわかりません

ametyan

総合スコア43

Java

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

0グッド

1クリップ

投稿2021/08/20 22:09

単体テストで引数に正常系と異常系を設定してテストするテスト仕様書を今まで見てきました。
正常系は分かるのですが、引数にnullを設定する異常系のパターンを何故テストするのかが分かりません。
引数にnullを設定してヌルポが発生することを想定結果としているのですが、テストする意味があるのでしょうか?

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

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

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

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

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

gentaro

2021/08/20 22:18

わからない理由を述べて欲しい。 何故不要だと思うのか。
m.ts10806

2021/08/20 22:40

設計者に聞いてください。
sigsegv

2021/08/20 22:46

異常系テスト全て不要と思ってるのか、 null のテストだけ不要と思ってるのか
Zuishin

2021/08/21 01:03 編集

> 引数にnullを設定してヌルポが発生することを確認 要るじゃないですか。 そもそも何のためにテストをするかわかってないとか? まさかテスト対象の関数をいじらず全部通るテストを作ろうとしてるとか?
guest

回答5

0

どんなメソッドかわからないので設計も含めた個人的に採用しているルールです。
ベースとなる考え方は引数がnullになりうるかどうかです。

下記のケースではnullチェックを行い独自に用意した例外をthrowし、テストも行います。

  • ライブラリとして公開する場合
  • 引数がユーザの入力によるものの場合
  • 引数が他システムからのデータによるものの場合

下記のケースではnullチェックもせずテストも行いません。

  • メソッドが使用される範囲が限定的かつ実装ミスでしか入らない場合

限定的とは何ぞやというところが迷いどころではありますが……。

テストコードであったとしてもNullPointerExceptionを想定するのは設計が怪しいように思います。
確認したいのは本当にNullPointerExceptionの発生ですか?
本当は独自の例外が発生する想定だったのにチェックの実装が漏れていた or 誤っていたとかじゃないですか?

投稿2021/08/21 01:08

denimu

総合スコア35

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

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

0

そのモジュールのテストは、nullを受け付けるとどのような挙動になるのでしょうか?

NPEが発生するのが仕様であるなら、発生しない場合バグですよね?
それを確認しているのかもしれません。

前提として、引数がnullならNPEが必ず発生するのが当たり前というのがあるのかもしれませんが、
それは実装次第です。

ちなみに既回答にありますが、null渡してNPEが発生するのは設計・仕様がいけてないとは思います。
安全を重視するなら、そもそも例外投げない仕様・実装にするとか、
プロジェクト固有のRuntimeExceptionにまるめるなどが考えられます。

あとは質問者さんの疑問に思う通り、
いわゆるセッターゲッターを個別にテストしないのと同様に、
NPEが発生したら明らかにモジュールの利用方法がおかしいと判断するテストが不要な項目の可能性はあります。

投稿2021/08/23 02:39

momon-ga

総合スコア4826

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

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

0

何故災害に供えて避難訓練等するのでしょうか。
何故企業は製品に「子供が飲み込まないように」だとか「火に近づけないように」だとかの注意書きをするのでしょうか。
異常事態を想定内として対応出来るようにするためです。

オブジェクトを渡せるところには( @Nonnull 等無ければ?) null も指定できます。言語レベルではそれは『正常』です。
NullPointerException も仕様として存在するのですから発生するのは『正常』です。

「なら『異常』とは何か」となりますが、それは「想定外」のことであり、それこそ「バグ」 であり、それは「作った側の想定不足」です。
(バグの由来とされる「コンピュータ内に虫が入ってショート」を想定してプログラムを組むことが可能とは思えませんが^^;)

「書いた通りに動く」プログラムにおいて、その書き手であるプログラマは、そのプログラムの動作には責任があります。
だからこそテストするのであり、可能な限りの全てを「想定」し、『正常に』動作することを確認しておく必要があるのです。

投稿2021/08/21 03:08

jimbe

総合スコア13209

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

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

0

そういうテストをやったことがないので、あくまで予想ですが、

・テストというよりも、異常によって起こりうる損害の確認。例えば、無条件にdelete文発行してないかとか。
・テスト工数の水増し。
・閾値テストの一環。

当たりでしょうか。

テスト観点は、プロジェクトによって異なるので、
疑問は、テストルールを決めてる責任者の方に聞いた方がよいとは思います。

投稿2021/08/21 03:25

TetsujiMiwa

総合スコア1124

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

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

Zuishin

2021/08/21 03:38

異常という用語と閾値という用語が間違って使われているように読めます。
guest

0

実装上その値を受入可能となっている時点で試験すべきものです。
NullPointerExceptionを個別で捕捉して想定の例外として処理する設計になっているなら尚更です。
余程の理由がない限り、カバレッジは100%にすることが基本です。

あとは設計者の意図やシステムの要件次第。

投稿2021/08/20 23:07

m.ts10806

総合スコア80875

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問