Testowanie regresji za pomocą polecenia compare

Narzędzie PQTest compare to potężne narzędzie do testowania regresji, umożliwiające dokładną analizę funkcji łącznika i generowanie tekstu polecenia. Aby zilustrować jego wszechstronność, kolejne sekcje zawierają różne przykłady dostosowane do różnych scenariuszy.

Ważna

Polecenie run-compare zastępuje polecenie compare . Użyj polecenia run-compare do przyszłych testów regresji łączników Power Query.

Zapytania podstawowe

Najprostszą formą testowania jest dodanie pojedynczego wyrażenia zapytania do .query.pq pliku, które można wykonać za pomocą polecenia compare . Narzędzie PQTest oblicza wyrażenie i generuje .pqout (wyjściowy) plik o tej samej nazwie. W przypadku wszystkich kolejnych przebiegów porównuje dane wyjściowe wygenerowane z oceny .query.pq pliku z .pqout plikiem (wyjściowym) o tej samej nazwie i zwraca dane wyjściowe oceny.

Przykład 1 — uruchamianie polecenia porównania dla pliku zapytania, gdy plik wyjściowy nie istnieje

Poniższy przykład wykonuje pojedynczy plik testowy .query.pq zapytania przy użyciu określonego rozszerzenia Power Query i generuje plik wyjściowy do porównania.

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

Przykład 2 — uruchomienie polecenia porównania dla pliku zapytania, gdy plik wyjściowy nie istnieje, a flaga FailOnMissingOutputFile jest ustawiona

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

Przykład 3 — uruchamianie polecenia porównania dla pliku zapytania z istniejącym plikiem wyjściowym

Poniższy przykład wykonuje pojedynczy plik testowy zapytania przy użyciu określonego rozszerzenia Power Query, porównuje go z plikiem wyjściowym i zwraca wynik.

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

Testowanie za pomocą zapytania parametru

Zapytanie parametryczne to zapytanie, które jest łączone z zapytaniem testowym podczas wykonania, a zapytanie parametryczne uruchamia się jako pierwsze. Ta funkcja umożliwia podzielenie pliku zapytania PQ/test na dwie części: plik zapytania parametrów i plik zapytania testowego.

Niezależne testowanie źródła danych przy użyciu parametru i formatu zapytania testowego

Przykładem przypadku użycia, w którym ta funkcja byłaby przydatna, jest utworzenie niezależnego zestawu testów źródła danych. Możesz użyć zapytania parametru, aby pobrać dane ze źródła danych i mieć zapytanie testowe jako ogólne M. Jeśli chcesz uruchomić testy dla innego łącznika, wystarczy dodać/zaktualizować zapytanie parametru, aby wskazać to konkretne źródło danych.

Kluczową różnicą w przypadku używania zapytania parametru jest to, że zapytanie testowe jest zgodne z innym formatem. Zamiast być wyrażeniem formuły, musi to być funkcja M, która przyjmuje jeden parametr wejściowy, który reprezentuje tabelę zwracaną z zapytania parametru.

Załóżmy, że masz następujące zapytanie testowe:

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

Aby przekonwertować go na zapytanie testowe i parametrowe, należy je podzielić w następujący sposób:

Zapytanie parametru:

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

Zapytanie testowe:

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

Przykład 4 — używanie zarówno zapytania parametru, jak i zapytania testowego z poleceniem 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"
  }
]

Porównywanie diagnostyki

Dodatkowe informacje diagnostyczne można ocenić, korzystając z polecenia porównywania oraz subskrybując kanał diagnostyczny. Po uruchomieniu polecenia compare narzędzie PQTest generuje .diagnostics plik dla każdego subskrybowanego kanału, który miał zdarzenie. W przypadku wszystkich późniejszych uruchomień porównuje zdarzenie diagnostyczne z jego .diagnostics plikiem, podobnie jak .pqout.

Przykład 5 — subskrybowanie kanału diagnostycznego ODBC (Open Database Connectivity) w celu zweryfikowania redukcji zapytań

W poniższym przykładzie pokazano, jak zasubskrybować kanał ODBC, który przechwytuje wszystkie zapytania SQL wygenerowane przez sterownik ODBC, gdy stosowane jest składanie zapytań.

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

Kanał diagnostyczny ODBC może służyć do sprawdzania, czy zapytanie składa się i czy generuje prawidłowy kod 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

Zapytanie składa się i generuje następujący tekst polecenia ODBC w .diagnostics pliku:

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

Używanie pliku ustawień

Dowolny parametr wejściowy wiersza polecenia dla polecenia compare można również przekazać za pośrednictwem pliku ustawień JSON. Kod JSON może mieć następujące opcje:

Opcja Typ Opis
Ścieżki Rozszerzeń macierz Tablica ścieżek wskazujących plik łącznika (mez/pqx).
Zatrzymaj przy braku pliku wyjściowego bool Porównanie nie generuje pliku .pqout i kończy się niepowodzeniem, jeśli nie istnieje.
FailOnFoldingFailure bool Porównanie kończy się niepowodzeniem, jeśli wystąpi błąd składania zapytań.
ParameterQueryFilePath ciąg Plik zapytania zawierający wyrażenia języka M, który jest połączony w czasie wykonywania z plikiem zapytania testowego. Typowym przypadkiem użycia jest posiadanie pojedynczego pliku zapytania parametrów w celu określenia wyrażenia M w celu pobrania danych dla wielu zapytań testowych.
QueryFilePath ciąg Plik zapytania zawierający wyrażenie języka M (.pq) do przetestowania.
TrxReportPath ciąg TRX Generuje plik wyników (plik wyników testów programu Visual Studio) i oddzielne pliki JSON dla każdego testu w danej ścieżce.
DiagnosticChannels macierz Nazwa kanałów diagnostycznych, które mają być dołączone w trakcie testu (na przykład Odbc do zapisania instrukcji składania zapytań).

W przypadku, gdy dostępne są zarówno dane wejściowe wiersza polecenia, jak i opcja ustawień, priorytet mają dane wejściowe wiersza polecenia.

Przykład 6 — używanie pliku ustawień zamiast argumentów wiersza polecenia

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

Polecenie jest równoważne następującemu poleceniu:

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

Gdzie settings.json jest następującym plikiem JSON:

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

Testowanie baterii za pomocą polecenia compare

Bateria testowa to kolekcja testów, które oceniają wiele aspektów kodu. Umieść pliki zapytań w tym samym folderze, aby plik PQTest mógł je łatwo zlokalizować. Zamiast przekazywać określoną nazwę pliku testowego, określ ścieżkę folderu, a narzędzie PQTest wykona wszystkie pliki testowe .query.pq w jednym przebiegu.

Przykład 7 — uruchamianie baterii testów

Przy założeniu, że folder o nazwie test zawiera następujące pliki:

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

Całą baterię testową można uruchomić przy użyciu następującego wiersza polecenia:

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

Ignorowanie testów podczas uruchamiania baterii testów

Test można zignorować podczas uruchamiania baterii testów, zmieniając rozszerzenie pliku query.pq na .query.pq.ignore.

Przykład 8 — ignorowanie testu podczas uruchamiania baterii testów

Przy założeniu, że folder o nazwie test zawiera następujące pliki:

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

Pliki contoso.testa.query.pq i contoso.testc.query.pq są uruchamiane, ale contoso.testb.query.pq.ignore jest ignorowany po wykonaniu następującego polecenia w celu uruchomienia baterii testowej:

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