Tutorial PyTest: O que é PyTest? (com exemplos)

⚡ Resumo Inteligente

Pytest é um Python Framework de testes que ajuda você a escrever testes simples e escaláveis ​​para bancos de dados, APIs e interfaces de usuário. Ele oferece suporte a fixtures, parametrização, marcadores, execuções paralelas e relatórios de asserções detalhados, desde testes unitários básicos até testes funcionais complexos.

  • 🔘 Instalação: O comando `pip install pytest` adiciona o framework, e `py.test -h` confirma a configuração imprimindo a saída de ajuda.
  • ☑️ Descoberta de testes: O Pytest coleta automaticamente arquivos com nomes como test_*.py ou *_test.py e métodos cujos nomes começam com test.
  • Asserções: Instruções assert simples reportam um AssertionError claro com os valores comparados sempre que uma verificação falha.
  • 🧪 Luminárias: O decorador @pytest.fixture fornece dados de configuração reutilizáveis ​​que são compartilhados entre arquivos por meio de um arquivo conftest.py.
  • 🛠️ Execuções seletivas: Os marcadores, o filtro de substring -k e a parametrização executam subconjuntos específicos ou o mesmo teste em várias entradas.
  • 🤖 Fluxos de trabalho de IA: As equipes de aprendizado de máquina usam o pytest para validar fluxos de dados e saídas de modelos, e o Copilot pode elaborar casos de teste.

Tutorial do Pytest

Pytest é uma das estruturas de teste mais utilizadas no Python ecossistema. Ele mantém o código de teste curto e legível, descobre testes automaticamente e evolui de uma primeira asserção para um conjunto completo de testes para bancos de dados, APIs e interfaces de usuário. As seções abaixo abordam a instalação, asserções, fixtures, marcadores, parametrização e execuções paralelas com exemplos práticos.

O que é Pytest?

Pytest é uma estrutura de testes que permite escrever código de teste usando o Python Pytest é uma linguagem de programação que ajuda a escrever casos de teste simples e escaláveis ​​para bancos de dados, APIs e até mesmo interfaces de usuário. É usado principalmente para escrever testes de APIs e pode ser adaptado desde testes unitários simples até testes funcionais complexos.

Por que usar o Pytest?

Algumas das vantagens do pytest são:

  • Muito fácil de começar, devido à sua sintaxe simples e clara.
  • Pode executar testes em paralelo.
  • É possível executar um teste específico ou um subconjunto de testes.
  • Detecta testes automaticamente.
  • Pode pular os testes.
  • Código aberto.

Como instalar o Pytest

A seguir, o processo para instalar o pytest:

Passo 1) Você pode instalar o pytest com o comando abaixo.

pip install pytest==2.9.1

Após a conclusão da instalação, você pode confirmá-la com o seguinte comando.

py.test -h

Isso exibirá a ajuda.

Instale o pytest e visualize a saída de ajuda.

Primeiro exemplo básico de Pytest

Agora, você aprenderá como usar o pytest com um exemplo básico.

Crie uma pasta chamada study_pytest. Você criará os arquivos de teste dentro dessa pasta. Navegue até essa pasta na linha de comando. Crie um arquivo chamado test_sample1.py dentro da pasta.

Crie o primeiro arquivo de teste básico do pytest.

Adicione o código abaixo e salve.

import pytest
def test_file1_method1():
	x=5
	y=6
	assert x+1 == y,"test failed"
	assert x == y,"test failed"
def test_file1_method2():
	x=5
	y=6
	assert x+1 == y,"test failed" 

Execute o teste usando o comando abaixo.

py.test

Você obterá o seguinte resultado.

test_sample1.py F.
============================================== FAILURES ========================================
____________________________________________ test_sample1 ______________________________________
    def test_file1_method1():
    	x=5
    	y=6
       	assert x+1 == y,"test failed"
>      	assert x == y,"test failed"
E       AssertionError: test failed
E       assert 5 == 6
test_sample1.py:6: AssertionError

