Overview
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.
Accesorios
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
Requisitos previos
Antes de comenzar el tutorial, complete los siguientes pasos:
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.
Ejecute el siguiente comando para instalar
pytesten su entorno:pip install -U pytest 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>" Instala los paquetes
buildytwinepara empaquetar y publicar tu biblioteca. El paquetebuildinstala las dependencias de compilación y empaqueta tu proyecto, y el paquetetwinesube tu paquete de forma segura a PyPI.python -m pip install --upgrade build twine
Crear y probar fixtures de pytest
Esta sección del tutorial incluye las siguientes tareas:
Agregar
pytestaccesorios para un objetoMongoClienty una sesión de reversiónEscribir pruebas que utilicen estos fixtures
Agregar un accesorio MongoClient
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 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 ===============================
Agregar un accesorio de sesión de reversión
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:
Crear una sesión
Inicia una transacción
Ceder la sesión a la prueba
Abortar la transacción después de ejecutar la prueba
El elemento del siguiente ejemplo de código implementa este patrón:
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 ===============================
Empaquetar una biblioteca de Python
En esta sección, puede aprender cómo empaquetar una biblioteca de Python de muestra realizando las siguientes acciones:
Describe el paquete
Compila el paquete
Publicar el paquete en PyPI
Describe el paquete
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.
Compila el paquete
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
Publicar en PyPI
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/
Más información
Para obtener más información sobre los paquetes y el código de Python utilizados en este tutorial, consulte los siguientes recursos: