• 4 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 07/10/2017

Ajoutez des tests avec Pytest

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

 

Présentation de Pytest

Pytest est une librairie consacrée aux tests. Son objectif est de rendre l'écriture de code plus intuitive et de faciliter la vie des développeurs !

Afin de pouvoir l'utiliser, vous devez au préalable l'installer. Pour cela, utiliser PyPI :

pip install -U pytest

Vérifiez que Pytest est installé en tapant la commande  pytest  . Pytest va alors lancer tous les tests de notre projet.

 

Comme vous pouvez le voir, aucun test n'est lancé. C'est normal, nous n'en avons pas écrit pour le moment !

Avant de le faire, renommons le fichier  tests.py  en  test_world.py. Pytest va en effet lancer les tests de tous les fichiers qui commencent par  test_  ou qui finissent par  _test. Notre module s'appelant "world", nous complétons le nom du fichier ainsi.

Ecrire un test avec Pytest

Afin de comprendre comment fonctionne Pytest, écrivons un test rapide :

def hello(name):
    return 'Hello ' + 'name'

def test_hello():
    assert hello('Celine') == 'Hello Celine'

Ici, nous avons défini une première fonction qui, lorsqu'elle sera exécutée, renverra 'Hello' et le nom de la personne passée en paramètres.

J'ai écrit une nouvelle fonction, juste en dessous, pour tester si elle fonctionne.

Je commence en la nommant  test_montest  car il s'agit d'un test. A l'intérieur, j'utilise le mot-clé  assert, puis un espace et écris ce que je souhaite tester.

Dans mon cas, je souhaite tester que le résultat de l'exécution de la fonction  hello('Celine')  renvoie bien une valeur égale à la chaîne de caractères "Hello Celine".

Testons !

 

Mince, cela ne fonctionne pas ! Mais Pytest a la bonne idée de nous indiquer la ligne défaillante, ainsi que la différence entre ce qui a été renvoyé par la fonction et ce que nous attendions.

La fonction a renvoyé  Hello name  alors que je souhaitais obtenir  Hello Celine. Hum... 🤔

Je vais voir de nouveau mon code. En effet, j'ai fait une erreur ! Je m'empresse de la corriger.

def hello(name):
    return 'Hello ' + name

def test_hello():
    assert hello('Celine') == 'Hello Celine'

Je relance les tests en entrant la commande  pytest .  

Tout est vert, mes tests sont bien validés !

Les premiers tests de notre projet

Nous allons maintenant écrire nos propres tests à nous !

Le premier va vérifier qu'il est possible de modifier l'attribut  position  d'une instance  Agent. Alors, comment faire ?

Avant tout, nous devons importer le module dans le fichier de test pour pouvoir en utiliser les différents éléments.

Pour cela, ajoutons en haut :

import program.world as script

Créons une instance de la classe Agent, uniquement pour vérifier que le module est bien chargé.

agent = script.Agent('3')

Puis relançons les tests. Rien ne s'affiche. Tout va bien ! 

Ecrivons maintenant le test associé. 

def test_get_position():
    agent = script.Agent(3)
    assert agent.position == 3

Le test passe !

Continuons avec le test suivant.

def test_set_position():
    agent = script.Agent(3)
    agent.position = 5
    assert agent.position == 5

Et ainsi de suite pour tous nos tests qui concernent les attributs !

# - Agent : 
#   - modifier un attribut position
def test_set_position():
    agent = script.Agent(3)
    agent.position = 5
    assert agent.position == 5

#   - récupérer un attribut position
def test_get_position():
    agent = script.Agent(3)
    assert agent.position == 3

#   - assigner un dictionnaire en tant qu'attributs
def test_set_agent_attributes():
    agent = script.Agent(3, agreeableness=1)
    assert agent.agreeableness == 1
    
# - Position :
#   - modifier un attribut longitude_degrees
def test_longitude_degrees():
    position = script.Position(100, 34)
    assert position.longitude_degrees == 100

#   - modifier un attribut latitude_degrees
def test_latitude_degrees():
    position = script.Position(100, 34)
    assert position.latitude_degrees == 34

Debuguer Pytest

Le test qui vérifie que la longitude est bien l'attribut  longitude_degrees  convertie en radian peut être un peu problématique. En effet, j'aimerais connaitre la valeur que je souhaite tester.

#   - récupérer une longitude
def test_longitude():
    position = script.Position(100, 33)
    assert position.longitude == ??????

#   - récupérer une latitude
def test_latitude():
    position = script.Position(100, 33)
    assert position.latitude == ???????

Pour cela, rien de mieux qu'un petit  print()  !

#   - récupérer une longitude
def test_longitude():
    position = script.Position(100, 33)
    print('longitude', position.longitude)
    # assert position.longitude == ??????

Mais si vous lancez les tests avec la commande  pytest  , rien ne s'affichera. Vous devez ajouter un  -s  à la fin pour que s'impriment les  print(), comme ceci :  pytest -s.

 

Nous pouvons désormais écrire : 

#   - récupérer une longitude
def test_longitude():
    position = script.Position(100, 33)
    # print('longitude', position.longitude)
    assert position.longitude == 1.7453292519943295

#   - récupérer une latitude
def test_latitude():
    position = script.Position(100, 33)
    # print('latitude', position.latitude)
    assert position.latitude == 0.5759586531581288

 

Tester une exception

Notre classe  Position  intègre déjà un  assert  pour vérifier les valeurs de la longitude et de la latitude.

Si nous essayons de créer une instance de la classe Position avec une longitude non comprise entre -180 et 180, Python renverra une  AssertionError

C'est pourquoi nous n'allons pas tester que le code est censé échouer mais bien qu'il renvoie une erreur dans ce cas précis.

Comment le savoir ? En lançant un test avec des valeurs non attendues et en regardant l'exception levée !

Comment faire ?

Pytest propose une méthode, raises(SomeException), qui spécifie que nous nous attendons à ce que le programme lève une erreur. Afin de pouvoir l'utiliser, il nous faut auparavant importer le module  pytest. Ajoutez donc ceci en haut de votre fichier de tests :

import pytest

Puis nous pouvons écrire le test suivant :

def test_latitude_degrees_range():
    with pytest.raises(AssertionError):
        position = script.Position(100, 100)

 

A vous de jouer !

Cliquez sur ce lien 

 

Code du chapitre

Retrouvez l'intégralité du code de ce chapitre sur Github ! 

Exemple de certificat de réussite
Exemple de certificat de réussite