Поделиться через


Обработка модульного тестирования

Замечание

Это содержимое применимо к устаревшей версии пакета SDK Power Query в Visual Studio. Сегодня новый пакет SDK Power Query в Visual Studio Code содержит полнофункциональную платформу тестирования , которую мы рекомендуем протестировать и узнать больше.

Для простых и сложных соединителей добавление модульных тестов является лучшей практикой и настоятельно рекомендуется.

Модульное тестирование выполняется в контексте пакета SDK Power Query Visual Studio. Каждый тест определяется как Fact, который имеет имя, ожидаемое значение и фактическое значение. В большинстве случаев "фактическое значение" — это выражение M, которое проверяет часть выражения.

Рассмотрим расширение, которое экспортирует три функции:

section Unittesting;

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

Этот код модульного теста состоит из множества фактов и набора общего кода для платформы модульных тестов (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 оценивает все тесты и дает визуальную сводку по проценту прохождения.

Снимок экрана: выходные данные запроса Visual Studio M с примером скорости передачи.

Реализация модульного тестирования в начале процесса разработки соединителя позволяет следовать принципам разработки на основе тестов. Представьте, что необходимо написать функцию, которая 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]

Снимок экрана: выходные данные запроса Visual Studio M, в которых некоторые тесты завершаются сбоем.

Последняя версия функции должна пройти все модульные тесты. Эта версия также позволяет легко убедиться, что будущие обновления функции не случайно удаляют какие-либо основные функциональные возможности.

Снимок экрана: выходные данные запроса Visual Studio M, где проходят все тесты.