Regressionstest med run-compe-kommandoen

PQTest run-compe-kommandoen er et kraftfuldt værktøj til regressionstest, som gør det muligt for dig grundigt at evaluere connectorens funktioner og genereringen af kommandoteksten. For at illustrere dens alsidighed giver de følgende afsnit forskellige eksempler tilpasset forskellige scenarier.

Bemærkning

Kommandoen run-compare erstatter den tidligere compe-kommando.

Testinddataformater

Kommandoen run-compare understøtter to testinputformater:

  • Udtryksformat: Et enkelt M-udtryk (for eksempel et let udtryk eller funktionskald). Dette format er det simpleste format og er egnet til de fleste testscenarier.
  • Sektionsdokumentformat: Et M-sektionsdokument , der indeholder en eller flere sektionsmedlemmer. Dette format er nyttigt til tests, der kræver hjælpefunktioner, delte værdier eller mere komplekse opsætninger.

Når en testfil bruger udtryksformatet, konverterer PQTest den automatisk til et sektionsdokument internt før evaluering. Du kan også skrive dit testinput direkte som et sektionsdokument.

Eksempel på udtryksformat

let
    Source = Contoso.Contents("TestEndpoint"),
    Result = Table.RowCount(Source)
in
    Result

Eksempel på sektionsdokumentformat

section Test;

shared Helper = (x) => x + 1;
shared Query = let
    Source = Contoso.Contents("TestEndpoint"),
    Result = Helper(Table.RowCount(Source))
in
    Result;

Når en parameterforespørgsel leveres, tilføjes parameterforespørgslen som et sektionsmedlem til sektionsdokumentet. Parameterforespørgslen evalueres som en del af samme sektion, hvilket gør det muligt for testforespørgslen at referere direkte til den.

Grundlæggende forespørgsler

Den simpleste form for test er at tilføje et enkelt forespørgselsudtryk til en .query.pq fil, som du kan udføre ved hjælp af kommandoen run-verce . PQTest evaluerer udtrykket og genererer en .pqout (output)fil med samme navn. For eventuelle efterfølgende kørsler sammenligner den outputtet genereret fra evalueringen af .query.pq filen med .pqout (output)filen med samme navn og returnerer outputtet af evalueringen.

Eksempel 1 - Kør run-compere-kommandoen for en forespørgselsfil, når en outputfil ikke eksisterer

Følgende eksempel udfører en enkelt forespørgselstestfil ved hjælp af det angivne Power Query-filtypenavn og genererer outputfil, der skal sammenlignes.

<Path to PQTest.exe>.\PQTest.exe run-compare -e contoso.mez -q contoso.query.pq
[
  {
    "Details": "Contoso.Contents(\"TestEndpoint\")",
    "EndTime": "2025-12-11T18:04:14.8991822+00:00",
    "Method": "Compare.TestFiles",
    "Name": "contoso.query.pq",
    "StartTime": "2025-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"
  }
]

Eksempel 2 - Kør run-compere-kommandoen for en forespørgselsfil, når en outputfil ikke eksisterer, og FailOnMissingOutputFile-flaget er sat

<Path to PQTest.exe>.\PQTest.exe run-compare -e contoso.mez -q contoso.query.pq -fomof
[
  {
    "Details": "Contoso.Contents(\"TestEndpoint\")",
    "EndTime": "2025-12-11T18:04:14.8991822+00:00",
    "Method": "Compare.TestFiles",
    "Name": "contoso.query.pq",
    "StartTime": "2025-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"
  }
]

Eksempel 3 - Kørsel af run-compe-kommandoen for en forespørgselsfil med en outputfil til stede

Følgende eksempel udfører en enkelt forespørgselstestfil ved hjælp af det angivne Power Query-filtypenavn, sammenligner den med outputfilen og returnerer resultatet.

