Configurar um conjunto de testes para o seu código pode parecer um obstáculo para o qual você não está preparado, mas essa biblioteca exige muito esforço.

O teste é uma parte essencial do desenvolvimento de software. Isso ajuda a detectar bugs com antecedência e reduz a probabilidade de erros no futuro.

Pytest é uma das estruturas de teste mais populares para Python. Ele permite que você escreva testes pequenos e legíveis que podem ser dimensionados à medida que seu aplicativo cresce. Aprenda como configurar e usar o Pytest com seu código Python.

Configurando o Pytest

Antes de instalar o Pytest, é melhor criar um ambiente virtual para isolar seu ambiente de teste, para evitar conflitos com outros pacotes e dependências.

Para criar um ambiente virtual, execute o seguinte comando antes de instalar o Pytest.

testes python -m venv

Isso criará um novo ambiente virtual denominado testes em seu diretório atual. Para ativar o ambiente, execute este comando se estiver no Linux ou Mac:

fonte testa/bin/ativar

Para Windows, execute este comando:

testes\\Scripts\\ativar

Para instalar o Pytest, você pode usar o pip, o gerenciador de pacotes do Python, com este comando no seu terminal:

pip instalar pytest

Se você não tem Pip, não se preocupe; você pode instale o Pip no Windows, Mac e Linux.

Execute o seguinte comando para verificar se você instalou o Pytest corretamente.

pytest --version

Isso deve retornar o número da versão instalada.

Criando seu primeiro teste

Considere a seguinte função que adiciona dois números e retorna o resultado.

defadd_numbers(a, b):
retornar a + b

Várias coisas podem dar errado com esta função. Por exemplo, considere o que acontece se você chamar a função com valores não numéricos, como None ou um valor do tipo string. Esses são alguns dos possíveis casos extremos que podem causar a falha da função.

Um dos primeiros testes que você escreve deve verificar se a função retorna o resultado esperado. Para fazer isso, você pode usar a palavra-chave assert para comparar a saída real da função com a saída esperada. No caso da função add_numbers, a função de teste pode ser assim:

deftest_add_numbers():
afirmar add_numbers(2, 3) == 5
afirmar add_numbers(-1, 1) == 0
afirmar add_numbers(0, 0) == 0

Essa função de teste inclui três instruções assert, cada uma comparando a saída da função add_numbers com um valor esperado. O primeiro teste verifica se a adição de 2 e 3 retorna 5, o segundo teste verifica se a adição de -1 e 1 retorna 0 e o terceiro teste verifica se a adição de 0 e 0 retorna 0.

Como executar testes com Pytest

Depois de escrever seus testes, a próxima etapa é executá-los. Para fazer isso com o Pytest, navegue até o diretório que contém seu arquivo de teste e execute o comando pytest:

pytest

Se tudo funcionar conforme o esperado, você verá uma mensagem indicando que todos os testes foram aprovados com sucesso. No entanto, se qualquer uma das asserções falhar, o Pytest relatará um erro e mostrará os valores de entrada que causaram a falha.

Por exemplo, digamos que você executou a seguinte função de teste para a função add_numbers:

deftest_add_numbers():
afirmar add_numbers(2, 3) == 6
afirmar add_numbers(-1, 1) == 0
afirmar add_numbers(0, 0) == 0

A primeira asserção falhará porque o valor esperado era 6, mas o valor real era 5 (a soma de 2 e 3). O Pytest retornará a seguinte mensagem:

Esta mensagem mostra os valores de entrada que causaram o valor e também informa qual deve ser o valor real. Isso facilita a identificação e correção rápida de erros em seu código.

Usando Pytest.raises para declarar exceções

Agora, vamos escrever um teste para cobrir um dos casos extremos da função add_numbers. Quando você passa um argumento não numérico como None para a função, o Python deve gerar uma exceção TypeError.

você já deve estar manipulação de exceções em seus programas Python, e você pode testar se seu código os gera corretamente também.

Para fazer isso, copie a seguinte função de teste em seu arquivo. Ele usa o gerenciador de contexto pytest.raises para verificar se chamar a função add_number com “None” gera uma exceção TypeError.

importar pytest

deftest_add_numbers_with_invalid_inputs():
com pytest.raises (TypeError):
add_numbers(Nenhum, 2)

Em seguida, execute o Pytest na linha de comando. Se a exceção não for gerada, o teste falhará.

Você pode ir além e verificar os detalhes da mensagem de exceção. O gerenciador de contexto produz um objeto ExceptionInfo com os detalhes.

Por exemplo, nesta função de teste, declare a mensagem de exceção assim:

deftest_add_numbers_with_invalid_inputs():
com pytest.raises(TypeError) como exc_info:
add_numbers(Nenhum, 2)

afirmar exc_info.value.args[0] == "tipo(s) de operando não suportado(s) para +: 'NoneType' e 'int'"

Se a mensagem não corresponder à do teste, o Pytest indicará uma falha.

Como usar o teste parametrizado para testar várias entradas ao mesmo tempo

Em vez de chamar manualmente uma função com várias entradas como esta:

deftest_add_numbers():
afirmar add_numbers(2, 3) == 6
afirmar add_numbers(-1, 1) == 0
afirmar add_numbers(0, 0) == 0

O Pytest fornece um recurso de teste parametrizado que permite fazer a mesma coisa com mais facilidade. Veja como você pode reescrever a função de teste acima:

importar pytest

@pytest.mark.parametrize("a, b, esperado", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
deftest_add_numbers(a, b, esperado):
afirmaradd_numbers(a, b)== esperado

Como executar vários testes

Até agora, você escreveu apenas dois testes para a função add_numbers. Para funções mais complexas com mais testes, você pode querer agrupá-los em uma classe.

Por exemplo, aqui está como você criaria uma classe de teste para a função add.

aulaTestAddFunction:
@pytest.mark.parametrize("a, b, esperado", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
defteste_adição_com_números(próprio, a, b, esperado):
afirmar add_numbers (a, b) == esperado

deftest_add_numbers_with_invalid_inputs(auto):
com pytest.raises (TypeError) como exc_info:
add_numbers(Nenhum, 2)
afirmar exc_info.value.args[0] == "tipo(s) de operando não suportado(s) para +: 'NoneType' e 'int'"

Observe que você precisa prefixar o nome da classe com “Test” para que o Pytest possa identificá-la como uma classe de teste e executá-la.

Pytest tem muito mais recursos

Usando o Pytest, você pode verificar automaticamente se seu código funciona conforme o esperado. O Pytest oferece muitos outros recursos, como acessórios que permitem configurar e desmontar dados de teste e marcas para configurar metadados em suas funções de teste.

Além disso, você pode integrar o Pytest em seu pipeline de CI e começar a executar testes automática e continuamente ao alterar seu código.