Analysez vos tests #Python avec pytest‑monitor

Posté par  (site Web personnel) . Édité par Ysabeau, Davy Defaud et palm123. Modéré par Ysabeau. Licence CC By‑SA.
Étiquettes :
22
8
avr.
2020
Python

Pytest‑monitor est une toute nouvelle extension pour Pytest, le cadriciel de test du langage Python, qui vous permet d’analyser l’utilisation des ressources de la machine exécutant les tests.

Logo Pytest-monitor

Pour le moment, trois ressources sont surveillées et historisés par cette extension :

  • le temps d’exécution ;
  • la consommation mémoire ;
  • l’utilisation du processeur.

Chaque résultat étant attaché à un environnement d’exécution, il est facile de comparer l’impact du matériel utilisé pour faire tourner vos tests.

Pytest‑monitor est particulièrement utile lors de mises à jour par exemple, qu’elles soient matérielles ou logicielles. Vous pourrez apprécier quel a été l’impact d’une montée de version d’une dépendance externe sur laquelle vous n’avez pas le contrôle, ou encore le changement d’interpréteur ou de la machine faisant tourner les tests.

C’est aussi appréciable en intégration continue de pouvoir voir l’impact des modifications du code sur les tests et d’avoir une idée de l’incidence sur les performances.

Utilisation et mode de fonctionnement

À partir du moment où vous avez au minimum un Python 3.5 et Pytest 4.4, l’installation se fait en une ligne de commande via les classiques canaux :

  • Anaconda : conda install pytest-monitor -c https://conda.anaconda.org/conda-forge ;
  • pip : pip install pytest-monitor.

Ensuite, pytest‑monitor est actif par défaut dès que vous lancez vos (py)tests, pas besoin d’ajouter du code ou des commentaires. L’extension va faire une « photo » des ressources utilisées avant l’exécution des tests puis va se baser sur les routines système pour récupérer les informations et minimiser son propre impact sur les mesures :

  • psutil, pour l’utilisation processeur ;
  • memory_profiler, pour la consommation mémoire.

Certes, la prise des mesures aura un impact sur les performances, mais il reste contenu et négligeable par rapport aux tests eux‑mêmes.

Au premier lancement, une base SQLite est créée dans le répertoire d’exécution. Celle‑ci contient trois tables : une pour stocker la définition de l’environnement (processeur, mémoire disponible, nom de la machine, système d’exploitation, version de Python, etc.), une pour la session (tâche en charge des tests avec horodatage) et la dernière les résultats proprement dits pour chaque mesure (horodatés et reliés à un environnement et à une session). Dans une future version, il sera possible de pousser les résultats directement sur un serveur qui pourra les centraliser. La portée des résultats peut se faire au niveau fonction, module, classe ou encore session. De plus, il est possible d’influer sur la manière dont sont surveillés les tests, principalement avec des marqueurs :

  • désactivation locale (via un commentaire) ou globale de la mesure de la performance des tests ;
  • paramétrage de certains tests, afin de pouvoir rejouer certaines fonctions avec des jeux de paramètres différents.

Pytest‑monitor est très peu intrusif sur les tests, preuve en cet exemple issu de la documentation. Vous n’avez quasiment rien à ajouter pour obtenir des résultats exploitables :

import pytest
import time

# Tests are run and monitored by default: no boilerplate code needed
def test_sleep1():
    time.sleep(1)

# Run as a test, but do not monitor:
@pytest.mark.monitor_skip_test
def test_sleep2():
    time.sleep(2)

# Support for parametrized tests (monitored by default):
@pytest.mark.parametrize(('range_max', 'other'), [(10, "10"), (100, "100"), (1000, "1000"), (10000, "10000")])
def test_heavy(range_max, other):
    assert len(['a' * i for i in range(range_max)]) == range_max

Contributions

Le code source, sous licence MIT, est disponible sur un dépôt GitHub et son auteur, Jean‑Sébastien Dieu, est ouvert aux contributions externes.

Bons tests !

Aller plus loin

  • # Exécution en parallèle

    Posté par  . Évalué à 2.

    Je ne suis pas (encore) utilisateur de ce cadriciel pytest mais pour un projet que je dois récupérer je m'y intéresse de près. Et en particulier tout ce qui concerne la surveillance des ressources consommées par les tests. Autant dire que cette dépêche tombe à point, merci !

    Point important à mes yeux, pytest-monitor gère-t-il l'exécution de tests en parallèle ?
    Est-ce transparent ? Faut-il une attention particulière ?
    Je pense à des extensions comme pytest-xdist ou pytest-parallel. (D'ailleurs si quelqu'un peut me faire un retour sur ces deux extensions, je prends !)

    • [^] # Re: Exécution en parallèle

      Posté par  . Évalué à 3.

      Utilisant pytest sur un projet Django je peux au moins te donner te faire part de mon expérience avec pytest-xddist.

      En prenant en considération le fait que mes tests impliquent souvent des appels à la base de données, l'utilisation de pytest-xdist en lançant 6 threads en parallèle sur un processeur hexa-coeurs me permet de passer d'environ 84 secondes pour exécuter 193 tests à 40 secondes.

    • [^] # Re: Exécution en parallèle

      Posté par  . Évalué à 2.

      Hello

      Oui, pytest-xdist/parallel sont supportés, mais par le biais d'un server dédié.
      C'est un projet à part qui va bientôt voir le jour, mais il est tout à fait possible de fournir son propre serveur.

  • # Pytest ?

    Posté par  (site Web personnel) . Évalué à 5.

    Je ne suis que de très loin ce qu'il se passe dans l'écosystème Python, mais je viens de voir passer le départ de deux importants contributeurs à Pytest (https://mail.python.org/pipermail/pytest-dev/2020-April/004939.html et https://mail.python.org/pipermail/pytest-dev/2020-April/004940.html). Est-ce que quelqu'un aurait plus d'informations à ce sujet ?

    • [^] # Re: Pytest ?

      Posté par  . Évalué à 3.

      Hello

      Je ne sais pas dans quelle mesure cela va affecter le projet, mais les échanges étaient tendues depuis quelques temps avec 1 des mainteneurs, d'où leur retrait. Le projet est tout de même très populaire. Je ne pense pas qu'il sera affecté à court terme voir moyen terme.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.