Saída de falha do teste Pytest

Aqui, em test_sample1.py F., a letra F indica falha e o ponto (.) indica sucesso. Na seção de falhas, você pode ver o(s) método(s) que falharam e a linha da falha. Aqui, x==y significa 5==6, que é falso.

Em seguida, você aprenderá sobre asserções em pytest.

Asserções em Pytest

As asserções do Pytest são verificações que retornam um status Verdadeiro ou Falso. No Pytest, se uma asserção falhar em um método de teste, a execução desse método é interrompida. O restante do código nesse método de teste não é executado e o Pytest continua com o próximo método de teste.

Exemplos de asserção com Pytest:

assert "hello" == "Hai" is an assertion failure.
assert 4==4 is a successful assertion
assert True is a successful assertion
assert False is an assertion failure.

Considere o seguinte.

assert x == y,"test failed because x=" + str(x) + " y=" + str(y)

Coloque este código em test_file1_method1() em vez da asserção abaixo.

assert x == y,"test failed"

Executar o teste dará a falha como AssertionError: teste falhou x=5 y=6.

Como o Pytest identifica os arquivos de teste e os métodos de teste

Por padrão, o pytest identifica apenas os nomes de arquivo que começam com teste_ ou terminando com _teste como os arquivos de teste. Podemos mencionar outros nomes de arquivo explicitamente, no entanto (explicado posteriormente). O Pytest exige que os nomes dos métodos de teste comecem com testeTodos os outros nomes de métodos são ignorados, mesmo que solicitemos explicitamente a execução desses métodos.

Veja alguns exemplos de nomes de arquivos pytest válidos e inválidos.

test_login.py - valid
login_test.py - valid
testlogin.py -invalid
logintest.py -invalid

Observação: Sim, podemos instruir explicitamente o pytest a escolher os arquivos testlogin.py e logintest.py.

Veja alguns exemplos de métodos de teste pytest válidos e inválidos.

def test_file1_method1(): - valid
def testfile1_method1(): - valid
def file1_method1(): - invalid	

Observação: mesmo que mencionemos explicitamente file1_method1(), o pytest não executará esse método.

Execute vários testes de um arquivo específico e de vários arquivos

Atualmente, dentro da pasta study_pytest, temos um arquivo test_sample1.py. Suponha que tenhamos vários arquivos, digamos test_sample2.py e test_sample3.py. Para executar todos os testes de todos os arquivos na pasta e subpastas, basta executar o comando pytest.

py.test

Isso executará o comando em todos os arquivos cujos nomes começam com "test_" e terminam com "_test" nessa pasta e nas subpastas dentro dela.

Para executar testes apenas a partir de um arquivo específico, podemos usar o py.test. .

py.test test_sample1.py

Execute um subconjunto do teste completo com Pytest.

Às vezes, não queremos executar todo o conjunto de testes. O Pytest permite executar testes específicos. Podemos fazer isso de duas maneiras:

  • Grouping de nomes de teste por correspondência de substring.
  • Grouping de testes por marcadores.

Já temos o arquivo test_sample1.py. Crie um arquivo chamado test_sample2.py e adicione o código abaixo a ele.

def test_file2_method1():
	x=5
	y=6
	assert x+1 == y,"test failed"
	assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
def test_file2_method2():
	x=5
	y=6
	assert x+1 == y,"test failed"

Atualmente temos o seguinte.

• test_sample1.py
• test_file1_method1()
• test_file1_method2()
• test_sample2.py
• test_file2_method1()
• test_file2_method2()

Opção 1) Executar testes por correspondência de substring

Aqui, para executar todos os testes que têm "method1" em seu nome, precisamos executar o comando abaixo.

py.test -k method1 -v
-k <expression> is used to represent the substring to match
-v increases the verbosity

Portanto, executar py.test -k method1 -v fornecerá o seguinte resultado.

