Qual é a diferença entre uma caixa de borda, uma caixa de canto, uma caixa de base e uma caixa de limite?


86

Eu não sou um falante nativo de inglês. No meu idioma nativo, conheço alguns termos usados ​​para se referir à condição verificada para interromper uma recursão e à condição verificada em casos extremos, improváveis ​​ou super simples. Em inglês, encontrei os termos "caso de borda", "caso de canto", "caso de limite" e "caso de base", mas não consigo entender bem as diferenças e que é usado para se referir a quê; Eu adoraria obter um resumo das diferenças entre eles.

Em particular, eu ficaria muito feliz se alguém pudesse fornecer anotações para as linhas no seguinte exemplo 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);
    }

Eu acho que é:

  1. Verificação de sanidade
  2. Verificação de entrada
  3. Caso limite? Caso Edge? Caixa de canto?
  4. Caso base? Caso limite?
  5. Caixa de canto? Caso Edge?

4
Eu acredito que borda e limite são geralmente os mesmos. Mas eles se referem a testes, não a condições de verificação no código.
Richard

@ Richard Teste não código? Esse não é o meu entendimento - você tem uma referência para apoiar o fato de que esses termos não se aplicam ao código?
Brad Thomas

Respostas:


94

Também não sou um falante nativo de inglês. Mas de acordo com a Wikipedia:

  • O case de borda ocorre em um parâmetro de operação extremo (máximo ou mínimo).
  • A caixa de canto ocorre fora dos parâmetros operacionais normais , especificamente quando várias variáveis ​​ou condições ambientais estão simultaneamente em níveis extremos, mesmo que cada parâmetro esteja dentro da faixa especificada para esse parâmetro . (Os "parâmetros operacionais normais externos" obviamente significam algo como "combinação típica de parâmetros operacionais externos", não estritamente "parâmetros operacionais permitidos externos". Ou seja, você ainda está dentro do espaço de parâmetros válido, mas próximo a ele.)
  • O caso de limite ocorre quando uma das entradas está acima ou acima dos limites máximo ou mínimo.
  • O caso base é o local onde a recursão termina.

Portanto, a nomenclatura parece estar totalmente confusa, embora o caso de canto pareça significar algo um pouco diferente (uma combinação de valores) do que os casos de borda e limite, que são definitivamente sinônimos. Provavelmente, é seguro dizer que casos de borda, canto e limite são a mesma coisa no discurso comum. Alguém poderia dizer algo diferente por cada um deles, mas quase não há acordo comum.

Seus 1) e 2) são o que você escreveu, 3) é um caso de borda / limite, 4) é um caso de base e 5) é um caso especial.


Esta é uma resposta muito útil para entender os conceitos por trás de cada palavra técnica.
Jignesh Fadadu

25

Independentemente das diferenças entre as palavras, o que você usaria para descrever um teste depende da semântica (significado) do teste, não do código exato - No exemplo, desde que não seja óbvio o significado de cada um dos testes. Além disso, veja como eu os entendo:

  • Sanity check = Isso faz algum sentido? Por exemplo, se o seu aplicativo gerar apenas números inteiros sqrt(-1)e não log(-1)estiver definido.
  • Entrada de verificação = Testa a entrada do usuário, ao contrário de alguma estrutura de dados interna ou a saída de uma função. Por exemplo, no Bash [ $# -gt 0 ]verifica se você obteve pelo menos um parâmetro de entrada, o que também pode ser uma verificação de integridade de um comando como findou mail.
  • Verificação de borda / limite = A entrada máxima ou mínima que se espera produz uma saída correta . Por exemplo, uma função que apenas adiciona uma a um número terá um intervalo operacional de <MIN_INT> a <MAX_INT> - 1, pois a entrada menor que <MIN_INT> não pode ser fornecida pelo usuário e a saída maior que <MAX_INT> não será útil.
  • Verificação de caixa de canto = Uma verificação de limite mais complexa (um canto é um limite bidimensional), por exemplo, combinando <MIN_INT> e <MAX_INT> em um cálculo.
  • Verificação de caso especial = Valores especiais não óbvios e sem limites , por exemplo log(1 + the smallest floating point number).

Um nit: logₑ-1 não sofisticado é iπ. Em python,import cmath; assert(cmath.log(-1) == 3.141592653589793j)
Bob Stein
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.