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.