Les tests fonctionnels sont destinés à valider que le comportement fonctionnel de l’application est conforme à la spécification en simulant les actions de l'utilisateur de manière automatique. Ainsi, les tests fonctionnels sont implémentés pour s’assurer que les fonctionnalités et les services mis à disposition fonctionneront correctement au moment de leur utilisation. Par exemple, vous vérifierez qu’un utilisateur peut s'inscrire, se connecter, modifier son profil, changer son mot de passe, se déconnecter…
Voici les différentes étapes qu’il faut suivre pour mettre en place un test fonctionnel :
Déterminer la fonctionnalité à tester : le cas nominal ou un cas d’erreur.
Configurer les données d’entrée selon les exigences de la spécification.
Fixer les paramètres de sortie attendus selon les exigences de la spécification.
Exécuter le test.
Comparer les valeurs de sortie du test avec les valeurs de sortie fixées pour valider le test.
Testez une application web
Nous allons voir dans ce chapitre comment mettre en place un test fonctionnel dans le cas d’une application web. Nous allons donc devoir connaître au minimum le contenu de la réponse HTTP attendue pour chaque fonctionnalité.
Voici les différentes étapes à suivre dans le cas d’une application web :
Créer un client HTTP à l’aide d’un webdriver.
Envoyer une requête HTTP sur la page que l’on souhaite tester.
Récupérer le contenu de la réponse HTTP.
Vérifier que la page et les données sont conformes à la spécification.
Comment faire ?
Quand vous faites quelques recherches sur Internet, vous pouvez voir que le mot Selenium est souvent mentionné. C’est parfait, car c’est exactement ce framework que nous allons utiliser pour faire nos tests fonctionnels.
Selenium est l’un des outils de tests automatisés les plus populaires car le framework est ultra flexible :
Les tests Selenium peuvent être écrits avec n’importe quel langage de programmation.
Les tests peuvent être exécutés sur n’importe quelle plateforme de système d’exploitation.
Les tests peuvent être implémentés sur différents navigateurs.
Le framework peut être associé à d’autres outils de test.
Configurez Selenium
Afin de pouvoir utiliser Selinum, vous devez au préalable l'installer. Pour cela, utilisez PyPI en exécutant la commande suivante dans le terminal :
pip install selenium
Le framework nécessite aussi l’installation d’un pilote pour s’interfacer avec un navigateur web tel que Chrome, Firefox, Edge ou Safari. Chaque navigateur aura son propre pilote. Voici les liens pour télécharger le pilote en fonction de votre navigateur :
Vous pouvez mettre de côté le webdriver que vous avez téléchargé grâce au lien ci-dessus, nous verrons dans la suite du cours où copier l'exécutable dans le projet. Si vous avez besoin de plus de détails, vous pouvez lire la documentation officielle.
Écrivez un test fonctionnel
Reprenons le projet OC-commerce avec le framework Django pour mettre en place un premier test fonctionnel – vous pourrez ensuite voler de vos propres ailes pour faire la suite des tests.
Vous devez tout d’abord créer un package qui contiendra le pilote que vous avez téléchargé pour votre navigateur et l’ensemble des modules de test que vous allez implémenter.
Vous pouvez par exemple créer un packagefunctional_tests
dans l’arborescence de test.
Ensuite, vous allez pouvoir créer un premier module de tests qui contiendra les tests concernant les fonctionnalités d’authentification, que nous nommeronstest_authentification.py
.
Vous devez avoir l’arborescence suivante maintenant :
L’ensemble des tests fonctionnels seront implémentés comme des méthodes d’une classe qui hérite deStaticLiveServerTestCase
. Voici un test qui permet d’ouvrir Chrome sur la page d’accueil de notre application, et qui permet de vérifier que tout fonctionne correctement avec le webdriver.
from selenium import webdriver
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
import time
class TestAuthentification(StaticLiveServerTestCase):
def test_open_chrome_window(self):
self.browser = webdriver.Chrome("tests/functional_tests/chromedriver")
self.browser.get(self.live_server_url)
time.sleep(30)
self.browser.close()
Vous pouvez maintenant exécuter la commande suivante sur le terminal pour lancer l’ensemble des tests :python manage.py test
.
Waouh !!! La page Chrome s’ouvre comme par magie !
C’est bien beau d’ouvrir des pages web avec Selenium, mais qu’est-ce qu’on peut faire pour tester nos fonctionnalités ?
Nous allons maintenant créer un test fonctionnel qui permet de vérifier si un nouvel utilisateur peut s'inscrire sur l’application. Pour cela, nous aurons besoin d’accéder à la page d’inscription, et ensuite de remplir le formulaire. Heureusement, le framework Selenium fournit des fonctions qui permettent de trouver les éléments à remplir et de valider le formulaire.
Voici le test fonctionnel qui permet de tester l’inscription d’un utilisateur :
from selenium import webdriver
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from django.urls import reverse
class TestAuthentification(StaticLiveServerTestCase):
def test_signup(self):
#Ouvrir le navigateur avec le webdriver
self.browser = webdriver.Chrome("tests/functional_tests/chromedriver")
self.browser.get(self.live_server_url + reverse("signup"))
fname = self.browser.find_element_by_id("fname")
fname.send_keys("Ranga")
lname = self.browser.find_element_by_id("lname")
lname.send_keys("Gonnage")
username = self.browser.find_element_by_id("username")
username.send_keys("rgonnage")
email = self.browser.find_element_by_id("email")
email.send_keys("test@test.com")
password1 = self.browser.find_element_by_id("pass")
password1.send_keys("ranga12345")
password2 = self.browser.find_element_by_id("re_pass")
password2.send_keys("ranga12345")
agree_term = self.browser.find_element_by_id("agree-term")
agree_term.click()
signup = self.browser.find_element_by_id("signup")
signup.click()
self.assertEqual(self.browser.find_element_by_tag_name('h2').text, "Log In")
self.assertEqual(self.browser.current_url, self.live_server_url + reverse("login"))
#Fermer le navigateur
self.browser.close()
Voyons le détail de quelques lignes du code :
driver.get()
: permet de naviguer vers un lien en passant une URL en paramètre (voir la documentation : Navigating).driver.find_element_by_tag_name()
: localise un élément d’une page à l’aide de son Id. Cependant, il existe d’autres fonctions qui permettent de trouver des éléments sur une page (voir la documentation : Locating elements).element.send_keys()
: remplit du texte ou simule une touche sur le clavier avecsend_keys()
sur l’élément sélectionné.element.click()
: simule le clic de la souris sur un élément.
D’une part, la première assertion vérifie que nous sommes correctement redirigés vers la page de connexion, en vérifiant que le titre dans la baliseh2
correspond àLog In
. D’autre part, la deuxième assertion vérifie que l’URL courante correspond à celle de la page de connexion.
À vous de jouer !
Maintenant que nous avons vu comment mettre en place un test fonctionnel à l’aide de Selenium, je vous propose de continuer sur cette bonne lancée et d’implémenter les tests fonctionnels suivants :
Se connecter à l’application.
Ouvrir le modal d’un produit.
Ajouter un produit aux favoris.
Supprimer un produit des favoris.
Se déconnecter de l’application.
Accéder aux informations du profil.
N’hésitez pas à ajouter encore plus de tests si vous avez des idées, car il en reste plein d’autres à implémenter.
Retrouvez une proposition de correction sur GitHub !
En résumé
Avant de pouvoir utiliser Selenium, vous devez télécharger un webdriver en fonction de votre navigateur.
Les tests fonctionnels permettent de s'assurer que les fonctionnalités de l’application sont conformes à la spécification.
Le framework Selenium est utilisé pour automatiser les tests fonctionnels des applications web.
Le framework fournit des fonctions qui permettent de naviguer et d’interagir avec l’application web afin de vérifier son comportement.
Ce chapitre n’était pas évident, surtout avec la configuration de Selenium, mais vous avez pu voir à quel point le framework est puissant ! Ne vous inquiétez pas, le prochain framework que vous allez voir est beaucoup plus simple à utiliser. Rendez-vous dans le prochain chapitre pour voir les tests de performance.