prueba #
Matplotlib utiliza el marco pytest .
Las pruebas están lib/matplotlib/tests
disponibles y las personalizaciones de la infraestructura de pruebas de pytest están disponibles matplotlib.testing
.
Requisitos #
Para ejecutar las pruebas, deberá configurar Matplotlib para el desarrollo . Tenga en cuenta en particular las dependencias adicionales para las pruebas.
Nota
Asumiremos que desea ejecutar las pruebas en una configuración de desarrollo.
Si bien puede ejecutar las pruebas con una versión instalada normal de Matplotlib, este es un caso de uso mucho menos común. Todavía necesita las dependencias adicionales para la prueba. Además, debe obtener las imágenes de referencia del repositorio, ya que no se distribuyen con paquetes de Matplotlib prediseñados.
Ejecutando las pruebas #
En el directorio raíz de su repositorio de desarrollo, ejecute:
python -m pytest
pytest se puede configurar a través de muchos parámetros de línea de comandos . Algunos particularmente útiles son:
|
ser más detallado |
|
Ejecute pruebas en paralelo sobre NUM procesos (requiere pytest-xdist ) |
|
No capturar salida estándar |
Para ejecutar una sola prueba desde la línea de comandos, puede proporcionar una ruta de archivo, opcionalmente seguida por la función separada por dos puntos, por ejemplo, (no es necesario instalar las pruebas, pero Matplotlib debería estarlo):
pytest lib/matplotlib/tests/test_simplification.py::test_clipping
Escribiendo una prueba simple #
Muchos elementos de Matplotlib se pueden probar mediante pruebas estándar. Por ejemplo, aquí hay una prueba de matplotlib/tests/test_basic.py
:
def test_simple():
"""
very simple example test
"""
assert 1 + 1 == 2
Pytest determina qué funciones son pruebas buscando archivos cuyos nombres comiencen con "test_"
y luego, dentro de esos archivos, funciones que comiencen con
"test"
o clases que comiencen con "Test"
.
Algunas pruebas tienen efectos secundarios internos que deben limpiarse después de su ejecución (como figuras creadas o modificadas rcParams
). El accesorio pytest
matplotlib.testing.conftest.mpl_test_settings
los limpiará automáticamente; no hay necesidad de hacer nada más.
Datos aleatorios en las pruebas #
Los datos aleatorios son una forma muy conveniente de generar datos para ejemplos, sin embargo, la aleatoriedad es problemática para las pruebas (¡ya que las pruebas deben ser deterministas!). Para evitar esto, configure la semilla en cada prueba. Para el uso del generador de números aleatorios predeterminado de numpy:
import numpy as np
rng = np.random.default_rng(19680801)
y luego usar rng
al generar los números aleatorios.
La semilla es el cumpleaños de John Hunter.
Escribir una prueba de comparación de imágenes #
Escribir una prueba basada en imágenes es solo un poco más difícil que una prueba simple. La consideración principal es que debe especificar las imágenes de "línea de base" o esperadas en el image_comparison
decorador. Por ejemplo, esta prueba genera una sola imagen y la prueba automáticamente:
from matplotlib.testing.decorators import image_comparison
import matplotlib.pyplot as plt
@image_comparison(baseline_images=['line_dashes'], remove_text=True,
extensions=['png'])
def test_line_dashes():
fig, ax = plt.subplots()
ax.plot(range(10), linestyle=(0, (3, 3)), lw=5)
La primera vez que se ejecuta esta prueba, no habrá una imagen de referencia con la que comparar, por lo que la prueba fallará. Copie las imágenes de salida (en este caso
result_images/test_lines/test_line_dashes.png
) en el subdirectorio correcto del baseline_images
árbol en el directorio de origen (en este caso lib/matplotlib/tests/baseline_images/test_lines
). Ponga este nuevo archivo bajo el control de revisión del código fuente (con ). Al volver a ejecutar las pruebas, ahora deberían pasar.git add
Las imágenes de referencia ocupan mucho espacio en el repositorio de Matplotlib. Un enfoque alternativo para las pruebas de comparación de imágenes es usar el
check_figures_equal
decorador, que debe usarse para decorar una función tomando dos Figure
parámetros y dibuja las mismas imágenes en las figuras usando dos métodos diferentes (el método probado y el método de línea de base). El decorador se encargará de configurar las figuras y luego recopilará los resultados dibujados y los comparará.
Consulte la documentación de image_comparison
y
check_figures_equal
para obtener información adicional sobre su uso.
Creando un nuevo módulo en matplotlib.tests #
Intentamos mantener las pruebas categorizadas por el módulo principal que están probando. Por ejemplo, las pruebas relacionadas con el mathtext.py
módulo están en formato test_mathtext.py
.
Uso de acciones de GitHub para CI #
GitHub Actions es un sistema CI alojado "en la nube".
GitHub Actions está configurado para recibir notificaciones de nuevas confirmaciones en los repositorios de GitHub y para ejecutar compilaciones o pruebas cuando ve estas nuevas confirmaciones. Busca un archivo YAML .github/workflows
para ver cómo probar el proyecto.
GitHub Actions ya está habilitado para el repositorio principal de Matplotlib GitHub ; por ejemplo, consulte los flujos de trabajo de Pruebas .
Las acciones de GitHub deben habilitarse automáticamente para su bifurcación Matplotlib personal una vez que los archivos de flujo de trabajo YAML estén en ella. Por lo general, no es necesario mirar estos flujos de trabajo, ya que se probará cualquier solicitud de extracción enviada contra el repositorio principal de Matplotlib. El flujo de trabajo de Pruebas se omite en los repositorios bifurcados, pero puede desencadenar una ejecución manualmente desde la interfaz web de GitHub .
Puede ver los resultados de las acciones de GitHub en https://github.com/your_GitHub_user_name/matplotlib/actions ; este es un ejemplo .
Uso de tóxicos #
Tox es una herramienta para ejecutar pruebas en varios entornos de Python, incluidas varias versiones de Python (p. ej., 3.7, 3.8) e incluso diferentes implementaciones de Python juntas (p. ej., CPython, PyPy, Jython, etc.), siempre que todas estas versiones estén disponibles en el $PATH de su sistema (considere usar el administrador de paquetes de su sistema, por ejemplo, apt-get, yum o Homebrew, para instalarlos).
tox facilita determinar si su copia de trabajo introdujo alguna regresión antes de enviar una solicitud de extracción. He aquí cómo usarlo:
$ pip install tox
$ tox
También puede ejecutar tox en un subconjunto de entornos:
$ tox -e py38,py39
Tox procesa todo en serie, por lo que puede llevar mucho tiempo probar varios entornos. Para acelerarlo, puede intentar usar una nueva versión paralela de tox llamada detox
. Prueba esto:
$ pip install -U -i http://pypi.testrun.org detox
$ detox
Tox se configura usando un archivo llamado tox.ini
. Es posible que deba editar este archivo si desea agregar nuevos entornos para probar (por ejemplo,
py33
) o si desea modificar las dependencias o la forma en que se ejecutan las pruebas. Para obtener más información sobre el tox.ini
archivo, consulte la Especificación de configuración de toxinas .
Construyendo versiones antiguas de Matplotlib #
Al ejecutar un para ver qué compromiso introdujo un error determinado, es posible que (rara vez) necesite compilar versiones muy antiguas de Matplotlib. Es necesario tener en cuenta las siguientes restricciones:git bisect
Matplotlib 1.3 (o anterior) requiere numpy 1.8 (o anterior).
Probando versiones publicadas de Matplotlib #
Ejecutar las pruebas en una instalación de una versión publicada (p. ej., paquete PyPI o paquete conda) también requiere una configuración adicional.
Nota
Para un usuario final, generalmente no es necesario ejecutar las pruebas en las versiones publicadas de Matplotlib. Los lanzamientos oficiales se prueban antes de publicarse.
Instalar dependencias adicionales #
Instale las dependencias adicionales para realizar pruebas .
Obtener las imágenes de referencia #
Muchas pruebas comparan el resultado de la trama con imágenes de referencia. Las imágenes de referencia no forman parte de las versiones empaquetadas regulares (pip wheels o paquetes conda). Si desea ejecutar pruebas con imágenes de referencia, debe obtener las imágenes de referencia que coincidan con la versión de Matplotlib que desea probar.
Para hacerlo, descargue la distribución
matplotlib-X.Y.Z.tar.gz
de origen correspondiente de PyPI
o, alternativamente, clone el repositorio de git y el archivo . Copie la carpeta a la carpeta
de su instalación de matplotlib para probar. La carpeta de destino correcta se puede encontrar usando:git checkout vX.Y.Z
lib/matplotlib/tests/baseline_images
matplotlib/tests
python -c "import matplotlib.tests; print(matplotlib.tests.__file__.rsplit('/', 1)[0])"
Es necesaria una copia análoga de lib/mpl_toolkits/tests/baseline_images
para la prueba mpl_toolkits
.
Ejecute las pruebas #
Para ejecutar todas las pruebas en su versión instalada de Matplotlib:
python -m pytest --pyargs matplotlib.tests
El alcance del descubrimiento de pruebas se puede reducir a módulos de prueba individuales o incluso a funciones individuales:
python -m pytest --pyargs matplotlib.tests.test_simplification.py::test_clipping