次の方法で共有


単体テストの処理

このコンテンツは、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);

この単体テスト コードは、多数のファクトと、単体テスト フレームワーク (ValueToTextFactFactsFacts.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 でサンプルを実行すると、すべてのファクトが評価され、合格率の概要が視覚的に示されます。

成功率の例を示す Visual Studio M クエリ出力のスクリーンショット。

コネクタ開発プロセスの早い段階で単体テストを実装することで、テスト駆動型開発の原則に従うことができます。 URI からホスト データのみを返す Uri.GetHost という関数を記述する必要があるとします。 まず、テスト ケースを記述して、関数が期待される関数を適切に実行することを確認します。

Fact("Returns host from URI",
    "https://bing.com",
    Uri.GetHost("https://bing.com/subpath/query?param=1&param2=hello")
),
Fact("Handles port number appropriately",
    "https://bing.com:8080",
    Uri.GetHost("https://bing.com:8080/subpath/query?param=1&param2=hello")
)

さらに多くのテストを記述して、関数がエッジ ケースを適切に処理することを確認できます。

関数の初期バージョンは、一部のテストに合格する可能性がありますが、すべてのテストに合格するわけではありません。

Uri.GetHost = (url) =>
    let
        parts = Uri.Parts(url)
    in
        parts[Scheme] & "://" & parts[Host]

一部のテストが失敗する Visual Studio M クエリ出力のスクリーンショット。

関数の最終バージョンは、すべての単体テストに合格する必要があります。 このバージョンでは、関数の将来の更新によって、その基本的な機能が誤って削除されないようにも容易になります。

すべてのテストが合格した Visual Studio M クエリ出力のスクリーンショット。