test_sample2.py::test_file2_method1 FAILED
test_sample1.py::test_file1_method1 FAILED

============================================== FAILURES ==============================================
_________________________________________ test_file2_method1 _________________________________________
    def test_file2_method1():
    	x=5
    	y=6
       	assert x+1 == y,"test failed"
>      	assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
E       AssertionError: test failed because x=5 y=6
E       assert 5 == 6
test_sample2.py:5: AssertionError

_________________________________________ test_file1_method1 _________________________________________
    @pytest.mark.only
    def test_file1_method1():
    	x=5
    	y=6
       	assert x+1 == y,"test failed"
>      	assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
E       AssertionError: test failed because x=5 y=6
E       assert 5 == 6
test_sample1.py:8: AssertionError

================================= 2 tests deselected by '-kmethod1' ==================================
=============================== 2 failed, 2 deselected in 0.02 seconds ===============================

Aqui você pode ver, perto do final, 2 testes desmarcados por '-kmethod1', que são test_file1_method2 e test_file2_method2.

Experimente executar o teste com várias combinações, como as seguintes.

py.test -k method -v - will run all the four methods
py.test -k methods -v – will not run any test as there is no test name matches the substring 'methods'

Opção 2) Executar testes por marcadores

O Pytest permite definir vários atributos para os métodos de teste usando marcadores do Pytest, `@pytest.mark`. Para usar marcadores no arquivo de teste, precisamos importar o Pytest para os arquivos de teste. Aqui, aplicaremos diferentes nomes de marcadores aos métodos de teste e executaremos testes específicos com base nesses nomes de marcadores. Podemos definir os marcadores para cada nome de teste usando o seguinte código.

@pytest.mark.<name>.			

Estamos definindo os marcadores set1 e set2 nos métodos de teste e executaremos o teste usando os nomes dos marcadores. Atualize os arquivos de teste com o seguinte código.

teste_amostra1.py

import pytest
@pytest.mark.set1
def test_file1_method1():
	x=5
	y=6
	assert x+1 == y,"test failed"
	assert x == y,"test failed because x=" + str(x) + " y=" + str(y)

@pytest.mark.set2
def test_file1_method2():
	x=5
	y=6
	assert x+1 == y,"test failed"

teste_amostra2.py

import pytest
@pytest.mark.set1
def test_file2_method1():
	x=5
	y=6
	assert x+1 == y,"test failed"
	assert x == y,"test failed because x=" + str(x) + " y=" + str(y)

@pytest.mark.set1
def test_file2_method2():
	x=5
	y=6
	assert x+1 == y,"test failed"

Podemos executar o teste marcado com o comando abaixo.

py.test -m <name>
-m <name> mentions the marker name

Execute `py.test -m set1`. Isso executará os métodos `test_file1_method1`, `test_file2_method1` e `test_file2_method2`. Executar `py.test -m set2` executará o método `test_file1_method2`.

Executar testes em paralelo com Pytest

Normalmente, um conjunto de testes terá vários arquivos de teste e centenas de métodos de teste, o que levará um tempo considerável para ser executado. O Pytest permite executar testes em paralelo. Para isso, precisamos primeiro instalar o pytest-xdist executando o comando abaixo.

pip install pytest-xdist

Execute testes em paralelo com pytest-xdist

Você pode executar os testes agora com o seguinte comando.

py.test -n 4

Aqui, -n Executa os testes usando vários processos. No comando acima, haverá quatro processos para executar os testes.

Pytest Jogos

Os fixtures são usados ​​quando queremos executar algum código antes de cada método de teste. Assim, em vez de repetir o mesmo código em todos os testes, definimos fixtures. Normalmente, os fixtures são usados ​​para inicializar conexões com o banco de dados, passar o endereço base e configurar o banco de dados. URLe assim por diante. Um método é marcado como um fixture do pytest ao ser marcado da seguinte forma.

@pytest.fixture

Um método de teste pode usar um fixture do pytest especificando-o como um parâmetro de entrada. Crie um novo arquivo test_basic_fixture.py com o seguinte código.

import pytest
@pytest.fixture
def supply_AA_BB_CC():
	aa=25
	bb =35
	cc=45
	return [aa,bb,cc]

def test_comparewithAA(supply_AA_BB_CC):
	zz=35
	assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed"

def test_comparewithBB(supply_AA_BB_CC):
	zz=35
	assert supply_AA_BB_CC[1]==zz,"bb and zz comparison failed"

def test_comparewithCC(supply_AA_BB_CC):
	zz=35
	assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"

Aqui:

  • Temos um parâmetro chamado supply_AA_BB_CC. Este método retorna uma lista de três valores.
  • Temos três métodos de teste que comparam cada um dos valores.

Cada uma das funções de teste possui um argumento de entrada cujo nome corresponde a um fixture disponível. O Pytest então invoca o método do fixture correspondente, e os valores retornados são armazenados no argumento de entrada, neste caso a lista [25, 35, 45]. Os itens da lista são então usados ​​nos métodos de teste para a comparação. Agora execute o teste e veja o resultado.

 py.test test_basic_fixture
test_basic_fixture.py::test_comparewithAA FAILED                                                                                                                                                                                       
test_basic_fixture.py::test_comparewithBB PASSED                                                                                                                                                                                       
test_basic_fixture.py::test_comparewithCC FAILED
                                                                                                                                                                                       
============================================== FAILURES ==============================================
_________________________________________ test_comparewithAA _________________________________________
supply_AA_BB_CC = [25, 35, 45]
    def test_comparewithAA(supply_AA_BB_CC):
    	zz=35
>   	assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed"
E    AssertionError: aa and zz comparison failed
E    assert 25 == 35
test_basic_fixture.py:10: AssertionError

_________________________________________ test_comparewithCC _________________________________________
supply_AA_BB_CC = [25, 35, 45]
    def test_comparewithCC(supply_AA_BB_CC):
    	zz=35
>   	assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"
E    AssertionError: cc and zz comparison failed
E    assert 45 == 35
test_basic_fixture.py:16: AssertionError
================================= 2 failed, 1 passed in 0.05 seconds =================================

O teste test_comparewithBB é aprovado, pois zz=BB=35, e os dois testes restantes falham.

O método fixture tem escopo apenas dentro do arquivo de teste onde está definido. Se tentarmos acessar o fixture em outro arquivo de teste, receberemos um erro informando que o fixture não existe. 'supply_AA_BB_CC' não encontrado para os métodos de teste nos outros arquivos.

Para usar o mesmo fixture em vários arquivos de teste, criamos métodos de fixture em um arquivo chamado conftest.py. Vejamos isso com o exemplo do pytest abaixo. Crie três arquivos: conftest.py, test_basic_fixture.py e test_basic_fixture2.py, com o seguinte código.

conftest.py

import pytest
@pytest.fixture
def supply_AA_BB_CC():
	aa=25
	bb =35
	cc=45
	return [aa,bb,cc]

test_basic_fixture.py

import pytest
def test_comparewithAA(supply_AA_BB_CC):
	zz=35
	assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed"

def test_comparewithBB(supply_AA_BB_CC):
	zz=35
	assert supply_AA_BB_CC[1]==zz,"bb and zz comparison failed"

def test_comparewithCC(supply_AA_BB_CC):
	zz=35
	assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"

test_basic_fixture2.py

import pytest
def test_comparewithAA_file2(supply_AA_BB_CC):
	zz=25
	assert supply_AA_BB_CC[0]==zz,"aa and zz comparison failed"

def test_comparewithBB_file2(supply_AA_BB_CC):
	zz=25
	assert supply_AA_BB_CC[1]==zz,"bb and zz comparison failed"

def test_comparewithCC_file2(supply_AA_BB_CC):
	zz=25
	assert supply_AA_BB_CC[2]==zz,"cc and zz comparison failed"

