Поделиться через


Тестирование регрессии с помощью команды сравнения

Команда сравнения PQTest — это мощное средство для регрессии тестирования, позволяющее тщательно оценить функции соединителя и создание текста команды. Чтобы иллюстрировать его универсальность, последующие разделы будут предоставлять различные примеры, адаптированные к различным сценариям.

Базовые запросы

Простейшая форма тестирования — добавить одно выражение запроса в файл .query.pq, который можно выполнить с помощью команды сравнения. PQTest вычисляет выражение и создает PQout-файл с тем же именем. Для всех последующих запусков он сравнивает выходные данные, созданные из вычисления файла .query.pqq с файлом pqout (output) с тем же именем и возвращает выходные данные оценки.

Пример 1. Выполнение команды сравнения для файла запроса, если выходной файл не существует

В следующем примере выполняется один тестовый файл запроса с помощью указанного расширения Power Query и создается выходной файл для сравнения.

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

Пример 2. Выполнение команды сравнения для файла запроса, если выходной файл не существует, и флаг FailOnMissingOutputFile установлен

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

Пример 3. Выполнение команды сравнения для файла запроса с выходным файлом

В следующем примере выполняется один файл теста запроса с помощью указанного расширения Power Query, сравнивает его с выходным файлом и возвращает результат.

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

Тестирование с помощью запроса параметров

Запрос параметров — это запрос, объединенный с тестируемым запросом во время выполнения, с запросом параметра, выполняющимся первым. Эта функция позволяет разделить файл запроса PQ/test на две части: файл запроса параметров и файл тестового запроса.

Тестирование источника данных с использованием параметра и формата тестового запроса

Пример варианта использования, в котором эта функция будет полезна, заключается в создании набора неустранимых тестов источника данных. Запрос параметров можно использовать для получения данных из источника данных, а тестовый запрос — универсальным M. Если вы хотите запустить тесты для другого соединителя, необходимо только добавить или обновить запрос параметра, чтобы указать на этот конкретный источник данных.

Ключевое различие при использовании запроса параметров заключается в том, что тестовый запрос соответствует другому формату. Вместо выражения формулы она должна быть функцией M, которая принимает один входной параметр, который представляет таблицу, возвращаемую из запроса параметров.

Предположим, что у вас есть следующий тестовый запрос:

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

Чтобы преобразовать его в тестовый и параметровый запрос, необходимо разделить их следующим образом:

Запрос параметров:

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

Тестовый запрос:

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

Пример 4. Использование запроса параметров и тестового запроса с помощью команды сравнения

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

Сравнение диагностика

Дополнительные диагностические сведения можно оценить при использовании команды сравнения , подписавшись на канал диагностики. При выполнении команды сравнения PQTest выводит файл диагностика для каждого канала подписки, который имел событие. Для всех последующих запусков он сравнивает событие диагностики с его . диагностика файл, аналогичный Pqout.

Пример 5. Подписка на канал диагностики ODBC (open Database Подключение ivity) для проверки свертывания запросов

В следующем примере показано, как подписаться на канал ODBC, который фиксирует любой SQL, созданный драйвером ODBC при использовании свертывания запросов.

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

Канал диагностики ODBC можно использовать для проверки свертывания запроса и создания правильного 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

Теперь запрос сворачивать и генерировать следующий текст команды ODBC в объекте . файл диагностика:

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

Использование файла параметров

Любой входной параметр командной строки для команды сравнения также можно передать через файл параметров JSON. Json может иметь следующие параметры:

Вариант Тип Описание
ExtensionPaths array Массив путей, указывающих на файл соединителя (mez/pqx).
FailOnMissingOutputFile bool Сравнение не создает PQOut-файл и завершается ошибкой, если он не существует.
FailOnFoldingFailure bool Сравнение завершается ошибкой, если возникает ошибка свертывания запросов.
ParameterQueryFilePath строка Файл запроса, содержащий выражения M, которые объединяются во время выполнения с файлом тестового запроса. Распространенный вариант использования заключается в наличии одного файла запроса параметров, чтобы указать выражение M для получения данных для нескольких тестовых запросов.
QueryFilePath строка Файл запроса, содержащий тестируемое выражение M (PQ).
TrxReportPath строка Создает файл результатов TRX (файл результатов теста Visual Studio) и отделяет JSON-файлы для каждого теста в заданном пути.
DiagnosticChannels array Имя каналов диагностики для подключения к тестовой версии (например, Odbc для записи инструкций свертывания запросов).

В случае предоставления входных данных и параметров командной строки входные данные командной строки определяются приоритетом.

Пример 6. Использование файла параметров вместо аргументов командной строки

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

Приведенная выше команда эквивалентна следующей команде:

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

Где settings.json используется следующий JSON-файл:

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

Тестирование батарей с помощью команды сравнения

Тестовая батарея — это коллекция тестов, которые оценивают несколько аспектов кода. Поместите файлы запросов в ту же папку, чтобы PQTest легко найти их. Вместо передачи определенного имени тестового файла укажите путь к папке и PQTest выполняет все файлы тестового запроса .query.pq в одном проходе.

Пример 7. Запуск батареи тестов

Предположим, что папка с именем test содержит следующие файлы:

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

Всю тестовую батарею можно запустить с помощью следующей командной строки:

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

Игнорировать тесты при запуске батареи тестов

Тест можно игнорировать при выполнении батареи тестов, изменив расширение файла .query.pq на .query.pq.ignore.

Пример 8. Игнорируние теста при выполнении батареи тестов

Предположим, что папка с именем test содержит следующие файлы:

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

Файлы contoso.testa.query.pq и contoso.testc.query.pq выполняются, но contoso.testb.query.pq.ignore игнорируется при выполнении следующей команды для запуска тестовой батареи:

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