Regressionstests mit dem Befehl „compare“
Der PQTest-Befehl compare ist ein leistungsfähiges Tool für Regressionstests, mit dem Sie die Funktionen des Connectors und die Generierung von Befehlstext gründlich auswerten können. Zur Veranschaulichung seiner Vielseitigkeit bieten die nachfolgenden Abschnitte eine Vielzahl von Beispielen, die auf verschiedene Szenarien zugeschnitten sind.
Grundlegende Abfragen
Die einfachste Form von Tests besteht darin, einer .query.pq-Datei einen einzelnen Abfrageausdruck hinzuzufügen, den Sie mit dem Befehl compare ausführen können. PQTest wertet den Ausdruck aus und generiert eine .pqout-Datei (Ausgabedatei) mit demselben Namen. Bei nachfolgenden Ausführungen wird die von der .query.pq-Datei generierte Ausgabe mit der pqout-Datei (Ausgabedatei) mit demselben Namen vergleichen, und es wird die Ausgabe der Auswertung zurückgegeben.
Beispiel 1: Ausführen des Befehls „compare“ für eine Abfragedatei, wenn keine Ausgabedatei vorhanden ist
Im folgenden Beispiel wird eine einzelne Abfragetestdatei mithilfe der angegebenen Power Query-Erweiterung ausgeführt, und es wird eine Ausgabedatei zum Vergleich generiert.
<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"
}
]
Beispiel 2: Ausführen des Befehls „compare“ für eine Abfragedatei, wenn keine Ausgabedatei vorhanden ist und das FailOnMissingOutputFile-Flag festgelegt ist
<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"
}
]
Beispiel 3 : Ausführen des Befehls „compare“ für eine Abfragedatei mit einer vorhandenen Ausgabedatei
Im folgenden Beispiel wird eine einzelne Abfragetestdatei mithilfe der angegebenen Power Query-Erweiterung ausgeführt. Diese wird mit der Ausgabedatei verglichen, und das Ergebnis wird zurückgegeben.
<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 mit Parameterabfrage
Die Parameterabfrage ist eine Abfrage, die mit einer Testabfrage zur Laufzeit kombiniert wird, wobei die Parameterabfrage zuerst ausgeführt wird. Mit dieser Funktion können Sie die PQ/Testabfragedatei in zwei Teile aufteilen: die Parameterabfragedatei und die Testabfragedatei.
Agnostische Datenquellentests mit Parameter und Testabfrageformat
Ein Beispiel für einen Anwendungsfall, in dem diese Funktionalität nützlich wäre, ist das Erstellen einer agnostischen Testsuite für Datenquellen. Die Parameterabfrage kann dann zum Abrufen von Daten aus der Datenquelle verwendet werden, und die Testabfrage kann generisch „M“ sein. Wenn Sie die Tests für einen anderen Connector ausführen möchten, müssen Sie die Parameterabfrage nur hinzufügen/aktualisieren, um auf diese bestimmte Datenquelle zu verweisen.
Ein wichtiger Unterschied bei der Verwendung einer Parameterabfrage besteht darin, dass die Testabfrage einem anderen Format folgt. Sie ist kein Formelausdruck, sondern es muss sich um eine M-Funktion handeln, die einen Eingabeparameter verwendet, der die von der Parameterabfrage zurückgegebene Tabelle darstellt.
Angenommen, Sie haben die folgende Testabfrage:
let
Source = Snowflake.Databases("...", "..."),
Database = Source{[Name="...",Kind="Database"]}[Data],
SelectColumns = Table.RemoveColumns(Database, { "Data" })
in
SelectColumns
Um diese in eine Test- und Parameterabfrage zu konvertieren, müssen Sie sie wie folgt aufteilen:
Parameterabfrage:
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
Testabfrage:
(Source) => let
SelectColumns = Table.RemoveColumns(Source, { "VendorID" })
in
SelectColumns
Beispiel 4 : Verwenden von Parameterabfragen und Testabfragen mit dem Befehl „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"
}
]
Vergleichen von Diagnosen
Zusätzliche Diagnoseinformationen können ausgewertet werden, wenn Sie den Befehl compare verwenden, indem Sie einen Diagnosekanal abonnieren. Wenn der Befehl compare ausgeführt wird, gibt PQTest eine .diagnostics-Datei für jeden abonnierten Kanal mit einem Ereignis aus. Bei nachfolgenden Ausführungen wird das Diagnoseereignis mit dessen .diagnostics.-Datei verglichen, ähnlich wie .pqout.
Beispiel 5: Abonnieren des ODBC-Diagnosekanals (Open Database Connectivity) zum Überprüfen des Qery Folding
Das folgende Beispiel zeigt, wie Sie den ODBC-Kanal abonnieren, der alle vom ODBC-Treiber generierten SQL-Treiber erfasst, wenn Query Folding verwendet wird.
<Path to PQTest.exe>.\PQTest.exe compare -e contoso.mez -q contoso.query.pq -dc "Odbc"
Der ODBC-Diagnosekanal kann verwendet werden, um das Query Folding zu überprüfen, und um zu prüfen, dass die das richtige SQL generiert wird.
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
Die Abfrage wird nun gefaltet und generiert den folgenden ODBC-Befehlstext in der .diagnostics-Datei:
[
{
"Command": "DESCRIBE default.DATABASE;"
},
{
"Command": "select top 1 max(`number_column`) as `C1` from `SPARK`.`default`.`DATABASE`"
}
]
Verwenden einer Einstellungsdatei
Jeder Befehlszeilen-Eingabeparameter für den Befehl compare kann auch über eine JSON-Einstellungsdatei übergeben werden. Die JSON-Datei kann folgende Optionen umfassen:
Option | Typ | Beschreibung |
---|---|---|
ExtensionPaths | array | Array von Pfaden, die auf die Connectordatei verweisen (mez/pqx). |
FailOnMissingOutputFile | bool | Der Vergleich generiert keine PQOut-Datei und schlägt fehl, wenn diese nicht vorhanden ist. |
FailOnFoldingFailure | bool | Der Vergleich schlägt fehl, wenn ein Query-Folding-Fehler ausgelöst wird. |
ParameterQueryFilePath | Zeichenfolge | Abfragedatei, die M-Ausdrücke enthält, die zur Laufzeit mit der Testabfragedatei kombiniert werden. Ein gängiger Anwendungsfall besteht darin, eine einzelne Parameterabfragedatei zum Angeben eines M-Ausdrucks zum Abrufen der Daten für mehrere Testabfragen zu verwenden. |
QueryFilePath | Zeichenfolge | Abfragedatei, die den M-Ausdruck (.pq) enthält, der getestet werden soll. |
TrxReportPath | Zeichenfolge | Generiert eine TRX-Ergebnisdatei (Visual Studio Test Results File) und separate JSON-Dateien für jeden Test in einem bestimmten Pfad. |
DiagnosticChannels | array | Name der Diagnosekanäle, die an die Testausführung angefügt werden sollen (z. B. ODBC zum Erfassen von Query-Folding-Anweisungen). |
Wenn sowohl die Befehlszeileneingabe als auch die Einstellungsoption bereitgestellt werden, wird die Befehlszeileneingabe priorisiert.
Beispiel 6: Verwenden der Einstellungsdatei anstelle von Befehlszeilenargumenten
<Path to PQTest.exe>.\PQTest.exe compare -e contoso.mez -q contoso.query.pq -fomof
Der obige Befehl entspricht dem folgenden Befehl:
<Path to PQTest.exe>.\PQTest.exe compare -sf settings.json
Dabei ist settings.json die folgende JSON-Datei:
{
"ExtensionPaths": ["contoso.mez"],
"QueryFilePath": "contoso.query.pq",
"FailOnMissingOutputFile": true
}
Testreihen mit dem Befehl „compare“
Eine Testreihe ist eine Sammlung von Tests, die mehrere Aspekte Ihres Codes auswerten. Platzieren Sie die Abfragedateien im selben Ordner, damit PQTest sie problemlos finden kann. Geben Sie anstelle eines bestimmten Testdateinamens den Ordnerpfad an, damit PQTest alle .query.pq-Testabfragedateien in einem einzigen Durchgang ausführen kann.
Beispiel 7 : Ausführen von Testreihen
Angenommen, ein Ordner mit dem Namen „Test“ enthält die folgenden Dateien:
- contoso.testa.query.pq
- contoso.testb.query.pq
- contoso.testc.query.pq
Die gesamte Testreihe kann über die folgende Befehlszeile ausgeführt werden:
<Path to PQTest.exe>.\PQTest.exe compare -e contoso.mez -q .\test
Ignorieren von Tests beim Ausführen einer Testreihe
Ein Test kann ignoriert werden, wenn eine Testreihe ausgeführt wird, indem die Erweiterung der .query.pq-Datei in „.query.pq.ignore“ geändert wird.
Beispiel 8: Ignorieren von Tests beim Ausführen einer Testreihe
Angenommen, ein Ordner mit dem Namen „Test“ enthält die folgenden Dateien:
- contoso.testa.query.pq
- contoso.testb.query.pq.ignore
- contoso.testc.query.pq
Die Dateien „contoso.testa.query.pq“ und „contoso.testc.query.pq“ werden ausgeführt, aber „contoso.testb.query.pq.ignore“ wird ignoriert, wenn der folgende Befehl ausgeführt wird, um die Testreihe auszuführen:
<Path to PQTest.exe>.\PQTest.exepqtest.exe compare -e contoso.mez -q .\test