Regressionstestning med kommandot run-compare

Kommandot PQTest run-compare är ett kraftfullt verktyg för regressionstestning, så att du kan utvärdera funktionerna i anslutningsappen och genereringen av kommandotexten. För att illustrera dess mångsidighet ger de efterföljande avsnitten olika exempel som är skräddarsydda för olika scenarier.

Note

Kommandot run-compare ersätter föregående jämförelsekommando .

Testa indataformat

Kommandot run-compare har stöd för två testindataformat:

  • Uttrycksformat: Ett enda M-uttryck (till exempel ett uttryck eller funktionsanrop let ). Det här formatet är det enklaste formatet och lämpar sig för de flesta testscenarier.
  • Avsnittsdokumentformat: Ett M-avsnittsdokument som innehåller en eller flera avsnittsmedlemmar. Det här formatet är användbart för tester som kräver hjälpfunktioner, delade värden eller mer komplexa installationer.

När en testfil använder uttrycksformatet konverterar PQTest det automatiskt till ett avsnittsdokument internt före utvärderingen. Du kan också skriva dina testindata direkt som ett avsnittsdokument.

Exempel på uttrycksformat

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

Exempel på avsnittsdokumentformat

section Test;

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

När en parameterfråga tillhandahålls läggs parameterfrågan till som avsnittsmedlem i avsnittsdokumentet. Parameterfrågan utvärderas som en del av samma avsnitt, vilket gör att testfrågan kan referera till den direkt.

Grundläggande frågor

Den enklaste formen av testning är att lägga till ett enda frågeuttryck i en .query.pq fil som du kan köra med kommandot run-compare . PQTest utvärderar uttrycket och genererar en .pqout (utdata) fil med samma namn. För efterföljande körningar jämförs utdata som genererats från utvärderingen av .query.pq filen med filen (utdata) med .pqout samma namn och returnerar resultatet av utvärderingen.

Exempel 1 – Köra kommandot run-compare för en frågefil när en utdatafil inte finns

I följande exempel körs en enskild frågetestfil med det angivna Power Query-tillägget och genererar utdatafil att jämföra.

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

Exempel 2 – Köra kommandot run-compare för en frågefil när en utdatafil inte finns och flaggan FailOnMissingOutputFile har angetts

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

Exempel 3 – Köra kommandot run-compare för en frågefil med en utdatafil

I följande exempel körs en enskild frågetestfil med det angivna Power Query-tillägget, jämför den med utdatafilen och returnerar 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"
  }
]

Testa med parameterfråga

Parameterfråga är en fråga som kombineras med en testfråga vid körning, där parameterfrågan körs först. Med den här funktionen kan du dela upp filen ".query.pq" i två delar: parameterfrågefilen och testfrågefilen.

Agnostisk datakällatestning med parameter- och testfrågeformat

Ett exempel på ett användningsfall där den här funktionen skulle vara användbar är att skapa en datakällas agnostiska testsvit. Du kan använda parameterfrågan för att hämta data från datakällan och låta testfrågan vara allmän M. Om du vill köra testerna för en annan anslutningsapp behöver du bara lägga till/uppdatera parameterfrågan så att den pekar på den specifika datakällan.

En viktig skillnad när du använder en parameterfråga är att testfrågan följer ett annat format. I stället för att vara ett formeluttryck måste det vara en M-funktion som tar en indataparameter som representerar tabellen som returneras från parameterfrågan.

När en parameterfråga tillhandahålls läggs parameterfrågan till som en avsnittsmedlem i slutet av testets avsnittsdokument. Test- och parameterindata utvärderas sedan tillsammans som ett enda kombinationsavsnittsdokument.

Note

Om parameterfrågefilen innehåller fel (till exempel syntaxfel eller utvärderingsfel) rapporterar PQTest ett beskrivande fel som anger problemet med parameterfilen i stället för att orsaka ett oklart fel.

Anta att du har följande testfråga:

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

Om du vill konvertera den till en test- och parameterfråga måste du dela upp dem på följande sätt:

Parameterfråga:

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

Testfråga:

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

Exempel 4 – Använda både parameterfråga och testfråga med run-compare-kommandot

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

Jämföra diagnostik

