Oefening: Een eenheidstest uitvoeren voor een Azure-functie

Voltooid

Het testen van eenheden is een fundamenteel onderdeel van een Agile- methode. Visual Studio biedt de Test-projectsjabloon. Met deze sjabloon kunt u de eenheidstests voor uw toepassingen maken en u kunt dezelfde techniek toepassen om Azure Functions te testen.

In het scenario van de online website van het luxe horloge heeft uw ontwikkelteam een beleid om ten minste 80% codedekking te bereiken bij het testen van eenheden. 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 om de functie WatchInfo te testen.

  1. Klik in het venster Solution Explorer van Visual Studio met de rechtermuisknop op de oplossing WatchPortalFunction, selecteer Toevoegen en vervolgens Nieuw project.

    Schermopname van Solution Explorer met de opdracht om het nieuwe project aan de oplossing toe te voegen.

  2. Schuif omlaag in het venster Een nieuw project toevoegen, selecteer de sjabloon xUnit Test Project C#+ en selecteer vervolgens Volgende.

    Schermopname van het venster Nieuw project toevoegen. De sjabloon xUnit Test Project is geselecteerd.

  3. Het venster Uw nieuwe project configureren wordt weergegeven. Voer in het veld Projectnaam WatchFunctionsTests in. Naast het veld Locatie selecteert u het bladerpictogram en selecteert u vervolgens de map WatchPortalFunction .

  4. Selecteer Volgende. Het venster Aanvullende informatie wordt weergegeven.

  5. Onder Doelframework. accepteer de standaardwaarde van .NET 6.0 (langetermijnondersteuning).

  6. Selecteer Maken.

  7. 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.

  8. Selecteer in het venster NuGet: WatchFunctionTests het tabblad Bladeren. Voer in het zoekvak Microsoft.AspNetCore.Mvc in. Selecteer het pakket Microsoft.AspNetCore.Mvc en selecteer vervolgens Installeren.

    Schermopname van het venster NuGet Pakketbeheer. De gebruiker installeert het Microsoft.AspNetCore.Mvc-pakket.

    Notitie

    Het testproject maakt een imitatie-HTTP-omgeving. De klassen die nodig zijn om dit te doen, bevinden zich in het pakket Microsoft.AspNetCore.Mvc.

  9. Wacht tot het pakket is geïnstalleerd. Als het berichtvenster Preview Changes wordt weergegeven, selecteert u OK. Klik in het berichtvenster License Acceptance op I Accept.

  10. 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. Selecteer Yes in het berichtvenster dat wordt weergegeven om de naam van alle verwijzingen van UnitTest1 te wijzigen in WatchFunctionUnitTests.

  11. Klik in het venster Solution Explorer onder het Project WatchFunctionsTests met de rechtermuisknop op Afhankelijkheden en selecteer Vervolgens Projectverwijzing toevoegen.

  12. Selecteer in het venster Reference Manager het project WatchPortalFunction en selecteer vervolgens OK.

Eenheidstests voor de functie WatchInfo toevoegen

Nu kunt u eenheidstests toevoegen aan het testproject. In het scenario voor luxe horloges wilt u ervoor zorgen dat de functie WatchInfo altijd het antwoord OK retourneert wanneer een model in de queryreeks van een aanvraag wordt verstrekt, en het antwoord Bad als de queryreeks leeg is of niet de parameter model bevat.

Als u dit gedrag wilt controleren, voegt u een paar Feitentests toe aan de WatchFunctionsTests.

  1. Dubbelklik in het venster Solution Explorer op het WatchFunctionUnitTests.cs-bestand om de WatchPortalFunction weer te geven in het codevenster.

  2. Voeg de volgende using-instructies toe aan de lijst bovenaan het bestand.

    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Http.Internal;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Primitives;
    using Microsoft.Extensions.Logging.Abstractions;
    
  3. Wijzig de naam van de methode Test1 in TestWatchFunctionSuccess.

  4. Voeg in de hoofdtekst van de methode TestWatchFunctionSuccess de volgende code toe. Met deze instructie wordt een imitatie-HTTP-context en een HTTP-aanvraag gemaakt. De aanvraag bevat een queryreeks die de parameter model bevat. Deze is ingesteld op abc.

    var queryStringValue = "abc";
    var request = new DefaultHttpRequest(new DefaultHttpContext())
    {
        Query = new QueryCollection
        (
            new System.Collections.Generic.Dictionary<string, StringValues>()
            {
                { "model", queryStringValue }
            }
        )
    };
    
  5. Voeg de volgende instructie toe aan de-methode. Met deze instructie wordt een dummy berichtenlogboek gemaakt.

    var logger = NullLoggerFactory.Instance.CreateLogger("Null Logger");
    
  6. Voeg de volgende code toe aan de methode. Deze instructies roepen de functie WatchInfo aan en geven de dummy-aanvraag en logger als parameters door.

    var response = WatchPortalFunction.WatchInfo.Run(request, logger);
    response.Wait();
    
  7. 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);
    }
    
  8. Voeg nog twee methoden toe, met de naam TestWatchFunctionFailureNoQueryString en TestWatchFunctionFailureNoModel. De methode TestWatchFunctionFailureNoQueryString controleert of de functie WatchInfo correct afsluit als er geen queryreeks wordt opgegeven. De methode TestWatchFunctionFailureNoModel controleert op dezelfde fout als aan de functie een queryreeks wordt doorgegeven 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

  1. Selecteer Alle tests uitvoeren in de bovenste menubalk onder Testen.

    Schermopname van het menu Testen in Visual Studio. De gebruiker heeft Uitvoeren -> Alle tests geselecteerd.

  2. In het venster Test Explorer moeten de drie tests allemaal met succes zijn voltooid.

    Schermopname van het venster Teamverkenner. Alle drie de tests zijn uitgevoerd.

  3. Dubbelklik in het venster Solution Explorer onder het project WatchPortalFunction op WatchInfo.cs om het bestand in de code-editor weer te geven.

  4. Zoek de volgende code.

    // Retrieve the model id from the query string
    string model = req.Query["model"];
    
  5. Wijzig de instructie waarmee de variabele model wordt ingesteld als volgt. Deze wijziging simuleert de ontwikkelaar die een fout maakt in de code.

    string model = req.Query["modelll"];
    
  6. Selecteer Alle tests uitvoeren in de bovenste menubalk onder Testen. Deze keer moet de test TestWatchFunctionSuccess 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.

    Schermopname van het venster Teamverkenner. De test TestWatchFunctionSuccess is mislukt.

In deze les hebt u gezien hoe u een eenheidstestproject maakt en eenheidstests implementeert voor een Azure-functie.