La performance devrait être testée comme n'importe quelle fonctionnalité de votre application. Pouvoir écrire des tests qui seront exécutés pendant une analyse de la performance est une autre des possibilités offertes par Blackfire.io.
Par exemple, nous pourrions vérifier que le temps d'exécution d'un script PHP ne consomme pas plus de 10 Mb : main.memory < 10 Mb
.
Toutes les métriques sont accessibles :
count : le nombre d'appels de la fonction ;
wall_time : le temps complet d'exécution ;
cpu_time : le temps processeur de la fonction ;
memory : la mémoire consommée par la fonction ;
peak_memory : le pic de mémoire utilisée par la fonction ;
network_in : la quantité de données entrantes (réseau) ;
network_out : la quantité de données sortantes (réseau) ;
io : la quantité de données sur le système de fichiers.
Comme tous les frameworks de type xUnit, les assertions sont regroupées en tests. Les tests seront écrits en YAML, dans un fichier nommé .blackfire.yml qui doit être à la racine de votre projet.
Le fichier Blackfire.yml
Commençons avec un test tout simple. Créez le fichier .blackfire.yml à la racine du projet de démonstration de Symfony que nous avons utilisé dans les précédents cours, avec le contenu suivant :
# .blackfire.yml
tests:
"Toutes les pages sont rapides":
path: "/.*"
assertions:
- main.wall_time < 60ms
- main.memory < 2Mb
Puis déclenchez une analyse à l'aide de Companion. Vous remarquerez qu'une information supplémentaire apparaît dans la barre d'information affichée :
Vous pouvez cliquer sur la petite croix d'échec pour contrôler ce qu'il s'est passé :
En mode premium, les "Assertions" sont disponibles. Si un fichier .blackfire.yml est trouvé à la racine de l'application, alors les assertions seront exécutées et le rapport sera disponible dans cet onglet. Nous voyons ici que l'application consomme un petit peu plus de mémoire que prévu. Pour être honnête, cette valeur est certainement trop petite pour cette application. Mettez à jour la valeur limite de mémoire vive consommée et relancez une analyse : tout passe, parfait !
Métriques spécifiques à l'écosystème PHP
Il n'est pas possible d'écrire des assertions spécifiques à des fonctions appelées lors de l'analyse d'un script PHP. Mais pour les projets les plus populaires, tels que Magento, Drupal, Wordpress ou encore Zend, de nombreuses métriques sont disponibles dans la documentation.
Puisque nous utilisons un projet Symfony avec Twig, ajoutons quelques tests plus spécifiques :
# .blackfire.yml
tests:
"Toutes les pages sont rapides":
path: "/.*"
assertions:
- main.wall_time < 60ms
- main.memory < 2Mb
"Tests spécifiques à Symfony":
path: "/.*"
assertions:
- metrics.symfony.kernel.debug.count == 0 # en mode production
- metrics.symfony.yaml.reads.count == 0 # mise en cache du YAML
"Tests spécifiques à Twig":
path: "/.*"
assertions:
- metrics.twig.compile.count == 0 # Pas de compilation en production
- metrics.twig.attributes.get.count < 30 # Pas trop de logique dans les templates
Et... le rapport correspondant ! Génial, n'est-ce pas ? :soleil:
En résumé
Avec le plan Premium de Blackfire, il est possible d'écrire des tests de performance qui seront exécutés lors du déclenchement de l'analyse. Pour cela :
il faut compléter un fichier appelé .blackfire.yml qui doit se trouver à la racine de l'application profilée ;
nous avons accès à toutes les métriques précédemment récoltées...
... et à de nombreuses métriques spécifiques aux librairies et projets PHP les plus populaires !
Malgré tout, cela ne règle pas le problème précédent : comment vérifier que nous n'avons pas entraîné de régressions entre deux analyses ? Aussi, nous profiterons du chapitre suivant pour aborder les bonnes pratiques de testing !