Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Tutorial: Probar y empaquetar una biblioteca de Python

Este tutorial muestra cómo agregar pytest Accesorios que ejecutan pruebas en MongoDB y usan transacciones para revertir cambios. También muestra cómo empaquetar una biblioteca de Python usando la biblioteca hatchling y publicar el paquete en PyPI.

Tip

Codificar con Mark

Este tutorial se basa en el segundo episodio de la transmisión en vivo de "Coding with Mark". Puedes ver la grabación en Canal de YouTube de MongoDB.

Los fixtures en pytest son funciones que crean recursos para su uso en pruebas unitarias. Típicamente, los fixtures se definen en un archivo llamado conftest.py en el directorio del proyecto. Puede usar una yield instrucción para devolver un valor a la función de prueba.

Cada fixture tiene un alcance, que controla la frecuencia con la que se ejecuta la fixture. La siguiente prueba, sample_fixture, utiliza el alcance por defecto, function. Esto significa que pytest ejecuta el fixture antes de cada función de prueba que lo utilice. El fixture utiliza una instrucción yield para devolver la cadena "Hello, World" a la función de prueba.

def sample_fixture():
# Code before the test runs
yield "Hello, World"
# Code after the test runs

Antes de comenzar el tutorial, completa los siguientes pasos:

  1. Siga los pasos en el Guía Comenzar para instalar PyMongo y sus dependencias. Asegúrate de copiar tu cadena de conexión para usarla en un paso posterior.

  2. Ejecute el siguiente comando para instalar pytest en su entorno:

    pip install -U pytest
  3. Encuentra la cadena de conexión de MongoDB que copiaste en el paso anterior. Ejecuta el siguiente comando para almacenar la cadena de conexión en la variable de entorno MDB_URI:

    export MDB_URI="<your connection string>"
  4. Instala los paquetes build y twine para empaquetar y publicar tu biblioteca. El paquete build instala las dependencias de compilación y empaqueta tu proyecto, y el paquete twine sube tu paquete de forma segura a PyPI.

    python -m pip install --upgrade build twine

Esta sección del tutorial incluye las siguientes tareas:

  1. Agregar pytest accesorios para un objeto MongoClient y una sesión de reversión

  2. Escribir pruebas que utilicen estos fixtures

1

Crea un nuevo directorio para tu proyecto y navega a él en tu terminal:

mkdir sample_application
cd sample_application
2

El siguiente ejemplo de código muestra un fixture llamado mongodb. Este accesorio utiliza la cadena de conexión en la variable de entorno MDB_URI para crear un objeto MongoClient y luego garantiza que puede conectarse a la implementación de MongoDB especificada. El fixture tiene un alcance de session, lo que significa que pytest ejecuta el fixture al inicio de la sesión de pruebas y lo reutiliza para todas las pruebas.

Este fixture utiliza el fixture mongodb incluyéndolo como parámetro de función. Esto le indica a pytest que pase mongodb como argumento al fixture.

Agrega el siguiente código a un archivo llamado 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 probar el fixture, añade el siguiente código a un archivo llamado 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

Ejecute la prueba ejecutando el siguiente comando en su terminal:

pytest test_mongodb_fixture.py

Si la prueba es exitosa, imprime un mensaje similar al siguiente:

============================= test session starts ==============================
collected 1 item
test_mongodb_fixture.py . [100%]
============================== 1 passed in 0.XXs ===============================
3

Si tus pruebas modifican datos en MongoDB, pero no deseas que esos cambios sean permanentes, puedes usar una transacción para revertir los cambios después de cada prueba. Para ello, realiza los siguientes pasos en tu sistema de iluminación:

  1. Crear una sesión

  2. Inicia una transacción

  3. Cede la sesión a la prueba

  4. Aborta la transacción después de ejecutar la prueba

El elemento del siguiente ejemplo de código implementa este patrón:

@pytest.fixture
def rollback_session(mongodb):
session = mongodb.start_session()
session.start_transaction()
try:
yield session
finally:
session.abort_transaction()

El accesorio anterior utiliza el alcance predeterminado function, por lo que abort_transaction se ejecuta después de cada función de prueba.

Para probar el fixture, añade el siguiente código a un archivo llamado 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
)

Nota

session Argument

Pasa el argumento session a todas las consultas. Esto garantiza que formen parte de la transacción.

Ejecute la prueba ejecutando el siguiente comando en su terminal:

pytest test_update_mongodb.py

Si la prueba es exitosa, imprime un mensaje similar al siguiente:

============================= test session starts ==============================
collected 1 item
test_update_mongodb.py . [100%]
============================== 1 passed in 0.XXs ===============================

En esta sección, puedes aprender a empaquetar una librería de Python de muestra realizando las siguientes acciones:

  1. Describa el paquete

  2. Compila el paquete

  3. Publicar el paquete en PyPI

1

Describe tu proyecto en un archivo llamado pyproject.toml. El siguiente archivo describe un paquete que utiliza el backend de compilación 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"

Tip

Más configuraciones de pyproject

Para obtener más información sobre cómo escribir un archivo pyproject.toml, consulte Cómo escribir su pyproject. toml.

2

Para compilar una distribución desde tu paquete, ejecuta el siguiente comando en el directorio de tu proyecto:

python3 -m build

El paso anterior crea una rueda y un tarball comprimido en formato gz para su paquete. Si la operación de compilación es exitosa, se imprime una salida similar a la siguiente:

* 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

Una vez compilado, puedes cargar tu rueda y tu archivo tar comprimido con gzip utilizando twine. Para cargar estos archivos, ejecute el siguiente comando en su directorio de proyecto:

python3 -m twine upload dist/*

Una carga exitosa produce una salida similar a los siguientes mensajes:

* 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 obtener más información sobre los paquetes y el código de Python utilizados en este tutorial, consulte los siguientes recursos:

Volver

Tutorial: Integración con FastAPI

En esta página