<Path to PQTest.exe>.\PQTest.exe run-compare -e contoso.mez -q contoso.query.pq
[
  {
    "Details": "Contoso.Contents(\"TestEndpoint\")",
    "EndTime": "2025-12-11T18:04:14.8991822+00:00",
    "Method": "Compare.TestFiles",
    "Name": "contoso.query.pq",
    "StartTime": "2025-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 med parameterforespørgsel

Parameterforespørgsel er en forespørgsel, der kombineres med en testforespørgsel på kørselstidspunktet, hvor parameterforespørgslen kører først. Denne funktionalitet lader dig opdele filen ".query.pq" i to dele: parameterforespørgselsfilen og testforespørgselsfilen.

Test af agnostisk datakilde med parameter- og testforespørgselsformat

Et eksempel på en use case, hvor denne funktionalitet ville være nyttig, er at oprette en agnostisk testpakke til datakilder. Du kan bruge din parameterforespørgsel til at hente data fra datakilden og lade testforespørgslen være generisk M. Hvis du vil køre testene for en anden connector, behøver du kun at tilføje/opdatere parameterforespørgslen, så den peger på den specifikke datakilde.

En vigtig forskel ved brug af en parameterforespørgsel er, at testforespørgslen følger et andet format. I stedet for at være et formeludtryk skal det være en M-funktion, der tager én inputparameter, som repræsenterer den tabel, der returneres fra parameterforespørgslen.

Når en parameterforespørgsel leveres, tilføjes parameterforespørgslen som et sektionsmedlem til slutningen af testens sektionsdokument. Test- og parameterinputtene evalueres derefter sammen som et enkelt Mashup-sektionsdokument.

Bemærkning

Hvis parameterforespørgselsfilen indeholder fejl (for eksempel syntaksfejl eller evalueringsfejl), rapporterer PQTest en beskrivende fejl, der indikerer problemet med parameterfilen i stedet for at producere en uklar fejl.

Lad os sige, at du har følgende testforespørgsel:

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

Hvis du vil konvertere den til en test- og parameterforespørgsel, skal du opdele dem på følgende måde:

Parameterforespørgsel:

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

Testforespørgsel:

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

Eksempel 4 - Brug af både parameterforespørgsel og testforespørgsel med run-compare kommandoen

<Path to PQTest.exe>.\PQTest.exe run-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": "2025-12-11T18:04:14.8991822+00:00",
    "Method": "Compare.TestFiles",
    "Name": "contoso.query.pq",
    "StartTime": "2025-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"
  }
]

Sammenligning af diagnosticering

Ekstra diagnostisk information kan evalueres, når man bruger run-compere-kommandoen ved at abonnere på en diagnostisk kanal. Når kommandoen run-compare køres, udleverer PQTest en .diagnostics fil for hver abonneret kanal, der havde en hændelse. For efterfølgende kørsler sammenligner den diagnostiske hændelse med sin .diagnostics fil, ligesom .pqout.

Eksempel 5 – Abonnement på ODBC-diagnosticeringskanalen (Open Database Connectivity) for at validere forespørgselsdelegering

I følgende eksempel kan du se, hvordan du abonnerer på ODBC-kanalen, som registrerer sql, der genereres af ODBC-driveren, når forespørgselsdelegering bruges.

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

ODBC-diagnosticeringskanalen kan bruges til at bekræfte, at en forespørgsel foldes, og at den genererer den korrekte 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

Forespørgslen foldes nu og genererer følgende ODBC-kommandotekst i filen .diagnostics :

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

Brug af en indstillingsfil

Enhver kommandolinje-inputparameter for run-compere-kommandoen kan også sendes via en JSON-indstillingsfil. JSON kan have følgende indstillinger:

Mulighed Type Beskrivelse
ExtensionPaths matrix Matrix af stier, der peger på connectorfilen (mez/pqx).
FailOnMissingOutputFile bool Run-compare genererer ikke en PQOut-fil og fejler, hvis den ikke eksisterer.
FailOnFoldingFailure bool Run-compare fejler, hvis en forespørgsel ikke folder helt. Når de er aktiveret, giver forespørgsler, der ikke kan foldes fuldt ud til datakilden, en fejl i stedet for at falde tilbage på lokal evaluering.
ParameterQueryFilePath streng Forespørgselsfil, der indeholder M-udtryk, som kombineres på kørselstidspunktet med testforespørgselsfilen. En almindelig use case er at have en enkelt parameterforespørgselsfil til at angive et M-udtryk for at hente dataene for flere testforespørgsler.
QueryFilePath streng Forespørgselsfil, der indeholder M-udtryk (.pq) der skal testes.
TrxReportPath streng Genererer en TRX (Visual Studio Test Results File) resultatfil og separate JSON-filer for hver test i en given sti.
Diagnosticeringskanaler matrix Navn på diagnostiske kanaler, der skal tilknyttes testkørslen (for eksempel Odbc til at fange query folding-sætninger).
IntermediateTestResultsFolder streng Brugerdefineret mappesti til lagring af mellemliggende testresultater.
PersisterIntermediateTestResultater bool Gemmer mellemliggende testresultater efter testudførelsen er afsluttet.

