Guilhem Bourgoin Développeur Symfony Freelance
Les tests behat par la
pratique
Présentation AFUP Montpellier, 21/05/2019
Introduction
Test BDD
=> BDD: Behavior Driven Development
=> Tests fonctionnels
Scénarios de tests axés sur le fonctionnel
=> Écrit en Gherkin
=> Given [...] When [...] Then [...]
En théorie
=> Scénarios lisibles par un humain
=> Peut être écrit par un PO
Behat
Isolé
=> Ne doit pas dépendre du résultat du test précédent
=> Ne doit pas dépendre de services externes
Répétable
Automatisable
Rapide à exécuter
Qu’est-ce qu’un bon test logiciel ?
Test “boite noire”
=> Ne tient pas compte des détails techniques et architecturaux
=> Se base uniquement sur les points d’entrées et de sorties de l’application
Scénarios de tests axés sur le fonctionnel
=> Vrais scénarios utilisateurs
=> Peut tester plusieurs choses dans un même scénario
Nécessite de mocker les services externes (bases de données, API, etc)
Lance l’application en mode “test”
Le concept des tests behat
● Tester tous les cas possibles
● Mesurer la couverture de code
● Valider l’architecture de l’application
behat ne doit pas servir à :
● Valider fonctionnellement l'application
● Servir de tests de non régression
● Servir de documentation technique (exemples d’utilisations)
Vient en complément des tests unitaires, ne remplace pas un QA !
behat doit servir à :
Installation et Best Practices
Installation
1 composer require --dev friends-of-behat/symfony-extension:^2.0
composer require --dev behatch/contexts
config/packages/test/doctrine.yaml :
doctrine.dbal.driver: 'pdo_sqlite’
doctrine.dbal.url: 'sqlite:///%kernel.project_dir%/data/app-behat.db’
2
3
Backoffice
Backoffice
Mock
Mock
Mink
behatch
Reset de la base à chaque scénario
Gestion de la base de données
Tous les services externes doivent être mockés
=> déclaration dans services_test.yaml
Les mocks
Les mocks sont paramétrés dans chaque scénario de test
=> test.feature
=> GuzzleContext.php
Les mocks - Guzzle
Les messages sont stockés au lieu d’être envoyés dans la file AMQP
=> GuzzleContext.php
Les mocks - AMPQ
Les scénarios
Format d’un scénario
Description de la User
Story
Prérequis au test
Lancement de l’action à
tester
Vérification du résultat
Solution 1 : Les fixtures (AliceBundle, DoctrineFixturedBundle, etc)
+ Facile et rapide à mettre en place
- Jeu de test commun à tous les tests
Solution 2 : Ecrire les données nécessaire dans chaque scénarios
+ Indépendance des données de test
- Plus long à mettre en place
Les données de test
1
2
Givens
When
Avec Behatch
When
Then
Avec Behatch
Exemple
complet
Retour d’expériences
Chez ReputationVIP (Lyon)
=> Seuls tests présents : ont permis de stabiliser l’application
=> “Evangélisation” de l’IT sur les tests et les bonnes pratiques associées
=> Réticence du QA sur place
=> Temps d'exécution : 20 minutes, intégrés à GitlabCI
Sur beIN Sports
=> Tests déjà présents
=> Utilisation des Fixtures Alice
=> Temps d'exécution : 45 minutes, intégrés à TravisCI
=> A permit un de faire évoluer l’API sereinement
REX sur les tests behat
Chez Matooma (Montpellier)
=> Seuls tests présents sur le backoffice
=> Mis en place dès le début du projet
=> Stabilité de l’application (entre autre grâce aux tests behat)
=> Temps d'exécution : 15 minutes (pour le moment)
REX des tests behat
Pour aller plus loin
Faire VRAIMENT écrire les scénarios par votre PO
=> Du jamais vu...
Utiliser les mêmes scénarios mais sur deux points d’entrés
=> Sur l’API via behatch
=> Sur le front grâce à Mink
Une extension behat pour écrire des Givens
=> En cours de dev...
Evolutions possibles
Conclusion
+
L’écriture des scénarios de tests est facile
Permet de tester rapidement la plupart
des fonctionnalités
Peut (doit !) être intégré à un CI
Sert de tests de non régression
-
La doc de behat n’est pas très fournie
Le coût de mise en place est parfois un peu
long
Le temps d'exécution est souvent long
Guilhem Bourgoin Développeur Symfony Freelance
Merci :)
A vos questions !
Guilhem Bourgoin
Développeur Symfony Freelance

