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

Codificación 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.

Las instalaciones en pytest son funciones que crean recursos para usar en pruebas unitarias. Normalmente, se definen en un archivo llamado conftest.py en el directorio del proyecto. Puede usar una instrucción yield para devolver un valor a la función de prueba.

Cada elemento tiene un alcance que controla su frecuencia de ejecución. El siguiente elemento, sample_fixture, usa el alcance predeterminado, function. Esto significa que pytest ejecuta el elemento antes de cada función de prueba que lo utiliza. El elemento usa una sentencia 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, complete los siguientes pasos:

  1. Siga los pasos de la Guíade inicio para instalar PyMongo y sus dependencias. Asegúrate de copiar la cadena de conexión para usarla posteriormente.

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

    pip install -U pytest
  3. Busque la cadena de conexión de MongoDB que copió en un paso anterior. Ejecute el siguiente comando para almacenarla 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 una instancia llamada mongodb. Esta instancia usa la cadena de conexión de la variable de entorno MDB_URI para crear un objeto MongoClient y, a continuación, garantiza su conexión a la implementación de MongoDB especificada. La instancia tiene un alcance session, lo que significa que pytest la ejecuta al inicio de la sesión de prueba y la reutiliza para todas las pruebas.

Esta función usa la función mongodb incluyéndola como parámetro de función. Esto indica a pytest que pase mongodb como argumento a la función.

Agregue 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 dispositivo, agregue 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 sus pruebas modifican datos en MongoDB, pero no desea que esos cambios persistan, puede usar una transacción para revertirlos después de cada prueba. Para ello, siga estos pasos en su instalación:

  1. Crear una sesión

  2. Inicia una transacción

  3. Ceder la sesión a la prueba

  4. Abortar 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 dispositivo, agregue 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

Pase 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, puede aprender cómo empaquetar una biblioteca de Python de muestra realizando las siguientes acciones:

  1. Describe 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 pyproject.toml archivo, consulte Cómo escribir su pyproject.toml.

2

Para crear una distribución a partir de su paquete, ejecute el siguiente comando en el directorio de su proyecto:

python3 -m build

El paso anterior crea un archivo wheel y un archivo tar comprimido con gzip para el paquete. Si la compilación se realiza correctamente, se imprime un resultado similar al 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

Después de compilar, puedes subir tu rueda y el archivo comprimido con gzip usando twine. Para subir estos archivos, ejecuta el siguiente comando en el directorio de tu proyecto:

python3 -m twine upload dist/*

Una carga exitosa produce un resultado 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 de FastAPI

En esta página