Visão geral
Este tutorial mostra como adicionar pytest dispositivos que executam testes em relação ao MongoDB e usam transações para reverter as alterações. Ele também mostra como pacote uma biblioteca Python usando a biblioteca hatchling e publicar o pacote no PyPI.
Dica
Codificação com marca
Este tutorial é baseado no segundo capítulo da transmissão ao vivo "Codificando com Marca". Você pode assistir à gravação no canal do MongoDB no YouTube.
Luminárias
As fixações em pytest são funções que criam recursos para uso em testes de unidade. Normalmente, os acessórios são definidos em um arquivo chamado conftest.py no diretório do projeto . Você pode utilizar uma instrução yield para retornar um valor para a função de teste.
Cada dispositivo tem um escopo, que controla a frequência com que o dispositivo é executado. O seguinte dispositivo, sample_fixture, usa o escopo padrão, function. Isso significa que o pytest executa a fixação antes de cada função de teste que a utiliza. O dispositivo utiliza uma declaração yield para retornar a string "Hello, World" para a função de teste.
def sample_fixture(): # Code before the test runs yield "Hello, World" # Code after the test runs
Pré-requisitos
Antes de iniciar o tutorial, conclua as seguintes etapas:
Siga as etapas no guia de Introdução para instalar o PyMongo e suas dependências. Certifique-se de copiar sua string de conexão para uso em uma etapa posterior.
Execute o seguinte comando para instalar o
pytestem seu ambiente:pip install -U pytest Encontre a string de conexão do MongoDB que você copiou em uma etapa anterior. Execute o seguinte comando para armazenar a string de conexão na variável de ambiente do
MDB_URI:export MDB_URI="<your connection string>" Instale os pacotes
buildetwinepara pacote e publicar sua biblioteca. O pacotebuildinstala dependências de compilação e empacota seu projeto, e o pacotetwinecarrega seu pacote com segurança no PyPI.python -m pip install --upgrade build twine
Criar e testar acessórios pytest
Esta seção do tutorial inclui as seguintes tarefas:
Adicionando acessórios
pytestpara um objetoMongoCliente uma sessão de rollbackEscrevendo testes que usam esses acessórios
Adicionar um dispositivo MongoClient
A seguinte amostra de código mostra um dispositivo denominado mongodb. Esse ajuste usa a string de conexão na variável de ambiente MDB_URI para criar um objeto MongoClient e, em seguida, garante que ele possa se conectar à implantação do MongoDB especificada. O dispositivo tem um escopo session, o que significa que pytest executa o dispositivo no início da sessão de teste e o reutiliza para todos os testes.
Este dispositivo utiliza o dispositivo mongodb incluindo-o como um parâmetro de função. Isto instrui pytest a passar mongodb como um argumento para o dispositivo de fixação.
Adicione o seguinte código a um arquivo chamado conftest.py:
import pytest import pymongo import os def mongodb(): client = pymongo.MongoClient(os.environ["MDB_URI"]) assert client.admin.command("ping")["ok"] != 0.0 yield client client.close()
Para testar o dispositivo, adicione o seguinte código a um arquivo chamado test_mongodb_fixture.py:
def test_mongodb_fixture(mongodb): """This test passes if `MDB_URI` is set to a valid connection string.""" assert mongodb.admin.command("ping")["ok"] > 0
Execute o teste executando o seguinte comando em seu terminal:
pytest test_mongodb_fixture.py
Se o teste for bem-sucedido, ele imprime uma mensagem semelhante à seguinte:
============================= test session starts ============================== collected 1 item test_mongodb_fixture.py . [100%] ============================== 1 passed in 0.XXs ===============================
Adicionar um dispositivo de sessão de rollback
Se seus testes modificarem dados no MongoDB, mas você não quiser que essas alterações persistam, poderá usar uma transação para reverter as alterações após cada teste. Para fazer isso, execute as seguintes etapas em seu dispositivo:
Criar uma sessão
Iniciar uma transação
Entregue a sessão para o teste
Abortar a transação após a execução do teste
A instalação no exemplo de código a seguir implementa esse padrão:
def rollback_session(mongodb): session = mongodb.start_session() session.start_transaction() try: yield session finally: session.abort_transaction()
O dispositivo de fixação anterior usa o escopo function padrão, portanto, abort_transaction é executado após cada função de teste.
Para testar o dispositivo, adicione o seguinte código a um arquivo chamado test_update_mongodb.py:
def test_update_mongodb(mongodb, rollback_session): my_collection = mongodb["sample_db"]["sample_collection"] my_collection.insert_one( { "_id": "bad_document", "description": ( "If this still exists, then transactions are not working." ), }, session=rollback_session, ) assert ( my_collection.find_one( {"_id": "bad_document"}, session=rollback_session ) is not None )
Observação
session Argument
Passe o argumento session para todas as queries. Isso garante que eles façam parte da transação.
Execute o teste executando o seguinte comando em seu terminal:
pytest test_update_mongodb.py
Se o teste for bem-sucedido, ele imprime uma mensagem semelhante à seguinte:
============================= test session starts ============================== collected 1 item test_update_mongodb.py . [100%] ============================== 1 passed in 0.XXs ===============================
Empacotar uma biblioteca Python
Nesta seção, você pode aprender como pacote uma biblioteca Python de amostra executando as seguintes ações:
Descrever o pacote
Construir o pacote
Publicar o pacote no PyPI
Descrever o pacote
Descreva seu projeto em um arquivo chamado pyproject.toml. O seguinte arquivo descreve um pacote que usa o backend de compilação hatchling:
[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "sample_application" version = "0.0.1" authors = [{ name = "<your name>", email = "<your email address>" }] description = "An example application to demonstrate packaging a Python project." requires-python = ">=3.10" dependencies = ["pymongo>=4.15.5"] classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Development Status :: 1 - Planning", "Intended Audience :: Developers", "Topic :: Database", ] [tool.hatch.build.targets.wheel] packages = ["sample_application"] [project.urls] Homepage = "https://github.com/mongodb"
Dica
Mais configurações do projeto py
Para obter mais informações sobre como escrever um pyproject.toml arquivo, consulte Escrevendo seu pyproject.toml.
Construir o pacote
Para construir uma distribuição a partir do seu pacote, execute o seguinte comando no diretório do projeto :
python3 -m build
A etapa anterior cria uma roda e um tarball compactado para seu pacote. Se a operação de compilação for bem-sucedida, ela imprimirá uma saída semelhante ao seguinte:
* Creating isolated environment: venv+pip... * Installing packages in isolated environment: - hatchling * Getting build dependencies for sdist... * Building sdist... * Building wheel from sdist * Creating isolated environment: venv+pip... * Installing packages in isolated environment: - hatchling * Getting build dependencies for wheel... * Building wheel... Successfully built sample_application-0.0.1.tar.gz and sample_application-0.0.1-py3-none-any.whl
Publicar no PyPI
Depois de construir, você pode carregar sua roda e tarball compactado usando twine. Para carregar esses arquivos, execute o seguinte comando no diretório do projeto :
python3 -m twine upload dist/*
Um upload bem-sucedido produz resultados semelhantes às seguintes mensagens:
* Uploading distributions to https://upload.pypi.org/legacy/ * Enter your username: * Enter your password: * Uploading sample_application-0.0.1-py3-none-any.whl * Uploading sample_application-0.0.1.tar.gz * View at: https://pypi.org/project/sample_application/0.0.1/
MAIS INFORMAÇÕES
Para obter mais informações sobre os pacotes e código Python usados neste tutorial, consulte os seguintes recursos: