Partager via


Test de régression avec la commande compare

La commande PQTest compare est un outil puissant pour les tests de régression, ce qui vous permet d’évaluer soigneusement les fonctions du connecteur et la génération de texte de commande. Pour illustrer sa polyvalence, les sections suivantes fournissent un large éventail d’exemples adaptés à différents scénarios.

Requêtes de base

La forme de test la plus simple consiste à ajouter une expression de requête unique à un fichier .query.pq, que vous pouvez exécuter à l’aide de la commande compare. PQTest évalue l’expression et génère un fichier .pqout (sortie) portant le même nom. Pour toutes les exécutions suivantes, elle compare la sortie générée à partir de l’évaluation du fichier .query.pq avec le fichier pqout (sortie) portant le même nom et retourne la sortie de l’évaluation.

Exemple 1 : exécution de la commande compare pour un fichier de requête lorsqu’un fichier de sortie n’existe pas

L’exemple suivant exécute un fichier de test de requête unique à l’aide de l’extension Power Query spécifiée et génère le fichier de sortie à comparer.

<Path to PQTest.exe>.\PQTest.exe compare -e contoso.mez -q contoso.query.pq
[
  {
    "Details": "Contoso.Contents(\"TestEndpoint\")",
    "EndTime": "2020-12-11T18:04:14.8991822+00:00",
    "Method": "Compare.TestFiles",
    "Name": "contoso.query.pq",
    "StartTime": "2020-12-11T18:04:11.1532388+00:00",
    "Output": [
      {
        "SourceFilePath": "contoso.query.pq",
        "OutputFilePath": "contoso.query.pqout",
        "Status": "Output File Generated",
        "SerializedSource": null,
        "SourceError": null,
        "OutputError": null
      }
    ],
    "Status": "Passed",
    "Type": "PQTest.Expression"
  }
]

Exemple 2 : exécution de la commande compare pour un fichier de requête lorsqu’un fichier de sortie n’existe pas et que l’indicateur FailOnMissingOutputFile est défini

<Path to PQTest.exe>.\PQTest.exe compare -e contoso.mez -q contoso.query.pq -fomof
[
  {
    "Details": "Contoso.Contents(\"TestEndpoint\")",
    "EndTime": "2020-12-11T18:04:14.8991822+00:00",
    "Method": "Compare.TestFiles",
    "Name": "contoso.query.pq",
    "StartTime": "2020-12-11T18:04:11.1532388+00:00",
    "Output": [
      {
        "SourceFilePath": "contoso.query.pq",
        "OutputFilePath": "contoso.query.pqout",
        "Status": "Missing Output File",
        "SerializedSource": "Output of contoso.query.pq",
        "SourceError": null,
        "OutputError": null
      }
    ],
    "Status": "Failed"
    "Type": "PQTest.Expression"
  }
]

Exemple 3 : exécution de la commande compare pour un fichier de requête avec un fichier de sortie présent

L’exemple suivant exécute un fichier de test de requête unique à l’aide de l’extension Power Query spécifiée, le compare au fichier de sortie et retourne le résultat.

<Path to PQTest.exe>.\PQTest.exe compare -e contoso.mez -q contoso.query.pq
[
  {
    "Details": "Contoso.Contents(\"TestEndpoint\")",
    "EndTime": "2020-12-11T18:04:14.8991822+00:00",
    "Method": "Compare.TestFiles",
    "Name": "contoso.query.pq",
    "StartTime": "2020-12-11T18:04:11.1532388+00:00",
    "Output": [
      {
        "SourceFilePath": "contoso.query.pq",
        "OutputFilePath": "contoso.query.pqout",
        "Status": "Passed",
        "SerializedSource": null,
        "SourceError": null,
        "OutputError": null
      }
    ],
    "Status": "Passed",
    "Type": "PQTest.Expression"
  }
]

Test avec la requête avec paramètres