O Pytest primeiro procura o fixture no arquivo de teste e, se não o encontrar, procura no arquivo conftest.py. Execute o teste com py.test -k test_comparewith -v para obter o resultado abaixo.

test_basic_fixture.py::test_comparewithAA FAILED  
test_basic_fixture.py::test_comparewithBB PASSED 
test_basic_fixture.py::test_comparewithCC FAILED 
test_basic_fixture2.py::test_comparewithAA_file2 PASSED 
test_basic_fixture2.py::test_comparewithBB_file2 FAILED 
test_basic_fixture2.py::test_comparewithCC_file2 FAILED

Teste parametrizado Pytest

O objetivo de parametrizar um teste é executá-lo com múltiplos conjuntos de argumentos. Podemos fazer isso com `@pytest.mark.parametrize`. Veremos isso no exemplo de pytest abaixo. Aqui, passaremos três argumentos para um método de teste. Este método de teste somará os dois primeiros argumentos e comparará o resultado com o terceiro argumento. Crie o arquivo de teste `test_addition.py` com o código abaixo.

import pytest
@pytest.mark.parametrize("input1, input2, output",[(5,5,10),(3,5,12)])
def test_add(input1, input2, output):
	assert input1+input2 == output,"failed"

Aqui, o método de teste aceita três argumentos: input1, input2 e output. Ele soma input1 e input2 e compara a soma com o output. Vamos executar o teste com py.test -k test_add -v e ver o resultado.

test_addition.py::test_add[5-5-10] PASSED                                                                                                                                                                                              
test_addition.py::test_add[3-5-12] FAILED                                                                                                                                                                                              
============================================== FAILURES ==============================================
__________________________________________ test_add[3-5-12] __________________________________________
input1 = 3, input2 = 5, output = 12
    @pytest.mark.parametrize("input1, input2, output",[(5,5,10),(3,5,12)])
    def test_add(input1, input2, output):
>   	assert input1+input2 == output,"failed"
E    AssertionError: failed
E    assert (3 + 5) == 12
test_addition.py:5: AssertionError

Você pode ver que os testes foram executados duas vezes, uma verificando se 5+5 == 10 e a outra verificando se 3+5 == 12.

test_addition.py::test_add[5-5-10] APROVADO

test_addition.py::test_add[3-5-12] FALHA

Pytest Xfail e Skip Tests

Haverá situações em que não desejaremos executar um teste, ou um caso de teste não é relevante em um determinado momento. Nessas situações, temos a opção de falhar o teste (xfail) ou ignorá-lo. O teste com falha (xfail) será executado, mas não será contabilizado como parte dos testes aprovados ou reprovados. Não haverá nenhum resultado. tracO comando `eback` é exibido se o teste falhar. Podemos marcar testes como falhas (`xfail`) usando `@pytest.mark.xfail`. Ignorar.ping Um teste significa que o teste não será executado. Podemos ignorar testes usando `@pytest.mark.skip`. Edite o arquivo `test_addition.py` com o código abaixo.

import pytest
@pytest.mark.skip
def test_add_1():
	assert 100+200 == 400,"failed"

@pytest.mark.skip
def test_add_2():
	assert 100+200 == 300,"failed"

@pytest.mark.xfail
def test_add_3():
	assert 15+13 == 28,"failed"

@pytest.mark.xfail
def test_add_4():
	assert 15+13 == 100,"failed"

def test_add_5():
	assert 3+2 == 5,"failed"

def test_add_6():
	assert 3+2 == 6,"failed"

Aqui:

  • test_add_1 e test_add_2 são ignorados e não serão executados.
  • Os testes test_add_3 e test_add_4 falharam (xfailed). Esses testes serão executados e farão parte dos testes que falharam (xfailed) ou passaram (xpassed). Não haverá nenhum traceback para falhas.
  • Os testes test_add_5 e test_add_6 serão executados, e o teste test_add_6 reportará uma falha com um traceback enquanto test_add_5 passa.

