Fundamentos do uso do pytest

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", "...."])

Tags: pytest testes-unitarios fixtures allure

Publicado em 7-8 23:03