Latihan - Uji Unit Azure Function

Selesai

Pengujian unit adalah bagian mendasar dari metodologi Agile. Visual Studio menyediakan templat Uji proyek. Gunakan templat ini untuk membuat pengujian unit untuk aplikasi Anda, dan Anda dapat menerapkan teknik yang sama untuk pengujian untuk Azure Functions.

Dalam skenario situs web jam tangan mewah online, tim pengembangan Anda memiliki kebijakan untuk mencapai setidaknya 80% cakupan kode dalam pengujian unit. Anda ingin menerapkan kebijakan yang sama untuk Azure Functions.

Di sini, Anda akan melihat cara menggunakan xUnit kerangka kerja pengujian dengan Visual Studio untuk menguji Azure Functions.

Membuat proyek pengujian unit

Langkah pertama adalah membuat proyek yang berisi pengujian unit Anda, dan menambahkannya ke solusi yang memegang Azure Function App Anda. Gunakan langkah-langkah berikut untuk membuat proyek pengujian unit untuk menguji fungsi WatchInfo.

  1. Di Visual Studio, di jendela Solution Explorer, klik kanan solusi WatchPortalFunction, pilih Tambahkan, lalu pilih Proyek Baru.

    Cuplikan layar Solution Explorer, memperlihatkan perintah Tambahkan proyek baru ke solusi.

  2. Di jendela Tambahkan proyek baru, gulir ke bawah, pilih template ikon xUnit Test ProjectC#+, lalu pilih Berikutnya.

    Cuplikan layar jendela Tambahkan Proyek Baru. Templat Proyek Pengujian xUnit dipilih.

  3. Jendela Konfigurasikan proyek baru Anda muncul. Di bidang Nama proyek, masukkan WatchFunctionsTests. Selain bidang Lokasi, pilih ikon jelajah, lalu pilih folder WatchPortalFunction.

  4. Pilih Selanjutnya. Jendela Informasi tambahan muncul.

  5. Di bawah Kerangka Kerja Target. terima nilai default .NET 6.0 (Dukungan jangka panjang).

  6. Pilih Buat.

  7. Saat proyek ditambahkan, klik kanan proyek WatchFunctionTests di jendela Penjelajah Solusi, lalu pilih Kelola Paket NuGet.

  8. Di jendela NuGet: WatchFunctionTests, pilih tab Telusuri. Dalam kotak Pencarian, masukkan Microsoft.AspNetCore.Mvc. Pilih paket Microsoft.AspNetCore.Mvc, lalu pilih Instal.

    Cuplikan layar jendela Manajer Paket NuGet. Pengguna sedang menginstal paket Microsoft.AspNetCore.Mvc.

    Catatan

    Proyek pengujian akan membuat lingkungan HTTP tiruan. Kelas yang diperlukan untuk melakukan ini ada dalam paket Microsoft.AspNetCore.Mvc.

  9. Tunggu sementara paket diinstal. Jika kotak pesan Perubahan Pratinjau muncul, pilih OK. Dalam kotak pesan Penerimaan Lisensi, pilih Saya Terima.

  10. Setelah paket ditambahkan, di jendela Penjelajah Solusi, di bawah proyek WatchFunctionsTests, klik kanan file UnitTest1.cs, lalu pilih Ganti Nama. Ubah nama file menjadi WatchFunctionUnitTests.cs. Dalam kotak pesan yang muncul, untuk mengganti nama semua referensi UnitTest1 menjadi WatchFunctionUnitTests, pilih Ya.

  11. Di jendela Penjelajah Solusi, di bawah proyek WatchFunctionsTests, klik kanan Dependensi, lalu pilih Tambahkan Proyek.

  12. Di jendela Manajer Referensi, pilih proyek WatchPortalFunction, lalu pilih OK.

Menambahkan pengujian unit untuk fungsi WatchInfo

