Alıştırma - Azure İşlevinde birim testi yapma

Tamamlandı 100 XP

Birim testi Çevik metodolojisinin temel parçalarından biridir. Visual Studio Test proje şablonunu sağlar. Bu şablonu kullanarak uygulamalarınız için birim testleri oluşturabilir ve Azure İşlevleri’ni test ederken aynı tekniği uygulayabilirsiniz.

Lüks saat çevrimiçi web sitesi senaryosunda geliştirme ekibinizin birim testinde en az %80 kod kapsamına ulaşma ilkesi vardır. Aynı ilkeyi Azure İşlevleri'ne de uygulamak isteyebilirsiniz.

Burada, Azure İşlevleri test etmek için Visual Studio ile test çerçevesinin xUnit nasıl kullanılacağını göreceksiniz.

Birim testi projesi oluşturma

İlk adım, birim testlerinizi içeren bir proje oluşturmak ve bunu Azure İşlev Uygulamanızı içeren çözüme eklemektir. WatchInfo işlevini test etmek amacıyla bir birim testi oluşturmak için aşağıdaki adımları kullanın.

  1. Visual Studio’da, Çözüm Gezgini penceresinde WatchPortalFunction çözümüne sağ tıklayın, Ekle’yi ve ardından Yeni Proje’yi seçin.

    Çözüme yeni proje ekle komutunun gösterildiği Çözüm Gezgini'nin ekran görüntüsü.

  2. Yeni proje ekle penceresinde aşağı kaydırın, xUnit Test Projesi C#+ simgesi şablonunu ve ardından İleri'yi seçin.

    Yeni Proje Ekle penceresinin ekran görüntüsü. xUnit Test Projesi şablonu seçilidir.

  3. Yeni projenizi yapılandırın penceresi açılır. Proje adı alanına WatchFunctionsTests yazın. Konum alanının yanında gözat simgesini ve ardından WatchPortalFunction klasörünü seçin.

  4. İleri'yi seçin. Ek bilgiler penceresi görüntülenir.

  5. Hedef Çerçeve'nin altında. varsayılan .NET 6.0 (Uzun süreli destek) değerini kabul edin.

  6. Oluştur'u belirleyin.

  7. Proje eklendiğinde, Çözüm Gezgini penceresinde WatchFunctionTests projesine sağ tıklayın ve ardından NuGet Paketlerini Yönet'i seçin.

  8. NuGet: WatchFunctionTests penceresinde Gözat sekmesini seçin. Arama kutusuna Microsoft.AspNetCore.Mvc yazın. Microsoft.AspNetCore.Mvc paketini ve ardından Yükle’yi seçin.

    NuGet Paket Yöneticisi penceresinin ekran görüntüsü. Kullanıcı Microsoft.AspNetCore.Mvc paketini yüklüyor.

    Not

    Test projesi sahte bir HTTP ortamı oluşturur. Bunu yapmak için gereken sınıflar Microsoft.AspNetCore.Mvc paketinin içindedir.

  9. Paket yüklenirken bekleyin. Değişiklikleri Önizle ileti kutusu görüntülenirse Tamam’ı seçin. Lisans Kabulü ileti kutusunda Kabul Ediyorum’u seçin.

  10. Paket eklendikten sonra, Çözüm Gezgini penceresinde, WatchFunctionsTests projesinin altında UnitTest1.cs dosyasına sağ tıklayın ve yeniden adlandır'ı seçin. Dosyanın adını WatchFunctionUnitTests.cs olarak değiştirin. Görüntülenen ileti kutusunda UnitTest1’e yönelik tüm başvuruları WatchFunctionUnitTests olarak yeniden adlandırmak için Evet’i seçin.

  11. Çözüm Gezgini penceresindeki WatchFunctionsTests projesinin altında Bağımlılıklar'a sağ tıklayın ve proje başvurusu ekle'yi seçin.

  12. Başvuru Yöneticisi penceresinde WatchPortalFunction projesini ve Tamam’ı seçin.

WatchInfo işlevi için birim testlerini ekleme

Artık test projesine birim testlerini ekleyebilirsiniz. Lüks saat senaryosunda WatchInfo işlevinin, sorgu dizesinde bir model sağlandığında her zaman OK yanıtını ve sorgu dizesi boş olduğunda veya parametresini içermediğinde model yanıtını döndürmesini istiyorsunuz.