Extra diagnostikinformation kan utvärderas när du använder kommandot run-compare genom att prenumerera på en diagnostikkanal. När kommandot run-compare körs matar PQTest ut en .diagnostics fil för varje prenumererad kanal som hade en händelse. Vid efterföljande körningar jämförs diagnostikhändelsen med dess .diagnostics-fil, på samma sätt som .pqout.

Exempel 5 – Prenumeration på diagnostikkanalen ODBC (Open Database Connectivity) för att validera frågedelegering

I följande exempel visas hur du kan prenumerera på ODBC-kanalen, som samlar in all SQL som genereras av ODBC-drivrutinen när frågedelegering används.

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

ODBC-diagnostikkanalen kan användas för att verifiera att en fråga optimeras och att den genererar rätt 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

Frågan viker nu och genererar följande ODBC-kommandotext i .diagnostics filen:

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

Använda en inställningsfil

Alla indataparameter för kommandoraden för körningsjämföringskommandot kan också skickas via en JSON-inställningsfil. JSON kan ha följande alternativ:

Option Typ Beskrivning
ExtensionPaths array Matris med sökvägar som pekar på anslutningsfilen (mez/pqx).
FelVidSaknadUtdatafil bool Run-compare genererar inte en PQOut-fil och misslyckas om den inte finns.
MisslyckasVidVikningsfel bool Körningsjämförelse misslyckas om en sökfråga inte fullständigt sammanställs. När det är aktiverat skapar frågor som inte kan vikas helt till datakällan ett fel i stället för att återgå till lokal utvärdering.
Parameterfrågesökväg string Frågefil som innehåller M-uttryck, som kombineras under körning med testfrågefilen. Ett vanligt användningsfall är att ha en frågefil med en enda parameter för att ange ett M-uttryck för att hämta data för flera testfrågor.
QueryFilePath string Frågefil som innehåller M-uttryck (.pq) som ska testas.
TrxReportPath string Genererar en TRX (Visual Studio Test Results File) resultatfil och separata JSON-filer för varje test i en viss sökväg.
DiagnosticChannels array Namn på diagnostikkanaler som ska kopplas till testkörningen (till exempel Odbc för att fånga query folding-satser).
IntermediateTestResultsFolder string Anpassad mappsökväg för lagring av mellanliggande testresultat.
BibehållMellantidaTestResultat bool Behåller mellanliggande testresultat när testkörningen har slutförts.

Om både kommandoradsindata och inställningsalternativ tillhandahålls prioriteras kommandoradsindata.

Exempel 6 – Använda inställningsfilen i stället för kommandoradsargument

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

Kommandot motsvarar följande kommando:

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

Där settings.json är följande JSON-fil:

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

Testa batterier med run-compare-kommandot

Ett testbatteri är en samling tester som utvärderar flera aspekter av koden. Placera frågefilerna i samma mapp så att PQTest enkelt kan hitta dem. I stället för att skicka ett specifikt testfilnamn anger du mappsökvägen och PQTest kör alla .query.pq-testfrågefiler i ett enda pass.

Exempel 7 – Köra ett batteri med tester

Anta en mapp med namnet test som innehåller följande filer:

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

Hela testbatteriet kan köras med hjälp av följande kommandorad:

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

Ignorera tester när du kör en serie tester

Ett test kan ignoreras när du kör ett batteri av tester genom att ändra tillägget för .query.pq-filen till .query.pq.ignore.

Exempel 8 – Ignorera ett test när du kör ett batteri med tester

Anta en mapp med namnet test som innehåller följande filer:

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

Filerna contoso.testa.query.pq och contoso.testc.query.pq körs men contoso.testb.query.pq.ignore ignoreras när följande kommando körs för att köra testbatteriet:

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

Filtreringstester

Med --testFilter alternativet kan du selektivt inkludera eller exkludera testfiler när du kör testbatterier. Det här alternativet använder globmönster för att matcha filsökvägar och kan anges flera gånger för att skapa komplexa filtreringsregler.

Inkluderingsfilter

Ange vilka filer som ska inkluderas i testkörningen med hjälp av standardglobmönster.

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

Exkluderingsfilter

Ange vilka filer som ska undantas från testkörningen med hjälp av prefixet ! för att ange undantagsmönster.

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

Flera filter

Du kan kombinera flera --testFilter alternativ för att skapa komplex filtreringslogik:

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

