Paramétrage des tests unitaires avec pytest

Le paramétrage dans pytest améliore l'efficacité des tests en permettant l'exécution répétée avec différents jeux de données. Deux méthodes principales sont disponibles : l'utilisation directe du décoraetur parametrize et l'exploitation des fixtures paramétrées.

Paramétrage direct avec pytest.mark.parametrize

Cette aprpoche permet de spécifier les données de test sous forme de liste. Les paramètres sont injectés dans la fonction de test à chaque itération.


scenario_data = [
    [5, 8, 13],
    [0, -3, -3],
    [10, 20, 30]
]
@pytest.mark.parametrize('val1, val2, resultat_attendu', scenario_data)
def test_addition(val1, val2, resultat_attendu):
    assert val1 + val2 == resultat_attendu

L'exécution de ce test produit un rapport détaillé pour chaque combinaison de paramètres.

Paramétrage via les fixtures pytest

Les fixtures acceptent un paramètre params pour fournir des données multiples. L'accès aux valeurs se fait via l'attribut request.param.


donnees_fixtures = [
    (3, 4, 12),
    (10, 5, 50),
    (0, 7, 0)
]
@pytest.fixture(params=donnees_fixtures)
def jeu_donnees(request):
    return request.param

def test_multiplication(jeu_donnees):
    multiplicande, multiplicateur, produit = jeu_donnees
    assert multiplicande * multiplicateur == produit

Les fixtures paramétrées sont particulièrement utiles pour configurer des ressources partagées comme des connexions aux bases de données.

Exemple d'intégration avec des sources de données externes

Pour valider des requêtes SQL, on peut extraire les cas de test et la configuration de la base de données depuis un fichier Excel. L'implémentation utilise openpyxl pour la lecture et pymysql pour la connexion.

Voici le contenu du fichier conftest.py :


from openpyxl import load_workbook
import pymysql
import logging

def lire_feuille_excel(nom_feuille="tests"):
    classeur = load_workbook(r".\ressources\cas_tests.xlsx")
    if not classeur:
        return
    feuille_active = classeur.worksheets[0] if nom_feuille == "tests" else classeur.worksheets[1]
    for ligne in feuille_active.iter_rows(min_row=2, values_only=True):
        yield ligne

@pytest.fixture(scope='session', params=lire_feuille_excel('config_bd'))
def connecteur_sql(request):
    logging.info("Initialisation de la connexion SQL")
    config = request.param
    serveur = config[0]
    port_bd = config[1]
    identifiant = config[2]
    secret = config[3]
    nom_base = config[4]
    
    liaison = pymysql.connect(
        host=serveur,
        user=identifiant,
        passwd=secret,
        database=nom_base,
        port=int(port_bd)
    )
    curseur_sql = liaison.cursor()
    
    yield curseur_sql
    
    logging.info("Nettoyage : fermeture de la connexion SQL")
    liaison.close()

@pytest.fixture(params=lire_feuille_excel('tests'))
def jeu_test(request):
    enregistrement = request.param
    logging.info(f"Traitement de l'enregistrement : {enregistrement}")
    yield enregistrement
    logging.info("Finalisation de la fixture jeu_test")

Dans les fichiers de test, ces fixtures peuvent être utilisées pour exécuter les scénarios extraits de l'Excel en combinaison avec la connexion à la base de données.

Étiquettes: pytest fixture parametrize conftest openpyxl

Publié le 4 juin à 16h45