Testes com Python

15/03/2020 - 3 min de leitura

PYTHON

Este tutorial é para todos os iniciantes que desejam saber como criar testes com Python e como eles realmente funcionam.

Muitas vezes, o programador tem a mania de testar o código que ele escreveu de cabeça... "não preciso de testes, já testei tudo na cabeça e vai funcionar". Bem, se tratando de coisas pequenas, como uma soma, realmente não há necessidade de escrever um teste só pra isso.

O fator crucial que muitas vezes deixamos de lado é: A gente nunca faz uma apliacação que "só" vai somar. Fazemos aplicações gigantes, que de uma hora pra outra toma proporções maiores do que imaginávamos. E isso sim pode ter vários bugs escondidos e só iremos saber na pior hora (quando está online).

Já aconteceu diversas vezes comigo. Tive problemas com pequens bugs quando o sistema estava online. Isso porque não escrevi testes automatizados para ter a certeza que aquela funcionalidade iria se comportar como eu realmente esperava.

O Python nos trás uma biblioteca muito bacana que é a unittest. Para trabalharmos com ela, devemos importá-la e criar uma classe que herde de TestCase, contido na unittest.

Veja o exemplo abaixo:

import unittest

class MyTests(unittest.TestCase):
    
    # Todas as minhas funções de teste aqui


if __name__ == '__main__':
    unittest.main()

A linha que contém o if __name__ é só para fazer a unittest rodar os testes da classe automaticamente.

O que você precisa saber?

  • Cada teste é uma função que iremos escrever.
  • Cada função deve começar obrigatoriamente com test_
  • Nossas funções não precisam ter retornos. Usaremos o assert.

O assert é um if turbinado. Ele assegura que se uma coisa não for aquilo que estamos assegurando, o programa deve dar uma Exceção.

Veja o exemplo do uso do assert:

assert 1 == 2

O código acima tem que assegurar que 1 é igual a 2. Logicamente não é! Então o programa irá resultar em uma exceção de AssertionError.

Se realmente 1 fosse igual a 2, o programa iria continuar seu fluxo normalmente.

Escrevendo suas primeiras funções do teste

Vamos esquever algumas funções do teste, mas antes quero mostrar algumas variações de assert que herdamos de TestCase:

  • self.assertEqual(a, b) -> assegura que a == b.
  • self.assertTrue(a) -> assegura que a é verdadeiro.
  • self.assertFalse(a) -> assegura que a é falso.
  • self.assertIs(a, b) -> assegura que a e b são a mesma coisa.

Existem  MUITO MAIS funcões de assert. Indico que você dê uma olhada na documentação. Quem sabe não encontre uma que se encaixe no seu problema.

Abaixo está uma função que testa se a soma de um vetor é 3:

import unittest

class MyTests(unittest.TestCase):
    
    def test_sum(self):
        # Imagine aqui toda uma operação, testando funções da sua aplicação.
        # Como por exemplo, ver se o cálculo do desconto de um produto está sendo calculado corretamente.
        self.assertEqual(sum([1, 2]), 3)

    # Além disso, podemos escrever vários funções de teste na mesma classe.
    # def test_same_name(self):
    #    self.assertEqual("Gabriell", "Gabriell")


if __name__ == '__main__':
    unittest.main()

Por fim, para rodar o teste é só executar python <nome do arquivo>.py.

Um exemplo de saída com os testes passando no assert:

E aqui está um exemplo de um teste que não passou dentre os meus testes:

Conclusão

Implementar testes parece ser desnecessário, mas acredite: não é. Isso pode te poupar muito tempo no futuro 😄

O Django também possui sua biblioteca de testes, que por de baixo dos panos usa o unittest. Mas o princípio é o mesmo. Dê uma olhada no exemplo que ele traz na doumentação.

Este post foi encomendado especialmente através do instagram do blog. Se você quer interagir comigo, basta seguir a página. Te espero lá.

Compartilhe

Twitter