Unit Tests

Unit Tests

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

asdfasf

  • 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.

💡
É importante manter o 💻 código o mais simples possível.
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).