Hvis der angives både kommandolinjeinput og indstillinger, prioriteres kommandolinjeinputtet.

Eksempel 6 – Brug af indstillingsfilen i stedet for kommandolinjeargumenter

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

Kommandoen svarer til følgende kommando:

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

Hvor settings.json er følgende JSON-fil:

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

Testbatterier med run-compare kommando

Et testbatteri er en samling test, der evaluerer flere aspekter af din kode. Placer forespørgselsfilerne i den samme mappe, så PQTest nemt kan finde dem. I stedet for at overføre et bestemt testfilnavn skal du angive mappestien, og PQTest udfører alle .query.pq-testforespørgselsfilerne i et enkelt gennemløb.

Eksempel 7 – Kørsel af et batteri af test

Hvis der antages en mappe med navnet test, der indeholder følgende filer:

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

Hele testbatteriet kan køres på følgende kommandolinje:

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

Ignorerer test, når du kører et batteri af test

En test kan ignoreres, når du kører et batteri af test, ved at ændre filtypenavnet for .query.pq-filen til .query.pq.ignore.

Eksempel 8 – Ignorerer en test, når der køres et batteri af test

Hvis der antages en mappe med navnet test, der indeholder følgende filer:

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

Filerne contoso.testa.query.pq og contoso.testc.query.pq køres, men contoso.testb.query.pq.ignore ignoreres, når følgende kommando udføres for at køre testbatteriet:

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

Filtreringstests

Muligheden --testFilter giver dig mulighed for selektivt at inkludere eller udelukke testfiler, når du kører testbatterier. Denne mulighed bruger glob-mønstre til at matche filstier og kan specificeres flere gange for at skabe komplekse filtreringsregler.

Inklusionsfiltre

Angiv, hvilke filer der skal inkluderes i testkørslen ved brug af standard glob-mønstre.

<Path to PQTest.exe>.\PQTest.exe run-compare -e contoso.mez -q .\test --testFilter "Suite1/**/*.pq"

Udelukkelsesfiltre

Angiv, hvilke filer der skal udelukkes fra testkørslen ved at bruge præfikset ! til at angive udelukkelsesmønstre.

<Path to PQTest.exe>.\PQTest.exe run-compare -e contoso.mez -q .\test --testFilter "!BrokenTests/*"

Flere filtre

Flere --testFilter muligheder kan kombineres for at skabe kompleks filtreringslogik:

<Path to PQTest.exe>.\PQTest.exe run-compare -e contoso.mez -q .\test --testFilter "**/*.pq" --testFilter "!BrokenTests/*" --testFilter "!**/*donotrun*.pq"

Filteradfærd

  • Implicit inklusion: Når der ikke er angivet inklusionsfiltre, **/*.query.pq anvendes automatisk.
  • Kasus-insensitiv: Alle mønstre matcher kasus-insensitivt.
  • Rækkefølgeuafhængig: Rækkefølgen af filtre påvirker ikke resultatet.
  • Stiformat: Brug fremadrettet skråstreger (/) i mønstre for kompatibilitet på tværs af platforme.

Eksempler på glob-mønstre

Mønster Beskrivelse
**/*.pq Alle .pq filer i en hvilken som helst mappe
**/*.query.pq Alle .query.pq filer i en hvilken som helst mappe
Suite1/**/*.pq Alle .pq filer under Suite1-mappen
**/test*.pq Alle .pq filer, der starter med "test"
!BrokenTests/* Udeluk alle filer i BrokenTests-mappen
!**/*temp*.pq Udeluk alle .pq filer, der indeholder "temp"
SpecificTest.pq Inkluder kun den specifikke fil

Bemærkning

Filtre gælder for den relative sti fra den angivne forespørgselsmappe. En fejl returneres, hvis filtre angives, og forespørgselsfilens sti peger på en specifik fil i stedet for en mappe. Brug anførselstegn omkring mønstre for at forhindre skaludvidelse.

Visning af testfiler uden udførelse

