Testando Seu Código

PythonBeginner
Pratique Agora

Introdução

Neste laboratório, aprenderemos como escrever testes unitários para o nosso código Python usando o módulo unittest integrado. Começaremos com uma função simples e, em seguida, avançaremos para testar código mais complexo, incluindo código que interage com bancos de dados.

Pré-requisitos

Antes de iniciar este laboratório, você deve ter uma compreensão básica da linguagem de programação Python. Você também deve ter alguma familiaridade com a escrita de funções em Python.

Adicionar Número

Configuração

Para começar, precisamos criar um novo arquivo Python para nossos testes. Vamos chamá-lo de test_my_code.py. Também criaremos um módulo que contém o código que queremos testar. Vamos chamar este módulo de my_code.py.

Teste Simples

Vamos começar com uma função simples que retorna a soma de dois números. Em my_code.py, crie uma função chamada add_numbers que recebe dois argumentos e retorna sua soma.

def add_numbers(a, b):
    return a + b

Agora, vamos escrever um teste para esta função em test_my_code.py. Primeiro, precisamos importar o módulo unittest e a função add_numbers.

import unittest
from my_code import add_numbers

Em seguida, criaremos uma classe chamada TestAddNumbers que herda de unittest.TestCase.

class TestAddNumbers(unittest.TestCase):
    pass

Dentro desta classe, criaremos um método chamado test_add_numbers que testará a função add_numbers. Usaremos o método assertEqual para verificar se a função retorna a soma correta.

class TestAddNumbers(unittest.TestCase):
    def test_add_numbers(self):
        result = add_numbers(2, 3)
        self.assertEqual(result, 5)

Agora podemos executar nossos testes usando o seguinte comando:

python -m unittest test_my_code.py

Se o teste passar, você deverá ver uma saída como a seguinte:

...
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

O . indica que um teste passou.

Testando Exceções

Em seguida, vamos testar uma função que levanta uma exceção. Em my_code.py, crie uma função chamada divide que recebe dois argumentos e retorna seu quociente. Se o segundo argumento for zero, a função deve levantar um ZeroDivisionError.

def divide(a, b):
    if b == 0:
        raise ZeroDivisionError('Cannot divide by zero')
    return a / b

Agora, vamos escrever um teste para esta função em test_my_code.py. Usaremos o método assertRaises para verificar se a função levanta um ZeroDivisionError quando o segundo argumento é zero.

class TestDivide(unittest.TestCase):
    def test_divide_by_zero(self):
        with self.assertRaises(ZeroDivisionError):
            divide(1, 0)

Agora podemos executar nossos testes novamente:

python -m unittest test_my_code.py

Se o teste passar, você deverá ver uma saída como a seguinte:

...
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

O .. indica que dois testes passaram.

Testando com Bancos de Dados

Finalmente, vamos testar algum código que interage com um banco de dados. Para este exemplo, usaremos SQLite e o módulo sqlite3.

Em my_code.py, crie uma função chamada create_table que cria uma nova tabela em um banco de dados SQLite.

import sqlite3

def create_table():
    conn = sqlite3.connect('my_database.db')
    c = conn.cursor()
    c.execute('CREATE TABLE IF NOT EXISTS my_table (id INTEGER PRIMARY KEY, name TEXT)')
    conn.commit()
    conn.close()

Neste código, criamos uma nova tabela de banco de dados SQLite chamada "my_table" com duas colunas: "id" e "name". Em seguida, definimos uma classe de teste chamada TestCreateTable com um método setUp que cria um banco de dados SQLite para teste.

Agora, vamos escrever um teste para a função create_table. Primeiro, precisamos criar um novo banco de dados para teste. Faremos isso em um método de configuração que é executado antes de cada teste.

class TestCreateTable(unittest.TestCase):
    def setUp(self):
        self.conn = sqlite3.connect('my_database.db')

    def test_create_table(self):
        create_table()
        c = self.conn.cursor()
        c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='my_table'")
        result = c.fetchone()
        self.assertIsNotNone(result)

No método setUp, criamos um novo banco de dados SQLite.

No método test_create_table, chamamos a função create_table e, em seguida, verificamos se a tabela foi criada usando uma consulta SQL.

Agora podemos executar nossos testes novamente:

python -m unittest test_my_code.py

Se o teste passar, você deverá ver uma saída como a seguinte:

...
----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK

O ... indica que três testes passaram.

Resumo

Neste laboratório, aprendemos como escrever testes unitários para nosso código Python usando o módulo unittest. Começamos com uma função simples e, em seguida, construímos para testar um código mais complexo, incluindo código que interage com bancos de dados. Com este conhecimento, você pode escrever testes para seu código Python para garantir que ele funcione conforme o esperado e detectar erros no início do processo de desenvolvimento.