Oefening: Een Azure-functie testen
Eenheidstests zijn een fundamenteel onderdeel van een Agile-methodologie. Visual Studio biedt de Test projectsjabloon. Gebruik deze sjabloon om de eenheidstests voor uw toepassingen te maken en u kunt dezelfde techniek toepassen om te testen voor Azure Functions.
In het scenario van de online website voor luxe horloges heeft uw ontwikkelteam een beleid om ten minste 80%% code-dekking te bereiken bij unit tests. U wilt hetzelfde beleid implementeren voor Azure Functions.
Hier ziet u hoe u het xUnit
testframework gebruikt met Visual Studio om Azure Functions te testen.
Een eenheidstestproject maken
De eerste stap is het maken van een project dat uw eenheidstests bevat en deze toevoegt aan de oplossing met uw Azure Function-app. Gebruik de volgende stappen om een eenheidstestproject te maken voor het testen van de functie WatchInfo .
Klik in Visual Studio in het venster Solution Explorer met de rechtermuisknop op de oplossing WatchPortalFunction , selecteer Toevoegen en selecteer vervolgens Nieuw project.
Schuif omlaag in het venster Een nieuw project toevoegen , selecteer de sjabloon xUnit Test ProjectC#+ en selecteer vervolgens Volgende.
Het venster Uw nieuwe project configureren wordt weergegeven. Voer WatchFunctionsTests in het veld Projectnaam in. Selecteer het bladerpictogram naast het veld Locatie en selecteer vervolgens de map WatchPortalFunction .
Kies Volgende. Het venster Aanvullende informatie wordt weergegeven.
Onder Doelframework. accepteer de standaardwaarde van .NET 6.0 (langetermijnondersteuning).
Selecteer maken.
Wanneer het project is toegevoegd, klikt u met de rechtermuisknop op het WatchFunctionTests-project in het venster Solution Explorer en selecteert u NuGet-pakketten beheren.
Selecteer in het venster NuGet: WatchFunctionTests het tabblad Bladeren . Voer in het zoekvak Microsoft.AspNetCore.Mvc in. Selecteer het Microsoft.AspNetCore.Mvc-pakket en selecteer vervolgens Installeren.
Notitie
Het testproject maakt een gesimuleerde HTTP-omgeving. De klassen die hiervoor nodig zijn, bevinden zich in het Microsoft.AspNetCore.Mvc-pakket .
Wacht tot het pakket is geïnstalleerd. Als het bericht Voorbeeld van wijzigingen wordt weergegeven, selecteert u OK. Selecteer in het berichtvenster Licentieacceptatie de optie Ik accepteer.
Nadat het pakket is toegevoegd, klikt u in het venster Solution Explorer onder het project WatchFunctionsTests met de rechtermuisknop op het UnitTest1.cs-bestand en selecteert u Naam wijzigen. Wijzig de naam van het bestand in WatchFunctionUnitTests.cs. Als u de naam van alle verwijzingen van UnitTest1 naar WatchFunctionUnitTests wilt wijzigen in het bericht dat wordt weergegeven, selecteert u Ja.
Klik in het venster Solution Explorer onder het Project WatchFunctionsTests met de rechtermuisknop op Afhankelijkheden en selecteer Vervolgens Projectverwijzing toevoegen.
Selecteer in het venster Reference Manager het WatchPortalFunction-project en selecteer vervolgens OK.
Eenheidstests voor de functie WatchInfo toevoegen
U kunt nu eenheidstests toevoegen aan het testproject. In het scenario voor luxe horloge wilt u ervoor zorgen dat de functie WatchInfo altijd een OK-antwoord retourneert wanneer een model wordt opgegeven in de queryreeks van een aanvraag en een ongeldig antwoord als de querytekenreeks leeg is of niet de model
parameter bevat.
Als u dit gedrag wilt controleren, voegt u een paar Feitentests toe aan de WatchFunctionsTests.
Dubbelklik in het venster Solution Explorer op het bestand WatchFunctionUnitTests.cs om watchPortalFunction weer te geven in het codevenster.
Voeg bovenaan het bestand de volgende
using
instructies toe aan de lijst.using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Internal; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Primitives; using Microsoft.Extensions.Logging.Abstractions;
Wijzig de naam van de methode Test1 in TestWatchFunctionSuccess.
Voeg in de hoofdtekst van de methode TestWatchFunctionSuccess de volgende code toe. Met deze instructie maakt u een gesimuleerde HTTP-context en een HTTP-aanvraag. De aanvraag bevat een queryreeks die de parameter
model
bevat, die is ingesteld opabc
.var queryStringValue = "abc"; var request = new DefaultHttpRequest(new DefaultHttpContext()) { Query = new QueryCollection ( new System.Collections.Generic.Dictionary<string, StringValues>() { { "model", queryStringValue } } ) };
Voeg de volgende instructie toe aan de methode. Met deze instructie maakt u een dummy logger.
var logger = NullLoggerFactory.Instance.CreateLogger("Null Logger");
Voeg de volgende code toe aan de methode. Met deze instructies wordt de functie WatchInfo aangeroepen, waarbij de dummyaanvraag en logger als parameters worden doorgegeven.
var response = WatchPortalFunction.WatchInfo.Run(request, logger); response.Wait();
Voeg de volgende code toe aan de methode. Met deze code wordt gecontroleerd of het antwoord van de functie juist is. In dit geval moet de functie een OK-antwoord retourneren met de verwachte gegevens in de hoofdtekst.
// Check that the response is an "OK" response Assert.IsAssignableFrom<OkObjectResult>(response.Result); // Check that the contents of the response are the expected contents var result = (OkObjectResult)response.Result; dynamic watchinfo = new { Manufacturer = "abc", CaseType = "Solid", Bezel = "Titanium", Dial = "Roman", CaseFinish = "Silver", Jewels = 15 }; string watchInfo = $"Watch Details: {watchinfo.Manufacturer}, {watchinfo.CaseType}, {watchinfo.Bezel}, {watchinfo.Dial}, {watchinfo.CaseFinish}, {watchinfo.Jewels}"; Assert.Equal(watchInfo, result.Value);
De volledige methode moet er als volgt uitzien.
[Fact] public void TestWatchFunctionSuccess() { var queryStringValue = "abc"; var request = new DefaultHttpRequest(new DefaultHttpContext()) { Query = new QueryCollection ( new System.Collections.Generic.Dictionary<string, StringValues>() { { "model", queryStringValue } } ) }; var logger = NullLoggerFactory.Instance.CreateLogger("Null Logger"); var response = WatchPortalFunction.WatchInfo.Run(request, logger); response.Wait(); // Check that the response is an "OK" response Assert.IsAssignableFrom<OkObjectResult>(response.Result); // Check that the contents of the response are the expected contents var result = (OkObjectResult)response.Result; dynamic watchinfo = new { Manufacturer = "abc", CaseType = "Solid", Bezel = "Titanium", Dial = "Roman", CaseFinish = "Silver", Jewels = 15 }; string watchInfo = $"Watch Details: {watchinfo.Manufacturer}, {watchinfo.CaseType}, {watchinfo.Bezel}, {watchinfo.Dial}, {watchinfo.CaseFinish}, {watchinfo.Jewels}"; Assert.Equal(watchInfo, result.Value); }
Voeg nog twee methoden toe met de naam TestWatchFunctionFailureNoQueryString en TestWatchFunctionFailureNoModel. De TestWatchFunctionFailureNoQueryString controleert of de functie WatchInfo probleemloos mislukt als deze geen querytekenreeks krijgt. De TestWatchFunctionFailureNoModel controleert op dezelfde fout als de functie wordt doorgegeven aan een queryreeks die geen modelparameter bevat.
[Fact] public void TestWatchFunctionFailureNoQueryString() { var request = new DefaultHttpRequest(new DefaultHttpContext()); var logger = NullLoggerFactory.Instance.CreateLogger("Null Logger"); var response = WatchPortalFunction.WatchInfo.Run(request, logger); response.Wait(); // Check that the response is an "Bad" response Assert.IsAssignableFrom<BadRequestObjectResult>(response.Result); // Check that the contents of the response are the expected contents var result = (BadRequestObjectResult)response.Result; Assert.Equal("Please provide a watch model in the query string", result.Value); } [Fact] public void TestWatchFunctionFailureNoModel() { var queryStringValue = "abc"; var request = new DefaultHttpRequest(new DefaultHttpContext()) { Query = new QueryCollection ( new System.Collections.Generic.Dictionary<string, StringValues>() { { "not-model", queryStringValue } } ) }; var logger = NullLoggerFactory.Instance.CreateLogger("Null Logger"); var response = WatchPortalFunction.WatchInfo.Run(request, logger); response.Wait(); // Check that the response is an "Bad" response Assert.IsAssignableFrom<BadRequestObjectResult>(response.Result); // Check that the contents of the response are the expected contents var result = (BadRequestObjectResult)response.Result; Assert.Equal("Please provide a watch model in the query string", result.Value); }
De tests uitvoeren
Selecteer Alle tests uitvoeren in de bovenste menubalk onder Testen.
In het venster TestVerkenner moeten alle drie de tests zijn voltooid.
Dubbelklik in het venster Solution Explorer , onder het Project WatchPortalFunction , op WatchInfo.cs om het bestand weer te geven in de code-editor.
Zoek de volgende code.
// Retrieve the model id from the query string string model = req.Query["model"];
Wijzig de instructie waarmee de
model
variabele als volgt wordt ingesteld. Deze wijziging simuleert de ontwikkelaar die een fout maakt in de code.string model = req.Query["modelll"];
Selecteer Alle tests uitvoeren in de bovenste menubalk onder Testen. Deze keer zou TestWatchFunctionSuccess moeten mislukken. Deze fout treedt op omdat de functie WatchInfo de parameter met de naam
modelll
in de querytekenreeks niet vindt, waardoor de functie een ongeldig antwoord retourneert.
In deze les hebt u gezien hoe u een eenheidstestproject maakt en eenheidstests implementeert voor een Azure-functie.