Muligheden --listOnly giver dig mulighed for at forhåndsvise, hvilke testfiler der ville blive udført med run-compe-kommandoen uden faktisk at køre testene. Denne mulighed er nyttig til at verificere testopdagelse og filteradfærd.

Eksempel 9 - Listelse af testfiler

<Path to PQTest.exe>.\PQTest.exe run-compare -e contoso.mez -q .\test --listOnly
{
    "SourcePath": "C:\\MyProject\\test",
    "TestFilters": [],
    "Tests": [
        {
            "Test": "MyTest.query.pq",
            "RelativePath": "Suite1\\MyTest.query.pq",
            "AbsolutePath": "C:\\MyProject\\test\\Suite1\\MyTest.query.pq"
        },
        {
            "Test": "AnotherTest.query.pq",
            "RelativePath": "Suite2\\AnotherTest.query.pq",
            "AbsolutePath": "C:\\MyProject\\test\\Suite2\\AnotherTest.query.pq"
        }
    ]
}

Outputtet indeholder følgende felter:

  • SourcePath: QueryFilePath-værdien, der blev givet til kommandoen (from -q option).
  • TestFilters: En liste over alle TestFilter-værdier, der blev anvendt (fra --testFilter muligheder).
  • Tester: Et array af testfilobjekter, hvor hvert objekt indeholder:
    • Test: Filnavnet på testfilen.
    • RelativePath: Stien relativt til basistestmappen specificeret af -q.
    • AbsolutePath: Den fulde absolute-sti til testfilen.

Kombinering med testfiltre

Muligheden --listOnly respekterer alle --testFilter muligheder og giver dig mulighed for at forhåndsvise effekten af dine filtre:

<Path to PQTest.exe>.\PQTest.exe run-compare -e contoso.mez -q .\test --testFilter "Suite1/**/*.pq" --listOnly

Bemærkning

Alle testfiltre anvendes før listing. Der sker ingen egentlig testudførelse ved brug --listOnlyaf .

Håndtering af mellemtestresultater

Kommandoen run-compare genererer mellemliggende filer under testkørselen, inklusive faktiske testoutputfiler (.pqout) og diagnostiske filer (.diagnostics). Som standard oprettes disse filer midlertidigt med en datobaseret undermappestruktur og bliver automatisk ryddet op efter testkørslen.

Du kan kontrollere denne adfærd ved hjælp af to muligheder:

  • --intermediateTestResultsFolder | -itrf: Specificerer en brugerdefineret mappesti til lagring af mellemliggende testresultater.
  • --persistIntermediateTestResults | -pitr: Beholder de mellemliggende resultater efter testudførelsen er afsluttet.

Eksempel 10 - Brug af en brugerdefineret mellemliggende mappe og vedvarende resultater

<Path to PQTest.exe>.\PQTest.exe run-compare -e contoso.mez -q .\test -itrf "C:\TestResults" -pitr

Mellemliggende mappestruktur

Når du angiver en mellemliggende testresultatmappe, opretter PQTest en datobaseret undermappestruktur til at organisere testresultater:

<IntermediateTestResultsFolder>\
  └── YYYYMMDD_HHmmss_ffffff\
      ├── Test1.query.pqout
      ├── Test2.query.pqout
      ├── Test3.query.odbc.diagnostics
      └── ...

Oprydningsadfærd

Oprydningsadfærden afhænger af, om du angiver en mellemliggende mappe, og om du bruger persist-flaget:

scenarie Specificeret mellemliggende mappe Persist-flaget Adfærd
1 Nej Nej Filer oprettet i midlertidig placering, datobaseret undermappe slettet efter tests
2 Ja Nej Filer oprettet i angivet mappe, datobaseret undermappe slettet efter tests
3 Nej Ja Filer oprettet i midlertidig placering, datobaseret undermappe slettet efter tests
4 Ja Ja Filer oprettet i en angivet mappe, datobaseret undermappe bevaret

Bemærkning

For at bevare mellemliggende resultater skal du angive både --intermediateTestResultsFolder og --persistIntermediateTestResults. Flaget --persistIntermediateTestResults alene uden at angive en mappe giver ikke resultaterne. Hvis den angivne mellemliggende mappe ikke eksisterer, forsøger PQTest at oprette den. Relative stier understøttes og løses i forhold til den aktuelle arbejdsmappe.