¿Cuál es la diferencia entre un caso de borde, un caso de esquina, un caso base y un caso límite?

86

No soy un hablante nativo de inglés. En mi idioma nativo, conozco algunos términos que se usan para referirse a la condición marcada para detener una recurrencia, y a la condición marcada para casos extremos, improbables o súper simples. En inglés, he encontrado los términos "caso de borde", "caso de esquina", "caso límite" y "caso base", pero no puedo entender las diferencias y cuál se usa para referirme a qué; Me encantaría obtener un resumen de las diferencias entre ellos.

En particular, estaría muy feliz si alguien pudiera proporcionar anotaciones para las líneas en el siguiente ejemplo de código:

    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);
    }

Yo creo que es:

  1. Prueba de cordura
  2. Comprobación de entrada
  3. Caso límite? ¿Caso extremo? Caso de la esquina?
  4. ¿Caso base? Caso límite?
  5. Caso de la esquina? ¿Caso extremo?
Roble
fuente
44
Creo que borde y límite son generalmente los mismos. Pero se refieren a las pruebas, no a verificar las condiciones en el código.
Richard
@ Richard Pruebas no codificadas? Eso no lo entiendo: ¿tiene alguna referencia para respaldar el hecho de que cree que estos términos no se aplican al código?
Brad Thomas

Respuestas:

94

Tampoco soy un hablante nativo de inglés. Pero según Wikipedia:

  • El caso de borde ocurre en un parámetro de operación extremo (máximo o mínimo).
  • El caso de esquina se produce fuera de los parámetros operativos normales , específicamente cuando múltiples variables o condiciones ambientales están simultáneamente en niveles extremos, a pesar de que cada parámetro está dentro del rango especificado para ese parámetro . (Los "parámetros operativos externos normales" obviamente significan algo así como "combinación típica de parámetros operativos externos", no estrictamente "parámetros operativos externos permitidos". Es decir, todavía está dentro del espacio de parámetros válido, pero cerca de su esquina).
  • El caso límite ocurre cuando una de las entradas está en o justo más allá de los límites máximos o mínimos.
  • El caso base es donde termina la recursividad .

Entonces, la nomenclatura parece estar totalmente confundida, aunque el caso de esquina parece significar algo un poco diferente (una combinación de valores) que los casos de borde y límite, que definitivamente son sinónimos. Probablemente sea seguro decir que los casos de borde, esquina y límite son lo mismo en el habla común. Alguien podría decir algo diferente por cada uno de ellos, pero casi no hay un acuerdo común.

Su 1) y 2) son lo que escribió, 3) es un caso de borde / límite, 4) es un caso base y 5) es un caso especial.

Joonas Pulakka
fuente
Esta es una respuesta muy útil para comprender los conceptos detrás de cada palabra técnica.
Jignesh Fadadu
25

Independientemente de las diferencias entre las palabras, lo que usaría para describir una prueba depende de la semántica (significado) de la prueba, no del código exacto. En el ejemplo proporcionado, no es obvio qué significa cada una de las pruebas. Aparte de eso, así es como los entiendo:

  • Comprobación de cordura = ¿Esto tiene sentido? Por ejemplo, si su aplicación solo genera números enteros sqrt(-1)y log(-1)no están definidos.
  • Comprobación de entrada = Prueba la entrada del usuario, a diferencia de alguna estructura de datos interna o la salida de una función. Por ejemplo, en Bash [ $# -gt 0 ]verifica que haya obtenido al menos un parámetro de entrada, que también podría ser una verificación de cordura para un comando como findo mail.
  • Verificación de borde / límite = La entrada máxima o mínima que se espera produzca la salida correcta . Por ejemplo, una función que solo agrega uno a un número tendrá un rango operativo de <MIN_INT> a <MAX_INT> - 1, ya que el usuario no puede proporcionar una entrada menor que <MIN_INT> y una salida mayor que <MAX_INT> No será útil.
  • Verificación de mayúsculas y minúsculas = Una verificación de límites más compleja (una esquina es un límite bidimensional), por ejemplo, combinando <MIN_INT> y <MAX_INT> en un cálculo.
  • Verificación de casos especiales = valores especiales no obvios, sin límites , por ejemplo log(1 + the smallest floating point number).
l0b0
fuente
Un nit poco sofisticado: logₑ-1 es iπ. En python,import cmath; assert(cmath.log(-1) == 3.141592653589793j)
Bob Stein