La requête avec paramètres est une requête combinée à une requête de test au moment de l’exécution, la requête avec paramètres s’exécutant en premier. Cette fonctionnalité vous permet de diviser le fichier de requête PQ/test en deux parties : le fichier de requête avec paramètres et le fichier de requête de test.

Test de source de données indépendant avec un format de requête de paramètre et de test

Un exemple de cas d'utilisation dans lequel cette fonctionnalité serait utile consiste à créer une suite de tests indépendante de la source de données. Vous pouvez donc utiliser votre requête avec paramètres pour récupérer les données de la source de données et faire en sorte que la requête de test soit M générique. Si vous souhaitez exécuter les tests pour un autre connecteur, il vous suffit d’ajouter/mettre à jour la requête avec paramètres pour qu’elle pointe vers cette source de données spécifique.

Une différence clé lors de l’utilisation d’une requête avec paramètres est que la requête de test suit un format différent. Au lieu d’être une expression de formule, il doit s’agir d’une fonction M qui accepte un paramètre d’entrée, lequel représente la table retournée par la requête avec paramètres.

Supposons que vous ayez la requête de test suivante :

let
    Source = Snowflake.Databases("...", "..."),
    Database = Source{[Name="...",Kind="Database"]}[Data],
    SelectColumns = Table.RemoveColumns(Database, { "Data" })
in
    SelectColumns

Pour la convertir en requête de test et requête avec paramètres, vous devez les diviser comme suit :

Requête avec paramètres :

let
    Source = Snowflake.Databases("...", "..."),
    Database = Source{[Name="...",Kind="Database"]}[Data],
    Schema = Database{[Name="...",Kind="Schema"]}[Data],
    Taxi_Table = Schema{[Name="...",Kind="Table"]}[Data],
in
    Taxi_Table

Requête de test :

(Source) => let
    SelectColumns = Table.RemoveColumns(Source, { "VendorID" })
in
    SelectColumns

Exemple 4 : utilisation de la requête avec paramètres et de la requête de test avec la commande compare

<Path to PQTest.exe>.\PQTest.exe compare -e contoso.mez -q contoso.query.pq -pa contoso.parameter.pq
[
  {
    "Details": "(Source) => let\r\n    Schemas = Table.RemoveColumns(Source, { \"Data\" })\r\nin\r\n    Schemas",
    "EndTime": "2020-12-11T18:04:14.8991822+00:00",
    "Method": "Compare.TestFiles",
    "Name": "contoso.query.pq",
    "StartTime": "2020-12-11T18:04:11.1532388+00:00",
    "Output": [
      {
        "SourceFilePath": "contoso.query.pq",
        "OutputFilePath": "contoso.query.pqout",
        "Status": "Passed",
        "SerializedSource": null,
        "SourceError": null,
        "OutputError": null
      }
    ],
    "Status": "Passed",
    "Type": "PQTest.Expression"
  }
]

Comparaison des diagnostics

Des informations de diagnostic supplémentaires peuvent être évaluées lors de l’utilisation de la commande compare en s’abonnant à un canal de diagnostic. Lorsque la commande compare est exécutée, PQTest génère un fichier .diagnostics pour chaque canal abonné ayant un événement. Pour toutes les exécutions suivantes, il compare l’événement de diagnostic à son fichier .diagnostics, similaire à .pqout.

Exemple 5 : abonnement au canal de diagnostic ODBC (Open Database Connectivity) pour valider le pliage des requêtes

L’exemple suivant montre comment s’abonner au canal ODBC, qui capture n’importe quel SQL généré par le pilote ODBC lors de l’utilisation du pliage de requête.

<Path to PQTest.exe>.\PQTest.exe compare -e contoso.mez -q contoso.query.pq -dc "Odbc"

Le canal de diagnostic ODBC peut être utilisé pour vérifier qu’une requête est pliée et qu’elle génère le bon code SQL.

let
    Source = AzureSpark.Tables("...")
    T1 = Source{[Schema="default",Item="DATABASE"]}[Data],
    SelectColumns = Table.Group(T1, {}, {{"Maximum", each List.Max([number_column]), type number}}),
    FirstN = Table.FirstN(SelectColumns, 1)
