Teilen über


Handhabung von Unit-Tests

Hinweis

Dieser Inhalt gilt für das ältere Power Query SDK in Visual Studio. Heute enthält das neue Power Query SDK in Visual Studio Code ein voll funktionsfähiges Testframework, das Sie unbedingt testen sollten, um mehr darüber zu erfahren.

Sowohl für einfache als auch für komplexe Konnektoren ist das Hinzufügen von Unit-Tests eine bewährte Praxis und sehr empfehlenswert.

Unit-Tests werden im Zusammenhang mit dem Power Query SDK von Visual Studio durchgeführt. Jeder Test ist als Fact definiert, der einen Namen, einen erwarteten Wert und einen tatsächlichen Wert hat. In den meisten Fällen wird der „tatsächliche Wert“ ein M-Ausdruck sein, der einen Teil Ihres Ausdrucks testet.

Betrachten Sie eine einfache Erweiterung, die drei Funktionen exportiert:

section Unittesting;

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

Dieser Unittest-Code besteht aus vielen Fakten und einer Reihe von allgemeinem Code für das Unit-Test-Framework (ValueToText, Fact, Facts, Facts.Summarize). Der folgende Code enthält einen Beispielsatz von Fakten (gehen Sie zu UnitTesting.query.pq für den allgemeinen Code):

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

Wenn Sie das Beispiel in Visual Studio ausführen, werden alle Fakten ausgewertet und Sie erhalten eine visuelle Zusammenfassung der Erfolgsquoten:

Beispiel für Weitergaberaten.

Die Implementierung von Unit-Tests zu einem frühen Zeitpunkt im Entwicklungsprozess von Konnektoren ermöglicht es Ihnen, die Prinzipien der testgesteuerten Entwicklung zu befolgen. Stellen Sie sich vor, Sie müssen eine Funktion namens Uri.GetHost schreiben, die nur die Hostdaten aus einem URL zurückgibt. Sie könnten damit beginnen, einen Testfall zu schreiben, um zu überprüfen, ob Function die erwartete Funktion ordnungsgemäß ausführt:

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

Es können zusätzliche Tests geschrieben werden, um sicherzustellen, dass die Funktion Grenzfälle ordnungsgemäß behandelt.

Eine frühe Version der Funktion könnte einige, aber nicht alle Tests bestehen:

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

Einige Tests schlagen fehl.

Die endgültige Version der Funktion sollte alle Unit-Tests bestehen. Auf diese Weise können Sie auch sicherstellen, dass künftige Aktualisierungen der Funktion nicht versehentlich eine ihrer Grundfunktionen entfernen.

Alle Tests erfolgreich.