Teste negativo básico

Na primeira parte , começamos a escrever uma função fatorial no estilo orientado a testes. Dependemos da humilde declaração “assert” para executar nossos testes e terminamos com isso:

def factorial(n):
    return n * factorial(n-1) if n else 1
assert factorial(0) == 1
assert factorial(2) == 2
assert factorial(5) == 120

>>> factorial(-1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "fac9.py", line 24, in factorial
    return n * factorial(n-1) if n else 1
  File "fac9.py", line 24, in factorial
    return n * factorial(n-1) if n else 1
  File "fac9.py", line 24, in factorial
    return n * factorial(n-1) if n else 1
  [Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded

Quando encontramos um bug, já que estamos escrevendo os testes primeiro, não começamos corrigindo o bug. Em vez disso, começamos escrevendo um teste que expõe o bug.

Aqui, esquecemos de testar um “caso negativo”. “Teste negativo” é um conceito escorregadio, mas significa mais ou menos testar erros.

Poderíamos argumentar que nosso código atual está se comportando corretamente: fatoriais de negativos não são bem definidos, portanto, lançar um erro é apropriado. No entanto, esse erro não é útil. Devemos lançar um erro mais informativo, para que os chamadores possam entender melhor o que fizeram de errado.

No entanto, não podemos escrever essa afirmação como as outras: para testar se uma função lança uma exceção, precisamos capturar a exceção:

def factorial(n):
    return n * factorial(n-1) if n else 1
...
try:
    factorial(-1)
except:
    pass

$ python fac.py
$

Precisamos testar que, quando nossa função gera um erro, ela gera o tipo de erro que esperamos. ValueError é um tipo interno apropriado aqui, então vamos adicioná-lo à linha except.

def factorial(n):
    return n * factorial(n-1) if n else 1
...
try:
    factorial(-1)
except ValueError as e:
    pass

$ python fac.py
Traceback (most recent call last):
  File "fac.py", line 28, in <module>
    factorial(-1)
  File "fac.py", line 23, in factorial
    return n * factorial(n-1) if n else 1
  File "fac.py", line 23, in factorial
    return n * factorial(n-1) if n else 1
  File "fac.py", line 23, in factorial
    return n * factorial(n-1) if n else 1
  [Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded

def factorial(n):
    if n < 0: return
    return n * factorial(n-1) if n else 1
...
try:
    factorial(-1)
except ValueError as e:
    pass

$ python fac.py
$

def factorial(n):
    if n < 0: return
    return n * factorial(n-1) if n else 1
...
try:
    factorial(-1)
    assert False, 'Factorial of < 0 should have raised an error'
except ValueError as e:
    pass

$ python fac.py
Traceback (most recent call last):
  ...
AssertionError: factorial of < 0 should have raised an error

def factorial(n):
    if n < 0:
        raise ValueError()
    return n * factorial(n-1) if n else 1
...
try:
    factorial(-1)
    assert False, 'Factorial of < 0 should have raised an error'
except ValueError as e:
    pass

def factorial(n):
    if n < 0:
        raise ValueError()
    return n * factorial(n-1) if n else 1
...
try:
    factorial(-1)
    assert False, 'Factorial of < 0 should have raised an error'
except ValueError as e:
    assert str(e) == 'Factorial of negative is undefined'

$ python fac.py
...
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "fac.py", line 19, in <module>
    assert str(e) == 'Factorial of negative is undefined'
AssertionError

Suggested posts

Encontrar informações sobre nomes de domínio

Um trecho de Small, Sharp Software Tools por Brian P. Hogan

Encontrar informações sobre nomes de domínio

Quando você faz uma solicitação para facebook.com, seu computador procura o nome de domínio para traduzir esse nome de domínio em um endereço IP para que seu computador possa fazer essa conexão.

Como executar plugins ChatGPT gratuitamente usando Langchain

Como executar plugins ChatGPT gratuitamente usando Langchain

Você deve ter ouvido falar sobre todos os novos plug-ins poderosos do ChatGPT, como navegador, intérprete de código, etc. Mas há um problema, o acesso aos plug-ins é limitado a uma lista de espera e, portanto, muitos não têm acesso a ela.

Related posts

O desafio de leitura Goodreads é tóxico

O desafio de leitura Goodreads é tóxico

A coceira na minha mão aumentou enquanto eu negociava com o livreiro local por mais um livro. Este livro, como o resto que comprei recentemente, encontraria seu trono na minha pilha 'To Be Read' (TBR); e ainda assim, eu comprei.

O primeiro livro de uma criança sobre como ficar chapado

O primeiro livro de uma criança sobre como ficar chapado

(Aviso - isso é sátira, com a intenção de ser alegremente subversivo - definitivamente não é para crianças) Você viu sua mãe e seu pai se esconderem na cozinha e fumarem aqueles cigarros fedorentos. Eles dizem a você.

O que torna um podcast influente?

O que torna um podcast influente?

Na semana passada, notei um comunicado de imprensa, enviado via PressGazette (um site de notícias da mídia britânica). O artigo anunciava que a Acast, a empresa de publicidade e hospedagem de podcast Scandi, lideraria um consórcio de "provavelmente os editores mais influentes" em podcasting.

A revolução no local de trabalho: os principais especialistas discutem o trabalho híbrido e remoto

A revolução no local de trabalho: os principais especialistas discutem o trabalho híbrido e remoto

No atual cenário de negócios em rápida evolução, o conceito de trabalho híbrido e remoto ganhou um impulso sem precedentes. À medida que as empresas continuam a se adaptar às mudanças nas necessidades e expectativas de seus funcionários, especialistas de várias áreas se reuniram para discutir os benefícios, os desafios e o futuro dessa forma transformadora de trabalhar.