使用 compare 命令进行回归测试

PQTest 比较 命令是用于回归测试的强大工具,可用于全面评估连接器的功能和生成命令文本。 为了说明其多功能性,后续部分将提供针对不同方案定制的各种示例。

基本查询

最简单的测试形式是将单个查询表达式添加到 .query.pq 文件,可以使用 比较 命令执行该文件。 PQTest 计算表达式并生成具有相同名称的 .pqout(输出)文件。 对于任何后续运行,它将从 .query.pq 文件的计算生成的输出与具有相同名称的 pqout(输出)文件进行比较,并返回计算的输出。

示例 1 - 当输出文件不存在时,为查询文件运行 compare 命令

以下示例使用指定的 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 标志时,为查询文件运行 compare 命令

<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 - 将参数查询和测试查询与 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"
  }
]

比较诊断

通过订阅诊断通道,可以使用 比较 命令评估额外的诊断信息。 运行 compare 命令时,PQTest 会为具有事件的每个订阅通道输出一个 .diagnostics 文件。 对于任何后续运行,它将诊断事件与其 .diagnostics 文件进行比较,类似于 .pqout。

示例 5 - 订阅 ODBC(开放数据库连接)诊断通道以验证查询折叠

以下示例演示如何订阅 ODBC 通道,该通道在使用查询折叠时捕获 ODBC 驱动程序生成的任何 SQL。

<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

查询现在折叠并生成 .diagnostics 文件中的以下 ODBC 命令文本:

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

使用设置文件

比较命令的任何命令行输入参数也可以通过 JSON 设置文件传递。 JSON 可以具有以下选项:

选项 类型 说明
ExtensionPaths 数组 指向连接器文件的路径数组(mez/pqx)。
在缺少输出文件时失败 布尔 比较不会生成 PQOut 文件,如果不存在,则失败。
FailOnFoldingFailure 布尔 如果引发查询折叠错误,则 Compare 失败。
ParameterQueryFilePath 字符串 包含 M 表达式的查询文件,该表达式在运行时与测试查询文件组合在一起。 常见的用例是有一个参数查询文件来指定 M 表达式来检索多个测试查询的数据。
QueryFilePath 字符串 包含要测试的 M 表达式 (.pq) 的查询文件。
TrxReportPath 字符串 为给定路径中的每个测试生成 TRX (Visual Studio 测试结果文件)结果文件和单独的 JSON 文件。
DiagnosticChannels 数组 要附加到测试运行中的诊断通道的名称(例如用于捕获查询折叠语句的 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
}

使用 compare 命令测试电池

测试套件是一组测试,用于评估代码的多个方面。 将查询文件放在同一文件夹中,以便 PQTest 可以轻松找到它们。 不需要传递特定的测试文件名,只需指定文件夹路径,PQTest 就会在一次执行中运行所有 .query.pq 测试查询文件。

示例 7 - 进行一系列测试

假设名为测试的文件夹包含以下文件:

  • 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 - 运行一组测试时忽略某项测试

假设名为测试的文件夹包含以下文件:

  • 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