Condividi tramite


Gestione degli unit test

Nota

Questo contenuto è applicabile all'SDK di Power Query legacy in Visual Studio. Oggi il nuovo SDK di Power Query in Visual Studio Code contiene un framework di test completo che è consigliabile testare e ottenere altre informazioni.

Per connettori semplici e complessi, l'aggiunta di unit test è una procedura consigliata e consigliata.

Gli unit test sono eseguiti nel contesto di Power Query SDK di Visual Studio. Ogni test viene definito come un Fact oggetto con un nome, un valore previsto e un valore effettivo. Nella maggior parte dei casi, il "valore effettivo" sarà un'espressione M che verifica parte dell'espressione.

Si consideri una semplice estensione che esporta tre funzioni:

section Unittesting;

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

Questo codice di unit test è costituito da molti fatti e da un gruppo di codice comune per il framework di unit test (ValueToText, Fact, Facts, Facts.Summarize). Il codice seguente fornisce un esempio di set di fatti (passare a UnitTesting.query.pq per il codice comune):

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];

L'esecuzione dell'esempio in Visual Studio valuta tutti i fatti e visualizza un riepilogo visivo delle percentuali di passaggio:

Esempio di velocità di passaggio.

L'implementazione di unit test nelle prime fasi del processo di sviluppo del connettore consente di seguire i principi dello sviluppo basato su test. Si supponga di dover scrivere una funzione denominata Uri.GetHost che restituisce solo i dati host da un URI. È possibile iniziare scrivendo un test case per verificare che la funzione esegua correttamente la funzione prevista:

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")
)

È possibile scrivere più test per garantire che la funzione gestisca in modo appropriato i case perimetrali.

Una versione iniziale della funzione potrebbe superare alcuni test ma non tutti i test:

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

Alcuni test hanno esito negativo.

La versione finale della funzione deve superare tutti gli unit test. In questo modo è anche facile assicurarsi che gli aggiornamenti futuri alla funzione non rimuovono accidentalmente alcuna delle sue funzionalità di base.

Tutti i test hanno esito positivo.