Os testes🧪 unitários (unit tests) são uma prática essencial no desenvolvimento de software em Python. Eles permitem verificar se 🔧partes específicas do código estão funcionando como esperado, garantindo a robustez e a confiabilidade do programa como um todo. Bora💪 criar um programa que calcule o quadrado de um número fornecido pelo usuário:
# nome do arquivo 'meuarquivo.py'
def main():
numero = int(input("Valor: "))
print(f"número ao quadrado é: {square(numero)}")
def square(n):
return n * n
main()
Este código será utilizado para testar, e salvo num arquivo "meuarquivo. py".
Num arquivo novo para testes, irei importar ' meuarquivo. py ' para verificar se há algum erro. Mas antes veja que no código, a função main()
é chamada no fim do código e para propósito de teste e outros, de agora em diante, sempre que quisermos chamar a função main, será da seguinte forma 👇:
#usando isso, ⚠️ indica que isso só funciona no arquivo que o contem
if __name__ == "__main__":
main()
Atualizando 🔄 o código:
def main():
numero = int(input("Valor: "))
print(f"número ao quadrado é: {square(numero)}")
def square(n):
return n + n # aqui ha um erro forçado
if __name__ = "__main__":
main()
Agora é só criar o script para fazer o teste, e lembrando que é bom que este não seja maior do que o arquivo à testar.
from meuarquivo import square
def test_square():
if square(2) != 4:
print("2 ao quadrado não foi 4")
if square(3) != 9:
print("3 ao quadrado não foi 9")
Para realizar um teste, é preciso realiza-lo com diferente valores, mas observe que conforme adicionamos valores, o código fica maior, e para reduzir o tamanho, usarei uma módulo chamado assert()
, que verifica uma condição retornando True
ou False
, 👉 aqui tem mais informação.
from meuarquivo import square
def test_square():
assert square(2) == 4
assert square(3) == 9
Ao usar assert() há um exceção, se você não sabe sobre, aqui tem uma explicação breve sobre 👉 exception e para tratar essa exceção, usarei o try except
:
from meuarquivo import square
def main():
test_square()
def test_square():
try:
assert square(2) == 4
except AssertionError:
print("2² não é = 4")
try:
assert square(3) == 9
except AssertionError:
print("3² não é = 9")
if __name__ == "__main__":
main()
>3 squared was not 9
Repare que o código fica cada vez maior, dando a chance a erros. Dessa forma ao invés de "criar a roda", utilizarei módulos de terceiros, que contém todo esse tratamento para o assert
.
🔧 Pytest
É uma biblioteca python de terceiros, há outras bibliotecas 📚 para fazer tests, "unit testing" é um jeito formal de descrever testes para unidades individuais do seu 💻 programa (especificamente funções), para instalar o Pytest:
pip install pytest
O uso dele, é basicamente 📞chamar ele no terminal + nome do arquivo para testar.
pytest testador.py
O código do arquivo testador fica assim 👇:
from meuarquivo import square
def test_square():
assert square(2) == 4
assert square(3) == 9
assert square(4) == 16
assert square(0) == 0
F vermelho 🔴: há uma falha, e logo após mostra onde está o erro.
' . ' verde 🟢: passou no teste e está ok.
Outra prática, é dividir o teste em funções com diferentes valores à testar.
from meuarquivo import square
def teste_positivo():
assert square(2) == 4
assert square(3) == 9
def teste_negativo():
assert square(-1) == 1
assert square(-3) == 9
def teste_zero():
assert square(0) == 0
É possível testar não somente com número mas com textos também, assim como testar em 📁pastas inteiras e para uma pasta se tornar "testável" deve ter um arquivo chamado ⚠️__init__.py
, dessa forma o interpretador do Python entende que pode tratar essa pasta como um pacote (módulos ou múltiplos módulos).