Les tests behat par la pratique

  • 1.
    Guilhem Bourgoin DéveloppeurSymfony Freelance Les tests behat par la pratique Présentation AFUP Montpellier, 21/05/2019
  • 2.
  • 3.
    Test BDD => BDD:Behavior Driven Development => Tests fonctionnels Scénarios de tests axés sur le fonctionnel => Écrit en Gherkin => Given [...] When [...] Then [...] En théorie => Scénarios lisibles par un humain => Peut être écrit par un PO Behat
  • 4.
    Isolé => Ne doitpas dépendre du résultat du test précédent => Ne doit pas dépendre de services externes Répétable Automatisable Rapide à exécuter Qu’est-ce qu’un bon test logiciel ?
  • 5.
    Test “boite noire” =>Ne tient pas compte des détails techniques et architecturaux => Se base uniquement sur les points d’entrées et de sorties de l’application Scénarios de tests axés sur le fonctionnel => Vrais scénarios utilisateurs => Peut tester plusieurs choses dans un même scénario Nécessite de mocker les services externes (bases de données, API, etc) Lance l’application en mode “test” Le concept des tests behat
  • 6.
    ● Tester tousles cas possibles ● Mesurer la couverture de code ● Valider l’architecture de l’application behat ne doit pas servir à :
  • 7.
    ● Valider fonctionnellementl'application ● Servir de tests de non régression ● Servir de documentation technique (exemples d’utilisations) Vient en complément des tests unitaires, ne remplace pas un QA ! behat doit servir à :
  • 8.
  • 9.
    Installation 1 composer require--dev friends-of-behat/symfony-extension:^2.0 composer require --dev behatch/contexts config/packages/test/doctrine.yaml : doctrine.dbal.driver: 'pdo_sqlite’ doctrine.dbal.url: 'sqlite:///%kernel.project_dir%/data/app-behat.db’ 2 3
  • 10.
  • 11.
  • 12.
    Reset de labase à chaque scénario Gestion de la base de données
  • 13.
    Tous les servicesexternes doivent être mockés => déclaration dans services_test.yaml Les mocks
  • 14.
    Les mocks sontparamétrés dans chaque scénario de test => test.feature => GuzzleContext.php Les mocks - Guzzle
  • 15.
    Les messages sontstockés au lieu d’être envoyés dans la file AMQP => GuzzleContext.php Les mocks - AMPQ
  • 16.
  • 17.
    Format d’un scénario Descriptionde la User Story Prérequis au test Lancement de l’action à tester Vérification du résultat
  • 18.
    Solution 1 :Les fixtures (AliceBundle, DoctrineFixturedBundle, etc) + Facile et rapide à mettre en place - Jeu de test commun à tous les tests Solution 2 : Ecrire les données nécessaire dans chaque scénarios + Indépendance des données de test - Plus long à mettre en place Les données de test 1 2
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
    Chez ReputationVIP (Lyon) =>Seuls tests présents : ont permis de stabiliser l’application => “Evangélisation” de l’IT sur les tests et les bonnes pratiques associées => Réticence du QA sur place => Temps d'exécution : 20 minutes, intégrés à GitlabCI Sur beIN Sports => Tests déjà présents => Utilisation des Fixtures Alice => Temps d'exécution : 45 minutes, intégrés à TravisCI => A permit un de faire évoluer l’API sereinement REX sur les tests behat
  • 26.
    Chez Matooma (Montpellier) =>Seuls tests présents sur le backoffice => Mis en place dès le début du projet => Stabilité de l’application (entre autre grâce aux tests behat) => Temps d'exécution : 15 minutes (pour le moment) REX des tests behat
  • 27.
  • 28.
    Faire VRAIMENT écrireles scénarios par votre PO => Du jamais vu... Utiliser les mêmes scénarios mais sur deux points d’entrés => Sur l’API via behatch => Sur le front grâce à Mink Une extension behat pour écrire des Givens => En cours de dev... Evolutions possibles
  • 29.
    Conclusion + L’écriture des scénariosde tests est facile Permet de tester rapidement la plupart des fonctionnalités Peut (doit !) être intégré à un CI Sert de tests de non régression - La doc de behat n’est pas très fournie Le coût de mise en place est parfois un peu long Le temps d'exécution est souvent long
  • 30.
    Guilhem Bourgoin DéveloppeurSymfony Freelance Merci :) A vos questions ! Guilhem Bourgoin Développeur Symfony Freelance