MongoDB.local SF, Jan 15: See the speaker lineup & ship your AI vision faster. Use WEB50 to save 50%
Find out more >
Menu Docs
Página inicial do Docs
/ /

Tutorial: Testar e embalar uma biblioteca Python

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.

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

Antes de iniciar o tutorial, conclua as seguintes etapas:

  1. 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.

  2. Execute o seguinte comando para instalar o pytest em seu ambiente:

    pip install -U pytest
  3. 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>"
  4. Instale os pacotes build e twine para pacote e publicar sua biblioteca. O pacote build instala dependências de compilação e empacota seu projeto, e o pacote twine carrega seu pacote com segurança no PyPI.

    python -m pip install --upgrade build twine

Esta seção do tutorial inclui as seguintes tarefas:

  1. Adicionando acessórios pytest para um objeto MongoClient e uma sessão de rollback

  2. Escrevendo testes que usam esses acessórios

1

Crie um novo diretório para o seu projeto e navegue até ele no seu terminal:

mkdir sample_application
cd sample_application
2

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
@pytest.fixture(scope="session")
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 ===============================
3

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:

  1. Criar uma sessão

  2. Iniciar uma transação

  3. Entregue a sessão para o teste

  4. 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:

@pytest.fixture
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 ===============================

Nesta seção, você pode aprender como pacote uma biblioteca Python de amostra executando as seguintes ações:

  1. Descrever o pacote

  2. Construir o pacote

  3. Publicar o pacote no PyPI

1

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.

2

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
3

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/

Para obter mais informações sobre os pacotes e código Python usados neste tutorial, consulte os seguintes recursos:

Voltar

Tutorial: integração com a FastAPI

Nesta página