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
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.
Próximos partidos
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
Requisitos previos
Antes de comenzar el tutorial, completa los siguientes pasos:
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.
Ejecute el siguiente comando para instalar
pytesten su entorno:pip install -U pytest 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>" 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
Agrega un fixture de MongoClient
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 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 ===============================
Agregar una dependencia principal para la sesión de rollback
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:
Crear una sesión
Inicia una transacción
Cede la sesión a la prueba
Aborta 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 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 ===============================
Empaqueta una librería de Python
En esta sección, puedes aprender a empaquetar una librería de Python de muestra realizando las siguientes acciones:
Describa el paquete
Compila el paquete
Publicar el paquete en PyPI
Describa 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 archivo pyproject.toml, consulte Cómo escribir su pyproject. toml.
Compila el paquete
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
Publicar en PyPI
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/
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: