Regressietests met de opdracht Vergelijken

De PQTest-vergelijkingsopdracht is een krachtig hulpprogramma voor regressietests, zodat u de functies van de connector en het genereren van opdrachttekst grondig kunt evalueren. Om zijn veelzijdigheid te illustreren, bieden de volgende secties verschillende voorbeelden die zijn afgestemd op verschillende scenario's.

Important

De opdracht run-compare vervangt de vergelijkingsopdracht . Gebruik het run-compare commando voor elke toekomstige regressietest van de Power Query-connectors.

Basisqueries

De eenvoudigste vorm van testen is het toevoegen van één query-expressie aan een .query.pq bestand, dat u kunt uitvoeren met behulp van de vergelijkingsopdracht. PQTest evalueert de expressie en genereert een .pqout (uitvoer)-bestand met dezelfde naam. Voor eventuele volgende uitvoeringen wordt de uitvoer die is gegenereerd op basis van de evaluatie van .query.pq vergeleken met het .pqout-bestand met dezelfde naam en wordt de uitvoer van de evaluatie geretourneerd.

Voorbeeld 1: opdracht Vergelijken uitvoeren voor een querybestand wanneer er geen uitvoerbestand bestaat

In het volgende voorbeeld wordt één querytestbestand .query.pq uitgevoerd met behulp van de opgegeven Power Query-extensie en wordt een uitvoerbestand gegenereerd om te vergelijken.

<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"
  }
]

Voorbeeld 2: de opdracht Vergelijken uitvoeren voor een querybestand wanneer er geen uitvoerbestand bestaat en de vlag FailOnMissingOutputFile is ingesteld

<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"
  }
]

Voorbeeld 3 - Vergelijk-opdracht uitvoeren voor een querybestand met een bestaand uitvoerbestand

In het volgende voorbeeld wordt één querytestbestand uitgevoerd met behulp van de opgegeven Power Query-extensie, wordt het vergeleken met het uitvoerbestand en wordt het resultaat geretourneerd.

<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"
  }
]

Testen met parameterquery

Parameterquery is een query die wordt gecombineerd met een testquery tijdens runtime, waarbij de parameterquery eerst wordt uitgevoerd. Met deze functionaliteit kunt u het PQ-/testquerybestand splitsen in twee delen: het parameterquerybestand en het testquerybestand.

Agnostische gegevensbrontests met parameter- en testquery-indeling

Een voorbeeld van een use-case waarbij deze functionaliteit nuttig is, is het maken van een gegevensbronagnostisch testpakket. U kunt de parameterquery gebruiken om gegevens op te halen uit de gegevensbron en de testquery algemeen M te laten zijn. Als u de tests voor een andere connector wilt uitvoeren, hoeft u alleen de parameterquery toe te voegen/bij te werken om naar die specifieke gegevensbron te verwijzen.

Een belangrijk verschil bij het gebruik van een parameterquery is dat de testquery een andere indeling volgt. In plaats van een formule-expressie te zijn, moet het een M-functie zijn die één invoerparameter gebruikt, die de tabel vertegenwoordigt die wordt geretourneerd door de parameterquery.

Stel dat u de volgende testquery hebt:

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

Als u deze wilt converteren naar een test- en parameterquery, moet u deze als volgt splitsen:

Parameterquery:

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

Testquery:

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

Voorbeeld 4: parameterquery en testquery gebruiken met vergelijkingsopdracht

<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"
  }
]

Diagnostische gegevens vergelijken

Extra diagnostische gegevens kunnen worden geëvalueerd wanneer u de vergelijkingsopdracht gebruikt door u te abonneren op een diagnostisch kanaal. Wanneer de vergelijkingsopdracht wordt uitgevoerd, voert PQTest een .diagnostics bestand uit voor elk geabonneerd kanaal met een gebeurtenis. Voor eventuele volgende uitvoeringen wordt de diagnostische gebeurtenis vergeleken met het .diagnostics bijbehorende bestand, vergelijkbaar met .pqout.

Voorbeeld 5: abonneren op het diagnostische ODBC-kanaal (Open Database Connectivity) om query folding te valideren

In het volgende voorbeeld ziet u hoe u zich abonneert op het ODBC-kanaal, dat sql vastlegt die door het ODBC-stuurprogramma wordt gegenereerd wanneer query folding wordt gebruikt.

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

Het diagnostische ODBC-kanaal kan worden gebruikt om te controleren of een query wordt gevouwen en of de juiste SQL wordt gegenereerd.

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

De query wordt nu gevouwen en genereert de volgende ODBC-opdrachttekst in het .diagnostics bestand:

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

Een instellingenbestand gebruiken

Elke opdrachtregelinvoerparameter voor de vergelijkingsopdracht kan ook worden doorgegeven via een JSON-instellingenbestand. De JSON kan de volgende opties hebben:

Optie Typ Beschrijving
Uitbreidingspaden array Matrix van paden die verwijzen naar connectorbestand (mez/pqx).
FoutBijOntbrekendUitvoerbestand bool Vergelijking genereert geen .pqout bestand en mislukt als er geen bestaat.
MislukOpVouwfout bool Vergelijken mislukt als er een query-vouwfout optreedt.
ParameterQueryFilePath touw Querybestand met M-expressies, dat tijdens runtime wordt gecombineerd met het testquerybestand. Een veelvoorkomende use-case is het hebben van één parameterquerybestand om een M-expressie op te geven om de gegevens voor meerdere testquery's op te halen.
QueryFilePath touw Querybestand met M-expressie (.pq) dat moet worden getest.
TrxReportPath touw Genereert een TRX resultatenbestand (Visual Studio Test Results File) en afzonderlijke JSON-bestanden voor elke test in een bepaald pad.
Diagnostische kanalen array Naam van de diagnostische kanalen die aan de testuitvoering moeten worden gekoppeld (bijvoorbeeld Odbc voor het vastleggen van query folding-verklaringen).

In het geval dat zowel opdrachtregelinvoer als instellingenoptie worden opgegeven, krijgt de opdrachtregelinvoer prioriteit.

Voorbeeld 6: het instellingenbestand gebruiken in plaats van opdrachtregelargumenten

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

De opdracht is gelijk aan de volgende opdracht:

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

Waar settings.json het volgende JSON-bestand is:

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

Batterijen testen met vergelijkingsopdracht

Een testbatterij is een verzameling tests die meerdere aspecten van uw code evalueren. Plaats de querybestanden in dezelfde map, zodat PQTest ze gemakkelijk kan vinden. In plaats van een specifieke testbestandsnaam door te geven, geeft u het mappad op en voert PQTest alle .query.pq-testquerybestanden in één wachtwoord uit.

Voorbeeld 7: Een batterij van tests uitvoeren

Ervan uitgaande dat er een map is met de naam 'test', die de volgende bestanden bevat:

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

De volledige testbatterij kan worden uitgevoerd met behulp van de volgende opdrachtregel:

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

Tests negeren bij het uitvoeren van een batterij van tests

Een test kan worden genegeerd bij het uitvoeren van een batterij van tests door de extensie van het .query.pq-bestand te wijzigen in .query.pq.ignore.

Voorbeeld 8: een test negeren bij het uitvoeren van een batterij van tests

Ervan uitgaande dat er een map is met de naam 'test', die de volgende bestanden bevat:

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

De bestanden contoso.testa.query.pq en contoso.testc.query.pq worden uitgevoerd, maar contoso.testb.query.pq.ignore wordt genegeerd wanneer de volgende commando wordt uitgevoerd om de testbatterij uit te voeren.

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