web-dev-qa-db-ja.com

エッジケース、コーナーケース、ベースケース、境界ケースの違いは何ですか?

私はネイティブスピーカーではありません。私の母国語では、再帰を停止するためにチェックされる条件、および極端な、ありそうにない、または非常に単純なケースについてチェックされる条件を指すために使用されるいくつかの用語を知っています。英語では、「エッジケース」、「コーナーケース」、「境界ケース」、「ベースケース」という用語に出くわしましたが、違いを理解することはできません。それらの違いの概要を知りたいと思います。

特に、次のコードサンプルの行に注釈を付けていただければ幸いです。

    int transmogrify(int n) {
1.      assert(n <= 1000000);
2.      if (n < 0) return -1;
3.      if (n == 1000000) return PRE_CALC;
4.      if (n == 0) return n+1;            // For stopping the recursion
5.      if (n == 1251) return 3077;
        return transmogrify(n-1);
    }

考えるそれは:

  1. サニティーチェック
  2. 入力チェック
  3. 境界ケース?エッジケース?コーナーケース?
  4. 規範事例?境界ケース?
  5. コーナーケース?エッジケース?
95
Oak

私もネイティブスピーカーではありません。しかしウィキペディアによると:

  • エッジの場合 が発生する極端な(最大または最小の)動作パラメーター
  • コーナーケース が発生する通常の動作パラメータ以外、特に複数の環境変数または条件各パラメーターがそのパラメーターの指定された範囲内であっても、同時に極端なレベルになります。 (「通常の動作パラメーターの外」とは、厳密に「許可された動作パラメーターの外」ではなく、「通常の動作パラメーターの組み合わせの外」のようなものを明らかに意味します。つまり、有効なパラメータースペース内にいますが、コーナーの近くにいます。)
  • 境界ケース が発生する入力の1つが最大または最小の制限にあるか、それを超えたとき
  • 基本ケース再帰 が終了する場所です。

したがって、コーナーケースがエッジと境界ケースとは少し異なる(値の組み合わせ)ことを意味しているように見えても、用語は完全に混乱しているように見えます。エッジ、コーナー、境界のケースは一般的なスピーチで同じものであると言ってもおそらく安全です。誰かがそれぞれ違うことを言うことを意味するかもしれませんが、共通の合意はほとんどありません。

1)と2)はあなたが書いたもの、3)はエッジ/境界のケース、4)はベースケース、5)は特別なケースです。

100
Joonas Pulakka

単語の違いに関係なく、テストの記述に使用するものは、正確なコードではなく、テストのsemantics(意味)に依存します-提供されている例では、それぞれの内容が明確ではありませんテストは意味します。それはさておき、ここに私がそれらを理解する方法があります:

  • 健全性チェック= これは意味をなさないか?たとえば、アプリケーションが整数のみを出力する場合、 sqrt(-1) および log(-1) は未定義です。
  • 入力チェック=ユーザー入力をテストします対照的にいくつかの内部データ構造または関数の出力。たとえば、Bashでは、_[ $# -gt 0 ]_は、少なくとも1つの入力パラメーターを取得したことを確認します。これは、findmailなどのコマンドの健全性チェックでもあります。
  • エッジ/境界チェック= 正しい出力を生成することが期待される最大または最小入力。たとえば、数値に1を加えるだけの関数は、<MIN_INT>から<MAX_INT>-1までの動作範囲を持ちます。これは、<MIN_INT>より小さい入力はユーザーが提供できず、<MAX_INT>より大きい出力ができないためです。役に立たないでしょう。
  • コーナーケースチェック=より複雑な境界チェック(コーナーは2次元の境界です)。たとえば、計算で<MIN_INT>と<MAX_INT>を組み合わせます。
  • 特別なケースのチェック=非自明、非境界特別な値、たとえばlog(1 + the smallest floating point number)
26
l0b0