compare コマンドを使用した回帰テスト
PQTest の compare コマンドは、コネクタの機能とコマンド テキストの生成を詳しく評価できる、回帰テスト用の優れたツールです。 その幅広い用途を説明するために、以降のセクションではさまざまなシナリオに合わせたいろいろな例を紹介します。
基本的なクエリ
最も簡単なテスト方法は、.query.pq ファイルに単一のクエリ式を追加し、compare コマンドを使ってこのファイルを実行することです。 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 - 出力ファイルが存在する場合にクエリ ファイルに対して 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": "Passed",
"SerializedSource": null,
"SourceError": null,
"OutputError": null
}
],
"Status": "Passed",
"Type": "PQTest.Expression"
}
]
パラメーター クエリを使用したテスト
パラメーター クエリは、ランタイム時にテスト クエリと組み合わされて、最初に実行されるクエリです。 この機能を使用すると、PQ/テスト クエリ ファイルをパラメーター クエリ ファイルとテスト クエリ ファイルの 2 つに分割できます。
パラメーターおよびテスト クエリ形式を使用した非依存型データ ソース テスト
この機能が役立つユース ケースの例として挙げられるのは、データ ソースに依存しないテスト スイートの作成です。 パラメーター クエリを使用してデータ ソースからデータを取得し、テスト クエリを汎用 M にすることができます。別のコネクタのテストを実行する場合は、その特定のデータ ソースを指すようにパラメーター クエリを追加または更新するだけです。
パラメーター クエリを使用する場合の主な違いは、テスト クエリが別の形式に従う点です。 数式ではなく、パラメーター クエリから返されるテーブルを表す 1 つの入力パラメーターを受け取る 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 コマンドの使用時は、診断チャネルをサブスクライブすることで、追加の診断情報を評価できます。 compare コマンドを実行すると、PQTest は、イベントが発生したサブスクライブされているチャネルごとに .diagnostics ファイルを出力します。 それ以降の実行では、診断イベントと、.pqout に似たその .diagnostics ファイルが比較されます。
例 5 - クエリ フォールディングを検証するために ODBC (Open Database Connectivity) 診断チャネルをサブスクライブする
次の例では、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
クエリがフォールディングされ、次の ODBC コマンド テキストが .diagnostics ファイルに生成されています。
[
{
"Command": "DESCRIBE default.DATABASE;"
},
{
"Command": "select top 1 max(`number_column`) as `C1` from `SPARK`.`default`.`DATABASE`"
}
]
設定ファイルの使用
compare コマンドのコマンド ライン入力パラメーターは、JSON 設定ファイルを使用して渡すこともできます。 JSON には次のオプションがあります。
オプション | Type | 説明 |
---|---|---|
ExtensionPaths | array | コネクタ ファイル (mez/pqx) を指すパスの配列。 |
FailOnMissingOutputFile | [bool] | compare で PQOut ファイルを生成せず、ファイルが存在しない場合は失敗します。 |
FailOnFoldingFailure | [bool] | クエリ フォールディング エラーがスローされた場合、比較は失敗します。 |
ParameterQueryFilePath | string | M 式を含むクエリ ファイル。ランタイム時にテスト クエリ ファイルと組み合わされます。 一般的なユース ケースは、複数のテスト クエリのデータを取得する M 式を指定するための単一のパラメーター クエリ ファイルを用意することです。 |
QueryFilePath | string | テストする M 式 (.pq) を含むクエリ ファイル。 |
TrxReportPath | string | 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
}
compare コマンドを使用したテスト バッテリー
テスト バッテリーは、コードの複数の側面を評価するテストのコレクションです。 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