単体テストの処理
Note
この内容は、Visual Studio の従来の Power Query SDK に適用されます。 現在、Visual Studio Code の新しい Power Query SDK には、完全に機能するテスト フレームワークが含まれ、当社はテストと詳細の確認を推奨しています。
シンプルなコネクタと複雑なコネクタの両方に対して、単体テストを追加することがベスト プラクティスであり、それを強くお勧めします。
単体テストは、Visual Studio の Power Query SDK のコンテキストで実現されます。 各テストは、名前、予測値、実際値を持つ Fact
として定義されます。 ほとんどの場合、"実際値" は、式の一部をテストする M 式になります。
次の 3 つの関数をエクスポートするシンプルな拡張機能を検討してください。
section Unittesting;
shared UnitTesting.ReturnsABC = () => "ABC";
shared UnitTesting.Returns123 = () => "123";
shared UnitTesting.ReturnTableWithFiveRows = () => Table.Repeat(#table({"a"},{{1}}),5);
この単体テストのコードは、多数の Facts と、単体テスト フレームワーク (ValueToText
、Fact
、Facts
、Facts.Summarize
) 用の一連の共通コードで構成されています。 次のコードは、ファクトのセットの例を示しています (一般的なコードについては、UnitTesting.query.pq を参照してください)。
section UnitTestingTests;
shared MyExtension.UnitTest =
[
// Put any common variables here if you only want them to be evaluated once
// Fact(<Name of the Test>, <Expected Value>, <Actual Value>)
facts =
{
Fact("Check that this function returns 'ABC'", // name of the test
"ABC", // expected value
UnitTesting.ReturnsABC() // expression to evaluate (let or single statement)
),
Fact("Check that this function returns '123'",
"123",
UnitTesting.Returns123()
),
Fact("Result should contain 5 rows",
5,
Table.RowCount(UnitTesting.ReturnTableWithFiveRows())
),
Fact("Values should be equal (using a let statement)",
"Hello World",
let
a = "Hello World"
in
a
)
},
report = Facts.Summarize(facts)
][report];
サンプルを Visual Studio で実行すると、すべての Facts が評価され、成功率の概要が視覚的に示されます。
コネクタ開発プロセスの早い段階で単体テストを実装することで、テスト駆動開発の原則に従うことができます。 URI からホスト データのみを返す Uri.GetHost
という関数を記述する必要があるとします。 まず、テスト ケースを記述して、関数が想定される関数を適切に実行することを確認することができます。
Fact("Returns host from URI",
"https://bing.com",
Uri.GetHost("https://bing.com/subpath/query?param=1¶m2=hello")
),
Fact("Handles port number appropriately",
"https://bing.com:8080",
Uri.GetHost("https://bing.com:8080/subpath/query?param=1¶m2=hello")
)
追加のテストを記述して、関数がエッジ ケースを適切に処理することを確実にすることができます。
古いバージョンの関数を使用すると、一部は成功しますが、すべてのテストには成功しない可能性があります。
Uri.GetHost = (url) =>
let
parts = Uri.Parts(url)
in
parts[Scheme] & "://" & parts[Host]
関数の最終バージョンは、すべての単体テストに成功する必要があります。 関数に対する今後の更新によって、その基本的な機能が誤って削除されないことを確実にするのも簡単になります。