Hanteringsenhetstestning
Kommentar
Det här innehållet gäller för äldre Power Query SDK i Visual Studio. Idag innehåller den nya Power Query SDK i Visual Studio Code ett fullständigt funktionsbaserat testramverk som vi rekommenderar att du testar och lär dig mer.
För både enkla och komplexa anslutningsappar är det bästa praxis att lägga till enhetstester och rekommenderas starkt.
Enhetstestning utförs i samband med Visual Studio Power Query SDK. Varje test definieras som ett Fact
som har ett namn, ett förväntat värde och ett faktiskt värde. I de flesta fall är det "faktiska värdet" ett M-uttryck som testar en del av uttrycket.
Överväg ett enkelt tillägg som exporterar tre funktioner:
section Unittesting;
shared UnitTesting.ReturnsABC = () => "ABC";
shared UnitTesting.Returns123 = () => "123";
shared UnitTesting.ReturnTableWithFiveRows = () => Table.Repeat(#table({"a"},{{1}}),5);
Den här enhetstestkoden består av många fakta och en massa gemensam kod för enhetstestramverket (ValueToText
, Fact
, Facts
, Facts.Summarize
). Följande kod innehåller en exempeluppsättning med fakta (gå till UnitTesting.query.pq för den vanliga koden):
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];
När du kör exemplet i Visual Studio utvärderas alla fakta och du får en visuell sammanfattning av passeringsfrekvensen:
Genom att implementera enhetstestning tidigt i anslutningsprocessen kan du följa principerna för testdriven utveckling. Anta att du behöver skriva en funktion med namnet Uri.GetHost
som endast returnerar värddata från en URI. Du kan börja med att skriva ett testfall för att kontrollera att funktionen utför den förväntade funktionen på rätt sätt:
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")
)
Fler tester kan skrivas för att säkerställa att funktionen hanterar kantfall på rätt sätt.
En tidig version av funktionen kan klara vissa men inte alla tester:
Uri.GetHost = (url) =>
let
parts = Uri.Parts(url)
in
parts[Scheme] & "://" & parts[Host]
Den slutliga versionen av funktionen bör klara alla enhetstester. Detta gör det också enkelt att se till att framtida uppdateringar av funktionen inte oavsiktligt tar bort någon av dess grundläggande funktioner.