Test n.
Matplotlib utilizza il framework pytest .
I test sono in lib/matplotlib/tests
e le personalizzazioni dell'infrastruttura di test pytest sono in matplotlib.testing
.
Requisiti #
Per eseguire i test sarà necessario configurare Matplotlib per lo sviluppo . Nota in particolare le dipendenze aggiuntive per i test.
Nota
Supponiamo che tu voglia eseguire i test in una configurazione di sviluppo.
Sebbene sia possibile eseguire i test su una normale versione installata di Matplotlib, questo è un caso d'uso molto meno comune. Hai ancora bisogno delle dipendenze aggiuntive per il test. Devi inoltre ottenere le immagini di riferimento dal repository, perché non sono distribuite con pacchetti Matplotlib predefiniti.
Esecuzione dei test #
Nella directory principale del tuo repository di sviluppo esegui:
python -m pytest
pytest può essere configurato tramite molti parametri della riga di comando . Alcuni particolarmente utili sono:
|
Sii più prolisso |
|
Esegui test in parallelo su NUM processi (richiede pytest-xdist ) |
|
Non acquisire stdout |
Per eseguire un singolo test dalla riga di comando, puoi fornire un percorso file, facoltativamente seguito dalla funzione separata da due punti, ad esempio (i test non devono essere installati, ma Matplotlib dovrebbe esserlo):
pytest lib/matplotlib/tests/test_simplification.py::test_clipping
Scrivere un semplice test #
Molti elementi di Matplotlib possono essere testati utilizzando test standard. Ad esempio, ecco un test da matplotlib/tests/test_basic.py
:
def test_simple():
"""
very simple example test
"""
assert 1 + 1 == 2
Pytest determina quali funzioni sono test cercando i file i cui nomi iniziano con "test_"
e quindi all'interno di quei file le funzioni che iniziano con
"test"
o le classi che iniziano con "Test"
.
Alcuni test hanno effetti collaterali interni che devono essere ripuliti dopo la loro esecuzione (come figure create o modificate rcParams
). Il dispositivo pytest
matplotlib.testing.conftest.mpl_test_settings
li pulirà automaticamente; non c'è bisogno di fare altro.
Dati casuali nei test #
I dati casuali sono un modo molto conveniente per generare dati per esempi, tuttavia la casualità è problematica per i test (poiché i test devono essere deterministici!). Per ovviare a questo, impostare il seme in ogni test. Per il generatore di numeri casuali predefinito di numpy utilizzare:
import numpy as np
rng = np.random.default_rng(19680801)
e quindi utilizzare rng
quando si generano i numeri casuali.
Il seme è il compleanno di John Hunter.
Scrivere un test di confronto delle immagini #
Scrivere un test basato su immagini è solo leggermente più difficile di un semplice test. La considerazione principale è che devi specificare le immagini "di base", o previste, nel image_comparison
decoratore. Ad esempio, questo test genera una singola immagine e la testa automaticamente:
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 prima volta che viene eseguito questo test, non ci sarà alcuna immagine di base da confrontare, quindi il test avrà esito negativo. Copia le immagini di output (in questo caso
result_images/test_lines/test_line_dashes.png
) nella sottodirectory corretta di baseline_images
tree nella directory di origine (in questo caso lib/matplotlib/tests/baseline_images/test_lines
). Metti questo nuovo file sotto il controllo della revisione del codice sorgente (con ). Quando si eseguono nuovamente i test, ora dovrebbero essere superati.git add
Le immagini di base occupano molto spazio nel repository Matplotlib. Un approccio alternativo per i test di confronto delle immagini consiste nell'utilizzare il
check_figures_equal
decoratore, che dovrebbe essere utilizzato per decorare una funzione prendendo due Figure
parametri e disegnando le stesse immagini sulle figure utilizzando due metodi diversi (il metodo testato e il metodo della linea di base). Il decoratore provvederà all'allestimento delle figure e poi raccoglierà i risultati disegnati e li confronterà.
Vedere la documentazione di image_comparison
e
check_figures_equal
per ulteriori informazioni sul loro utilizzo.
Creazione di un nuovo modulo in matplotlib.tests #
Cerchiamo di mantenere i test classificati in base al modulo principale che stanno testando. Ad esempio, i test relativi al mathtext.py
modulo sono in formato test_mathtext.py
.
Utilizzo delle azioni GitHub per CI #
GitHub Actions è un sistema CI ospitato "nel cloud".
GitHub Actions è configurato per ricevere notifiche di nuovi commit nei repository GitHub e per eseguire build o test quando vede questi nuovi commit. Cerca un file YAML .github/workflows
per vedere come testare il progetto.
GitHub Actions è già abilitato per il repository Matplotlib GitHub principale , ad esempio vedere i flussi di lavoro dei test .
Le azioni GitHub dovrebbero essere abilitate automaticamente per il tuo fork Matplotlib personale una volta che i file del flusso di lavoro YAML sono al suo interno. In genere non è necessario esaminare questi flussi di lavoro, poiché verrà testata qualsiasi richiesta pull inviata al repository Matplotlib principale. Il flusso di lavoro dei test viene ignorato nei repository biforcuti, ma è possibile attivare un'esecuzione manualmente dall'interfaccia Web di GitHub .
Puoi vedere i risultati delle azioni GitHub su https://github.com/your_GitHub_user_name/matplotlib/actions -- ecco un esempio .
Usando tossico #
Tox è uno strumento per eseguire test su più ambienti Python, comprese più versioni di Python (ad esempio, 3.7, 3.8) e persino diverse implementazioni di Python (ad esempio, CPython, PyPy, Jython, ecc.), purché tutte queste versioni siano disponibile sul $PATH del tuo sistema (considera di utilizzare il tuo gestore di pacchetti di sistema, ad esempio apt-get, yum o Homebrew, per installarli).
tox rende facile determinare se la tua copia di lavoro ha introdotto regressioni prima di inviare una richiesta pull. Ecco come usarlo:
$ pip install tox
$ tox
Puoi anche eseguire tox su un sottoinsieme di ambienti:
$ tox -e py38,py39
Tox elabora tutto in serie, quindi può richiedere molto tempo per testare diversi ambienti. Per velocizzarlo, potresti provare a utilizzare una nuova versione parallelizzata di tox chiamata detox
. Prova questo:
$ pip install -U -i http://pypi.testrun.org detox
$ detox
Tox è configurato utilizzando un file chiamato tox.ini
. Potrebbe essere necessario modificare questo file se si desidera aggiungere nuovi ambienti ai test (ad es.
py33
) o se si desidera modificare le dipendenze o il modo in cui vengono eseguiti i test. Per ulteriori informazioni sul tox.ini
file, vedere Tox Configuration Specification .
Costruire vecchie versioni di Matplotlib #
Quando si esegue a per vedere quale commit ha introdotto un determinato bug, potrebbe (raramente) essere necessario creare versioni molto vecchie di Matplotlib. Occorre tenere conto dei seguenti vincoli:git bisect
Matplotlib 1.3 (o precedente) richiede numpy 1.8 (o precedente).
Test delle versioni rilasciate di Matplotlib #
Anche l'esecuzione dei test su un'installazione di una versione rilasciata (ad es. pacchetto PyPI o pacchetto conda) richiede una configurazione aggiuntiva.
Nota
Per un utente finale, di solito non è necessario eseguire i test sulle versioni rilasciate di Matplotlib. Le versioni ufficiali vengono testate prima della pubblicazione.
Installa dipendenze aggiuntive #
Installa le dipendenze aggiuntive per i test .
Ottieni le immagini di riferimento #
Molti test confrontano il risultato del grafico con le immagini di riferimento. Le immagini di riferimento non fanno parte delle normali versioni confezionate (pip wheels o conda packages). Se desideri eseguire test con immagini di riferimento, devi ottenere le immagini di riferimento corrispondenti alla versione di Matplotlib che desideri testare.
Per fare ciò, scarica la distribuzione sorgente corrispondente
matplotlib-X.Y.Z.tar.gz
da PyPI
o, in alternativa, clona il repository git e . Copia la cartella nella cartella
dell'installazione di matplotlib da testare. La cartella di destinazione corretta può essere trovata utilizzando:git checkout vX.Y.Z
lib/matplotlib/tests/baseline_images
matplotlib/tests
python -c "import matplotlib.tests; print(matplotlib.tests.__file__.rsplit('/', 1)[0])"
Un'analoga copiatura di lib/mpl_toolkits/tests/baseline_images
è necessaria per il testing mpl_toolkits
.
Esegui i test #
Per eseguire tutti i test sulla versione installata di Matplotlib:
python -m pytest --pyargs matplotlib.tests
L'ambito del test discovery può essere ristretto a singoli moduli di test o anche a singole funzioni:
python -m pytest --pyargs matplotlib.tests.test_simplification.py::test_clipping