Execute o teste com py.test test_addition.py -v e veja o resultado.

test_addition.py::test_add_1 SKIPPED
test_addition.py::test_add_2 SKIPPED
test_addition.py::test_add_3 XPASS
test_addition.py::test_add_4 xfail
test_addition.py::test_add_5 PASSED
test_addition.py::test_add_6 FAILED

============================================== FAILURES ==============================================
_____________________________________________ test_add_6 _____________________________________________
    def test_add_6():
>   	assert 3+2 == 6,"failed"
E    AssertionError: failed
E    assert (3 + 2) == 6
test_addition.py:24: AssertionError

================ 1 failed, 1 passed, 2 skipped, 1 xfailed, 1 xpassed in 0.07 seconds =================

Resultados em formato XML

Podemos criar resultados de testes em formato XML, que podem ser enviados para servidores de Integração Contínua para processamento posterior. Isso pode ser feito com o comando `py.test test_sample1.py -v --junitxml=”result.xml”`. O arquivo `result.xml` registrará o resultado da execução do teste. Veja um exemplo de `result.xml` abaixo.

<?xml version="1.0" encoding="UTF-8"?>
<testsuite errors="0" failures="1" name="pytest" skips="0" tests="2" time="0.046">
   <testcase classname="test_sample1" file="test_sample1.py" line="3" name="test_file1_method1" time="0.001384973526">
     <failure message="AssertionError:test failed because x=5 y=6 assert 5 ==6">
    @pytest.mark.set1
    def test_file1_method1():
    	x=5
    	y=6
       	assert x+1 == y,"test failed"
>      	assert x == y,"test failed because x=" + str(x) + " y=" + str(y)
E       AssertionError: test failed because x=5 y=6
E       assert 5 == 6
         test_sample1.py:9: AssertionError
    </failure>
   </testcase>
   <testcase classname="test_sample1" file="test_sample1.py" line="10" name="test_file1_method2" time="0.000830173492432" />
</testsuite>

De Podemos ver um total de dois testes, dos quais um falhou. Abaixo, você pode ver os detalhes referentes a cada teste executado. marcação.

Pytest é um framework para testar APIs.

Agora vamos criar um pequeno framework pytest para testar uma API. A API usada aqui é gratuita e está disponível em [inserir URL aqui]. requis.inEste site simplesmente fornece uma API testável e não armazena nossos dados. Aqui, escreveremos alguns testes para o seguinte:

  • Lista de alguns usuários.
  • Entrar com usuários.

Crie os arquivos abaixo com o código fornecido. Primeiro, o arquivo conftest.py contém uma função auxiliar que fornecerá a base. URL para todos os métodos de teste.

import pytest
@pytest.fixture
def supply_url():
	return "https://reqres.in/api"

Em seguida, o arquivo test_list_user.py contém os métodos de teste para listar usuários válidos e inválidos.

  • A função `test_list_valid_user` testa se a busca por um usuário é válida e verifica a resposta.
  • A função `test_list_invaliduser` testa se a busca por um usuário é inválida e verifica a resposta.
import pytest
import requests
import json
@pytest.mark.parametrize("userid, firstname",[(1,"George"),(2,"Janet")])
def test_list_valid_user(supply_url,userid,firstname):
	url = supply_url + "/users/" + str(userid)
	resp = requests.get(url)
	j = json.loads(resp.text)
	assert resp.status_code == 200, resp.text
	assert j['data']['id'] == userid, resp.text
	assert j['data']['first_name'] == firstname, resp.text

def test_list_invaliduser(supply_url):
	url = supply_url + "/users/50"
	resp = requests.get(url)
	assert resp.status_code == 404, resp.text

Em seguida, o arquivo test_login_user.py contém os métodos de teste para testar a funcionalidade de login.

  • O teste test_login_valid verifica se a tentativa de login com um e-mail e senha é válida.
  • O teste test_login_no_password verifica se a tentativa de login inválida foi feita sem passar uma senha.
  • O teste test_login_no_email simula uma tentativa de login inválida sem o envio de um e-mail.
