共用方式為


處理單元測試

注意

此內容適用於Visual Studio中的舊版Power Query SDK。 今天,Visual Studio Code 中的新 Power Query SDK 包含功能完整的 測試架構 ,建議您進行測試並深入瞭解。

針對簡單和複雜的連接器,新增單元測試是最佳做法,強烈建議使用。

單元測試是在 Visual Studio 的 Power Query SDK 內容中完成的。 每個測試都會定義為 Fact 具有名稱、預期值和實際值的 。 在大部分情況下,「實際值」將會是測試部分表達式的 M 運算式。

請考慮匯出三個函式的簡單延伸模組:

section Unittesting;

shared UnitTesting.ReturnsABC = () => "ABC";
shared UnitTesting.Returns123 = () => "123";
shared UnitTesting.ReturnTableWithFiveRows = () => Table.Repeat(#table({"a"},{{1}}),5);

此單元測試程序代碼是由許多事實所組成,以及單元測試架構 (ValueToText、 、 FactFactsFacts.Summarize) 的一堆常見程序代碼。 下列程式代碼提供一組範例事實(移至 Common 程式代碼的 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 中執行範例會評估所有事實,並提供傳遞率的可視化摘要:

傳遞率的範例。

在連接器開發程式中早期實作單元測試可讓您遵循測試驅動開發的原則。 假設您需要撰寫名為 Uri.GetHost 的函式,只傳回來自URI的主機數據。 您可以從撰寫測試案例開始,確認函式是否適當地執行預期的函式:

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]

某些測試失敗。

式的最終版本 應該通過所有單元測試。 這也可讓您輕鬆地確保函式的未來更新不會意外移除其任何基本功能。

所有測試皆通過。