Filterbeteende

  • Implicit inkludering: När inga inkluderingsfilter har angetts tillämpas **/*.query.pq automatiskt.
  • Skiftlägesokänsligt: Alla mönster matchar utan hänsyn till skiftläge.
  • Orderoberoende: Filterordningen påverkar inte resultatet.
  • Sökvägsformat: Använd snedstreck (/) i mönster för kompatibilitet oavsett plattform.

Globmönsterexempel

Pattern Beskrivning
**/*.pq Alla .pq filer i valfri katalog
**/*.query.pq Alla .query.pq filer i valfri katalog
Suite1/**/*.pq Alla .pq filer under Suite1-katalogen
**/test*.pq Alla .pq filer som börjar med "test"
!BrokenTests/* Exkludera alla filer i katalogen BrokenTests
!**/*temp*.pq Exkludera alla .pq filer som innehåller "temp"
SpecificTest.pq Inkludera endast den specifika filen

Note

Filter gäller för den relativa sökvägen från den angivna frågekatalogen. Ett fel returneras om filter tillhandahålls och sökvägen till frågefilen pekar på en specifik fil i stället för en katalog. Använd citattecken runt mönster för att förhindra skalexpansion.

Lista testfiler utan körning

Med --listOnly alternativet kan du förhandsgranska vilka testfiler som skulle köras av kommandot run-compare utan att köra testerna. Det här alternativet är användbart för att verifiera testidentifiering och filterbeteende.

Exempel 9 – Lista över 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"
        }
    ]
}

Utdata innehåller följande fält:

  • SourcePath: QueryFilePath-värdet som angavs för kommandot (från -q alternativet).
  • TestFilters: En lista över alla TestFilter-värden som har tillämpats (från --testFilter alternativ).
  • Tester: En matris med testfilobjekt, där varje objekt innehåller:
    • Test: Testfilens filnamn.
    • RelativePath: Sökvägen i förhållande till bastestkatalogen som anges av -q.
    • AbsolutePath: Den fullständiga absoluta sökvägen till testfilen.

Kombinera med testfilter

Alternativet --listOnly respekterar alla --testFilter alternativ så att du kan förhandsgranska effekten av dina filter:

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

Note

Alla testfilter tillämpas innan de visas. Ingen faktisk testkörning sker när du använder --listOnly.

Hantera mellanliggande testresultat

Kommandot run-compare genererar mellanliggande filer under testkörningen, inklusive faktiska testutdatafiler (.pqout) och diagnostikfiler (.diagnostics). Som standard skapas dessa filer på en tillfällig plats med en datumbaserad undermappsstruktur och rensas automatiskt när testkörningen har slutförts.

Du kan styra det här beteendet med hjälp av två alternativ:

  • --intermediateTestResultsFolder | -itrf: Anger en anpassad mappsökväg för lagring av mellanliggande testresultat.
  • --persistIntermediateTestResults | -pitr: Behåller mellanliggande resultat när testkörningen har slutförts.

Exempel 10 – Använda en anpassad mellanliggande mapp och bevara resultat

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

Mellanliggande mappstruktur

När du anger en mellanliggande testresultatmapp skapar PQTest en datumbaserad undermappsstruktur för att organisera testresultat:

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

Rensningsbeteende

Rensningsbeteendet beror på om du anger en mellanliggande mapp och om du använder flaggan persist:

Scenario Angiven mellanliggande mapp Bevara flagga Beteende
1 No No Filer som skapats på temporär plats, datumbaserad undermapp som tagits bort efter tester
2 Yes No Filer som skapats i angiven mapp, datumbaserad undermapp som tagits bort efter tester
3 No Yes Filer som skapats på temporär plats, datumbaserad undermapp som tagits bort efter tester
4 Yes Yes Filer som skapats i angiven mapp, datumbaserad undermapp bevarad

Note

Om du vill spara mellanliggande resultat måste du ange både --intermediateTestResultsFolder och --persistIntermediateTestResults. Enbart --persistIntermediateTestResults flaggan utan att ange en mapp bevarar inte resultat. Om den angivna mellanliggande mappen inte finns försöker PQTest skapa den. Relativa sökvägar stöds och löses i förhållande till den aktuella arbetskatalogen.