Anda sekarang dapat menambahkan pengujian unit ke proyek pengujian. Dalam skenario pengawasan mewah, Anda ingin memastikan fungsi WatchInfo selalu mengembalikan respons OK saat model disediakan dalam string kueri permintaan, dan Respons buruk jika string kueri kosong atau tidak berisi model parameter.

Untuk memverifikasi perilaku ini, Anda menambahkan sepasang pengujian Fakta ke WatchFunctionsTests.

  1. Di jendela Penjelajah Solusi, untuk menampilkan WatchPortalFunction di jendela kode, klik ganda file WatchFunctionUnitTests.cs.

  2. Di bagian atas file, tambahkan using arahan berikut ke daftar.

    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Http.Internal;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Primitives;
    using Microsoft.Extensions.Logging.Abstractions;
    
  3. Ubah nama metode Test1 menjadi TestWatchFunctionSuccess.

  4. Dalam isi metode TestWatchFunctionSuccess, tambahkan kode berikut. Pernyataan ini membuat konteks HTTP tiruan dan permintaan HTTP. Permintaan menyertakan string kueri yang menyertakan model parameter, yang diatur ke abc.

    var queryStringValue = "abc";
    var request = new DefaultHttpRequest(new DefaultHttpContext())
    {
        Query = new QueryCollection
        (
            new System.Collections.Generic.Dictionary<string, StringValues>()
            {
                { "model", queryStringValue }
            }
        )
    };
    
  5. Tambahkan pernyataan berikut ke metode ini. Pernyataan ini membuat pencatat dummy.

    var logger = NullLoggerFactory.Instance.CreateLogger("Null Logger");
    
  6. Tambahkan kode berikut ke metode . Pernyataan-pernyataan ini memanggil fungsi WatchInfo, meneruskan permintaan dummy dan logger sebagai parameter.

    var response = WatchPortalFunction.WatchInfo.Run(request, logger);
    response.Wait();
    
  7. Tambahkan kode berikut ke metode . Kode ini memeriksa bahwa respons dari fungsi sudah benar. Dalam hal ini, fungsi harus mengembalikan respons OK, yang berisi data yang diharapkan pada isi.

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

    Metode lengkap harus terlihat seperti berikut ini.

    [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. Tambahkan dua metode lagi bernama TestWatchFunctionFailureNoQueryString dan TestWatchFunctionFailureNoModel. TestWatchFunctionFailureNoQueryString memverifikasi bahwa fungsi WatchInfo gagal dengan baik jika tidak diberikan string kueri. TestWatchFunctionFailureNoModel memeriksa kegagalan yang sama jika fungsi tersebut melewati string kueri yang tidak berisi parameter model.

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

Jalankan tes

  1. Pada bilah menu atas, di bawah Uji, pilih Jalankan Semua Tes.

    Cuplikan layar menu Uji di Visual Studio. Pengguna telah memilih Jalankan -> Semua Pengujian.

  2. Di jendela Test Explorer, ketiga tes harus berhasil diselesaikan.

    Cuplikan layar jendela Team Explorer. Ketiga tes berjalan dengan sukses.

  3. Di jendela Solution Explorer, di bawah proyek WatchPortalFunction, untuk menampilkan file di editor kode, klik dua kali WatchInfo.cs.

  4. Temukan kode berikut.

    // Retrieve the model id from the query string
    string model = req.Query["model"];
    
  5. Ubah pernyataan yang menetapkan model variabel sebagai berikut. Perubahan ini mensimulasikan pengembang membuat kesalahan dalam kode.

    string model = req.Query["modelll"];
    
  6. Pada bilah menu atas, di bawah Uji, pilih Jalankan Semua Tes. Kali ini, tes TestWatchFunctionSuccess harus gagal. Kegagalan ini terjadi karena fungsi WatchInfo tidak menemukan parameter bernama modelll dalam string kueri, sehingga fungsi mengembalikan respons Buruk .

    Cuplikan layar jendela Team Explorer. Uji TestWatchFunctionSuccess pengujian gagal.

Di unit ini, Anda melihat cara membuat proyek pengujian unit, dan menerapkan pengujian unit untuk Azure Function.