Bu davranışı doğrulamak için WatchFunctionsTests'e bir çift Olgu testi eklersiniz.

  1. Çözüm Gezgini penceresinde, kod penceresinde WatchPortalFunction öğesini görüntülemek için WatchFunctionUnitTests.cs dosyasına çift tıklayın.

  2. Dosyanın en üstündeki listeye aşağıdaki using yönergelerini ekleyin.

    C#
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Http.Internal;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Primitives;
    using Microsoft.Extensions.Logging.Abstractions;
    
  3. Test1 yönteminin adını TestWatchFunctionSuccess olarak değiştirin.

  4. TestWatchFunctionSuccess yönteminin gövdesine aşağıdaki kodu ekleyin. Bu deyim sahte bir HTTP bağlamı ve HTTP isteği oluşturur. Sorguda model değerine ayarlanmış abc parametresini içeren bir sorgu dizesi yer alır.

    C#
    var queryStringValue = "abc";
    var request = new DefaultHttpRequest(new DefaultHttpContext())
    {
        Query = new QueryCollection
        (
            new System.Collections.Generic.Dictionary<string, StringValues>()
            {
                { "model", queryStringValue }
            }
        )
    };
    
  5. Yönteme aşağıdaki deyimi ekleyin. Bu deyim işlevsiz bir günlükçü oluşturur.

    C#
    var logger = NullLoggerFactory.Instance.CreateLogger("Null Logger");
    
  6. Aşağıdaki kodu yönteme ekleyin. Bu deyimler sahte isteği ve günlükçüyü parametre olarak geçirip WatchInfo işlevini çağırır.

    C#
    var response = WatchPortalFunction.WatchInfo.Run(request, logger);
    response.Wait();
    
  7. Aşağıdaki kodu yönteme ekleyin. Bu kod işlevinden gelen yanıtın doğru olup olmadığını denetler. Bu durumda işlevin gövdede beklenen verileri içeren bir Tamam yanıtı döndürmesi gerekir.

    C#
    // 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);
    

    Tam yöntem aşağıdaki gibi görünmelidir.

    C#
    [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. TestWatchFunctionFailureNoQueryString ve TestWatchFunctionFailureNoModel adlı iki yöntem daha ekleyin. TestWatchFunctionFailureNoQueryString yöntemi bir sorgu dizesi verilmediğinde WatchInfo işlevinin düzgün bir biçimde başarısız olduğunu doğrular. TestWatchFunctionFailureNoModel yöntemi, işleve model parametresi içermeyen bir sorgu dizesi geçirildiğinde aynı başarısızlığın oluşup oluşmadığını denetler.

    C#
    [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);
    }
    

Testleri çalıştırma

  1. Üst menü çubuğundaki Test'in altında Tüm Testleri Çalıştır'ı seçin.

    Visual Studio'da Test menüsünün ekran görüntüsü. Kullanıcı Çalıştır -> Tüm Testler'i seçti.

  2. Test Gezgini penceresinde testlerin üçünün de başarılı bir şekilde tamamlanması gerekir.

    Takım Gezgini penceresinin ekran görüntüsü. Üç test de başarıyla çalıştı.

  3. Çözüm Gezgini penceresindeki WatchPortalFunction projesinin altında WatchInfo.cs dosyasına çift tıklayarak dosyayı kod düzenleyicisinde görüntüleyin.

  4. Aşağıdaki kodu bulun.

    C#
    // Retrieve the model id from the query string
    string model = req.Query["model"];
    
  5. model değişkenini ayarlayan deyimi aşağıda gösterildiği gibi değiştirin. Bu değişiklik, geliştiricinin kodda hata yapmasının benzetimini oluşturur.

    C#
    string model = req.Query["modelll"];
    
  6. Üst menü çubuğundaki Test'in altında Tüm Testleri Çalıştır'ı seçin. Bu kez TestWatchFunctionSuccess testinin başarısız olması gerekir. Bu hatanın nedeni WatchInfo işlevinin sorgu dizesinde adlı parametreyi bulmaması ve bu nedenle işlevin Hatalımodelll.

    Takım Gezgini penceresinin ekran görüntüsü. TestWatchFunctionSuccess testi başarısız oldu.

Bu ünitede, bir birim testi projesi oluşturmayı ve Azure İşlevi için birim testlerini uygulamayı gördünüz.


Sonraki ünite: Özet

Önceki Sonraki