Обработка модульного тестирования
Примечание.
Это содержимое применимо к устаревшей версии пакета 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 оценивает все факты и дает визуальную сводку по тарифам передачи:
Реализация модульного тестирования в начале процесса разработки соединителя позволяет следовать принципам разработки на основе тестов. Представьте, что необходимо написать функцию, которая Uri.GetHost
возвращает только данные узла из URI. Сначала можно написать тестовый случай, чтобы убедиться, что функция правильно выполняет ожидаемую функцию:
Fact("Returns host from URI",
"https://bing.com",
Uri.GetHost("https://bing.com/subpath/query?param=1¶m2=hello")
),
Fact("Handles port number appropriately",
"https://bing.com:8080",
Uri.GetHost("https://bing.com:8080/subpath/query?param=1¶m2=hello")
)
Дополнительные тесты можно записать, чтобы обеспечить правильную обработку пограничных вариантов функции.
Ранняя версия функции может пройти некоторые, но не все тесты:
Uri.GetHost = (url) =>
let
parts = Uri.Parts(url)
in
parts[Scheme] & "://" & parts[Host]
Последняя версия функции должна пройти все модульные тесты. Это также позволяет легко гарантировать, что будущие обновления функции не удаляются случайно.