Registros do pytest
Regras de execução de casos de teste com pytest
# Arquivos de teste .py devem começar com test_xxx.py ou terminar com _test
# Classes de teste devem começar com Test e não podem ter método init
# Métodos de teste devem começar com test_
# Asserções devem usar assert
class TestAutenticacao:
def test_autenticacao01(self):
print("Informação de saída")
assert 1 + 1 == 2
pytest.main(["teste_autenticacao.py", "-vs"]) # O nome do arquivo pode ser omitido, padrão é o arquivo atual
Exibição de informações
# No pytest, como prints, as informações não são exibidas por padrão
# Use o parâmetro "-s" no pytest.main(["-s"]) para exibir as informações de impressão
Os quatro tipos de setup e teardown do pytest
Normalmente não é comum, geralmente usa-se fixture com scope para definição:
# 1. setup_module e teardown_module são executados uma vez antes e depois de todos os métodos no arquivo
# 2. setup_class e teardown_class são executados antes e depois de todos os casos em uma classe
# 3. setup_method e teardown_method são executados antes e depois de cada método na classe
# 4. setup_function e teardown_function são executados antes e depois de cada método de teste fora de classe
Configuração do ambiente Allure
# 1. Baixe allure.zip
# 2. Extraia allure.zip para um diretório
# 3. Adicione o caminho G:\lanzhou\allure-2.13.3\bin às variáveis de ambiente
# 4. Instale allure-pytest com pip
# 5. Verifique a instalação com allure no prompt de comando
Integração pytest com Allure
# Execute testes unitários pytest, gerando dados para o Allure em /tmp
pytest -projeto --aluredir = ../relatorios/tmp
# Execute comando para gerar relatório
allure generate ../relatorios/tmp -o ../relatorios/relatorio --clean
Geração de relatórios
if __name__ == "__main__":
pytest.main(["-s", "--alluredir", "../relatorios/tmp"])
os.system('allure generate ../relatorios/tmp -o ../relatorios/relatorio --clean')
Adicionando tags aos relatórios Allure
@allure.epic('ETL') # Nome do projeto
@allure.feature('Módulo de autenticação') # Nome do módulo
class TestLogin:
@pytest.mark.parametrize('titulo,corpoEntrada,dadosEsperados', obter_dados_caso_yaml(os.path.join(caminho_dados_teste,'casoLogin.yml')))
@allure.story("Autenticacao-1") # Tag secundária
@allure.title("{titulo}") # Nome do método de teste
def test_autenticacao(self,titulo,corpoEntrada,dadosEsperados):
res = Autenticacao().entrar(corpoEntrada)
# Asserção: 1- igualdade de informação chave local 2- relação de inclusão
AssertorApi.definir_assercao_api(res['mensagem'],'=',dadosEsperados['mensagem'])
Uso de fixtures
Definição de fixture
# 1. Defina fixtures no arquivo conftest.py
# 2. O escopo do conftest é o pacote onde está localizado; geralmente colocado no diretório raiz do projeto
# 3. As fixtures definidas não precisam ser importadas para uso direto
import pytest
# Nível de classe é semelhante ao método de pré-configuração do unittest
# Após yield é semelhante ao método de pós-configuração do unittest
@pytest.fixture(scope="class")
def tempo_inicial():
pass
@pytest.fixture(scope="class")
def valor_retornado():
yield "Valor retornado"
# Para chamar manualmente fixtures com valor de retorno, use o nome da função diretamente
# Para fixtures sem valor de retorno, use @pytest.mark.usefixtures("nome_da_funcao")
@pytest.mark.usefixtures("tempo_inicial")
class ClasseTeste:
pass
Escopo do fixture
# Níveis de escopo:
# - function
# - class
# - module
# - package/session
# Por exemplo, se conftest estiver em test_case:
# Se scope=class, e houver cinco classes de teste em test_case, executará cinco vezes
# Se scope=module, e houver três arquivos py em test_case, executará três vezes
# Se scope=function, e houver dez métodos de teste em test_case, executará dez vezes
# Se scope=session, executará apenas uma vez
# O padrão é scope=function, executando antes de cada método de teste
# autouse=True, padrão False, define se a fixture é automaticamente chamada
# Se True, é chamada automaticamente; se False, deve ser chamada manualmente
# No trabalho autouse=False é mais comum
Estados no console do pytest
"""
. Sucesso
F Falha
E Erro
S Pulado
deselect Não selecionado
"""
Tags personalizadas
As tags personalizadas devem ser adicionadas no arquivo pytest.ini:
# Nome da tag personalizada: pytest.mark.nome_da_tag_personalizada
# Sem adicionar tags, o pytest exibirá um aviso após a execução
# Cenário de uso: execução em cenários específicos
[pytest]
markers =
"meu_smoke": descrição da tag personalizada
titulo01:
titulo02:
Execução apenas de tags personalizadas
pytest.main(["-v", "-m", "meu_smoke", "meu_smoke02", "...."])