in
    FirstN

La requête se replie et génère désormais le texte de commande ODBC suivant dans le fichier .diagnostics :

[
  {
    "Command": "DESCRIBE default.DATABASE;"
  },
  {
    "Command": "select top 1 max(`number_column`) as `C1` from `SPARK`.`default`.`DATABASE`"
  }
]

Utilisation d’un fichier de paramètres

Tout paramètre d’entrée de ligne de commande pour la commande de compare peut également être transmis via un fichier de paramètres JSON. Le JSON peut inclure les options suivantes :

Option Type Description
ExtensionPaths array Tableau de chemins qui pointent vers le fichier connecteur (mez/pqx).
FailOnMissingOutputFile bool Compare ne génère pas de fichier PQOut et échoue s’il n’existe pas.
FailOnFoldingFailure bool Compare échoue si une erreur de pliage de requête est levée.
ParameterQueryFilePath string Fichier de requête qui contient des expressions M, combiné au moment de l’exécution avec le fichier de requête de test. Un cas d’usage courant consiste à avoir un fichier de requête avec paramètres unique pour spécifier une expression M afin de récupérer les données pour plusieurs requêtes de test.
QueryFilePath string Fichier de requête qui contient l’expression M (.pq) à tester.
TrxReportPath string Génère un fichier de résultats TRX (fichier de résultats de test Visual Studio) et des fichiers JSON distincts pour chaque test dans un chemin donné.
DiagnosticChannels array Nom des canaux de diagnostic à attacher à l’exécution de test (par exemple, Odbc pour capturer des instructions de pliage de requête).

Dans le cas où l’option d’entrée de ligne de commande et de paramètres est fournie, l’entrée de ligne de commande est hiérarchisée.

Exemple 6 : utilisation d’un fichier de paramètres au lieu des arguments de ligne de commande

<Path to PQTest.exe>.\PQTest.exe compare -e contoso.mez -q contoso.query.pq -fomof

La commande ci-dessus est équivalente à la commande suivante :

<Path to PQTest.exe>.\PQTest.exe compare -sf settings.json

Où settings.json est le fichier JSON suivant :

{
  "ExtensionPaths": ["contoso.mez"],
  "QueryFilePath": "contoso.query.pq",
  "FailOnMissingOutputFile": true
}

Batteries de tests avec la commande compare

Une batterie de tests est une collection de tests qui évaluent plusieurs aspects de votre code. Placez les fichiers de requête dans le même dossier afin que PQTest puisse les localiser facilement. Au lieu de passer un nom de fichier de test spécifique, spécifiez le chemin du dossier et PQTest exécute tous les fichiers de requête de test .query.pq en un seul passage.

Exemple 7 : exécution d’une batterie de tests

En supposant qu’un dossier nommé test contient les fichiers suivants :

  • contoso.testa.query.pq
  • contoso.testb.query.pq
  • contoso.testc.query.pq

La batterie de tests entière peut être exécutée à l’aide de la ligne de commande suivante :

<Path to PQTest.exe>.\PQTest.exe compare -e contoso.mez -q .\test

Ignorer les tests lors de l’exécution d’une batterie de tests

Un test peut être ignoré lors de l’exécution d’une batterie de tests en modifiant l’extension du fichier .query.pq en .query.pq.ignore.

Exemple 8 : ignorer un test lors de l’exécution d’une batterie de tests

En supposant qu’un dossier nommé test contient les fichiers suivants :

  • contoso.testa.query.pq
  • contoso.testb.query.pq.ignore
  • contoso.testc.query.pq

Les fichiers contoso.testa.query.pq et contoso.testc.query.pq sont exécutés, mais contoso.testb.query.pq.ignore est ignoré lorsque la commande suivante est exécutée pour exécuter la batterie de tests :

<Path to PQTest.exe>.\PQTest.exepqtest.exe compare -e contoso.mez -q .\test