Gestion de tests unitaires
Remarque
Ce contenu s’applique au Kit de développement logiciel (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 un cadre de test complet que nous vous encourageons à tester pour en savoir plus.
Pour les connecteurs simples et complexes, l’ajout de tests unitaires est une pratique 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 en tant que Fact
avec un 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 très simple 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é d’un certain nombre de faits et d’un bloc de code commun pour le cadre de test unitaire (ValueToText
, Fact
, Facts
, Facts.Summarize
). Le code suivant fournit un exemple d’ensemble 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 fournit un résumé visuel des taux de réussite :
L’implémentation de tests unitaires au début du processus de développement de connecteur vous permet de suivre les principes de développement piloté par des tests. Imaginez que vous devez écrire une fonction appelée Uri.GetHost
qui retourne uniquement les données d’hôte à partir d’un URI. Vous pouvez commencer par écrire un cas de test pour vérifier que la fonction opère correctement de la manière attendue :
Fact("Returns host from URI",
"https://bing.com",
Uri.GetHost("https://bing.com/subpath/query?param=1¶m2=hello")
),
Fact("Handles port number appropriately",
"https://bing.com:8080",
Uri.GetHost("https://bing.com:8080/subpath/query?param=1¶m2=hello")
)
Des tests supplémentaires peuvent être écrits pour s’assurer que la fonction gère correctement les cas limites.
Une version antérieure de la fonction pourrait réussir certains tests, mais pas tous :
Uri.GetHost = (url) =>
let
parts = Uri.Parts(url)
in
parts[Scheme] & "://" & parts[Host]
La version finale de la fonction devrait réussir tous les tests unitaires. Cela permet également de s’assurer facilement que les futures mises à jour de la fonction ne supprimeront accidentellement aucune de ses fonctionnalités de base.