Partager via


Gestion des tests unitaires

Note

Ce contenu s’applique au SDK Power Query hérité dans Visual Studio. Aujourd’hui, le nouveau Kit de développement logiciel (SDK) Power Query dans Visual Studio Code contient une infrastructure de test complète que nous vous encourageons à tester et à en savoir plus.

Pour les connecteurs simples et complexes, l’ajout de tests unitaires est une bonne pratique et vivement recommandée.

Les tests unitaires sont effectués dans le contexte du Kit de développement logiciel (SDK) Power Query de Visual Studio. Chaque test est défini comme un Fact nom, une valeur attendue et une valeur réelle. Dans la plupart des cas, la « valeur réelle » est une expression M qui teste une partie de votre expression.

Considérez une extension qui exporte trois fonctions :

section Unittesting;

shared UnitTesting.ReturnsABC = () => "ABC";
shared UnitTesting.Returns123 = () => "123";
shared UnitTesting.ReturnTableWithFiveRows = () => Table.Repeat(#table({"a"},{{1}}),5);

Ce code de test unitaire est constitué de nombreux faits et d’un ensemble de code commun pour l’infrastructure de test unitaire (ValueToText, Fact, Facts, Facts.Summarize). Le code suivant fournit un exemple de jeu de faits (accédez à UnitTesting.query.pq pour le code commun) :

section UnitTestingTests;

shared MyExtension.UnitTest = 
[
    // Put any common variables here if you only want them to be evaluated once

    // Fact(<Name of the Test>, <Expected Value>, <Actual Value>)
    facts = 
    {
        Fact("Check that this function returns 'ABC'",  // name of the test
            "ABC",                                      // expected value
            UnitTesting.ReturnsABC()                    // expression to evaluate (let or single statement)
        ),
        Fact("Check that this function returns '123'",
            "123",
            UnitTesting.Returns123()
        ),
        Fact("Result should contain 5 rows",
            5,
            Table.RowCount(UnitTesting.ReturnTableWithFiveRows())
        ),
        Fact("Values should be equal (using a let statement)",
            "Hello World",
            let
                a = "Hello World"
            in
                a
        )
    },
    report = Facts.Summarize(facts)
][report];

L’exécution de l’exemple dans Visual Studio évalue tous les Faits et vous fournit un résumé visuel des taux de réussite :

Capture d’écran de la sortie de requête Visual Studio M montrant un exemple de taux de réussite.

L’implémentation de tests unitaires au début du processus de développement du connecteur vous permet de suivre les principes du développement piloté par les tests. Imaginez que vous devez écrire une fonction appelée Uri.GetHost qui retourne uniquement les données de l’hôte à partir d’un URI. Vous pouvez commencer par écrire un cas de test pour vérifier que la fonction effectue correctement la fonction attendue :

Fact("Returns host from URI",
    "https://bing.com",
    Uri.GetHost("https://bing.com/subpath/query?param=1&param2=hello")
),
Fact("Handles port number appropriately",
    "https://bing.com:8080",
    Uri.GetHost("https://bing.com:8080/subpath/query?param=1&param2=hello")
)

D’autres tests peuvent être écrits pour s’assurer que la fonction gère correctement les cas de périphérie.

Une version antérieure de la fonction peut réussir certains tests, mais pas tous les tests :

Uri.GetHost = (url) =>
    let
        parts = Uri.Parts(url)
    in
        parts[Scheme] & "://" & parts[Host]

Capture d’écran de la sortie de requête Visual Studio M où certains tests échouent.

La version finale de la fonction doit réussir tous les tests unitaires. Cette version permet également de s’assurer que les futures mises à jour de la fonction ne suppriment accidentellement aucune de ses fonctionnalités de base.

Capture d’écran de la sortie de requête Visual Studio M où tous les tests réussissent.