import pytest
import requests
import json
def test_login_valid(supply_url):
	url = supply_url + "/login/" 
	data = {'email':'test@test.com','password':'something'}
	resp = requests.post(url, data=data)
	j = json.loads(resp.text)
	assert resp.status_code == 200, resp.text
	assert j['token'] == "QpwL5tke4Pnpja7X", resp.text

def test_login_no_password(supply_url):
	url = supply_url + "/login/" 
	data = {'email':'test@test.com'}
	resp = requests.post(url, data=data)
	j = json.loads(resp.text)
	assert resp.status_code == 400, resp.text
	assert j['error'] == "Missing password", resp.text

def test_login_no_email(supply_url):
	url = supply_url + "/login/" 
	data = {}
	resp = requests.post(url, data=data)
	j = json.loads(resp.text)
	assert resp.status_code == 400, resp.text
	assert j['error'] == "Missing email or username", resp.text

Execute o teste usando py.test -v e veja o resultado a seguir.

test_list_user.py::test_list_valid_user[1-George] PASSED                                                                                                                                                                               
test_list_user.py::test_list_valid_user[2-Janet] PASSED                                                                                                                                                                                
test_list_user.py::test_list_invaliduser PASSED                                                                                                                                                                                        
test_login_user.py::test_login_valid PASSED                                                                                                                                                                                            
test_login_user.py::test_login_no_password PASSED                                                                                                                                                                                      
test_login_user.py::test_login_no_email PASSED

Atualize os testes e experimente diferentes resultados.

Perguntas Frequentes

Ambos correm Python O pytest utiliza instruções assert simples, requer menos código repetitivo e oferece fixtures, marcadores e parametrização. O unittest é fornecido com a biblioteca padrão e segue o estilo xUnit baseado em classes. O pytest ainda pode executar casos de teste unittest existentes.

Use a sintaxe de ID do nó com dois pontos: pytest test_sample1.py::test_file1_method1. Isso executa apenas esse método. Você também pode selecionar um arquivo inteiro (pytest test_sample1.py) ou filtrar por nome com a opção -k.

Instale o plugin pytest-cov e execute pytest --cov=seu_pacote. Ele exibirá a porcentagem de linhas executadas pelos seus testes, e --cov-report=html gera um relatório navegável que destaca as linhas não testadas.

O escopo de um fixture controla a frequência com que ele é executado: função (padrão), classe, módulo, pacote ou sessão. Defina-o com `@pytest.fixture(scope=”module”)`. Escopos mais amplos reutilizam configurações dispendiosas, como uma conexão com o banco de dados, em vários testes.

Execute `pytest -x` para interromper imediatamente após o primeiro teste com falha, ou `pytest --maxfail=2` para interromper após um número escolhido de falhas. Isso reduz o tempo de resposta ao depurar um conjunto de testes com problemas.

Por padrão, o Pytest captura a saída padrão (stdout). Adicione a opção -s (pytest -s) para desativar a captura e exibir as instruções de impressão em tempo real. A opção -v adiciona uma saída detalhada para cada teste, listando o nome de cada teste e seu resultado.

As equipes de aprendizado de máquina usam o pytest para validar pipelines de carregamento de dados, transformações de recursos e saídas de modelos. Os fixtures fornecem conjuntos de dados de amostra e os parametrize verificam várias entradas, garantindo que as partes inteligentes de um sistema permaneçam confiáveis ​​mesmo com alterações no código.

Sim. O GitHub Copilot e assistentes de IA com agentes podem gerar funções pytest, fixtures e casos parametrizados a partir de um breve prompt ou de uma função existente. RevAnalise as afirmações geradas, pois a IA pode ignorar casos extremos e avaliar incorretamente os valores esperados.

Resuma esta postagem com: