Membuat Unit Testing Pada Aplikasi ASP.NET Core

1 Maret 2024

Halo kawan-kawan Dev! Tutorial ini akan membahas cara menyusun Unit Testing pada sebuah project .NET menggunakan xUnit.

Testing merupakan bagian penting pada software development. Proses testing dapat membantu kita untuk mendeteksi isu atau galat yang ada pada aplikasi kita. Kita pun dapat melakukan testing secara manual atau otomatis pada project kita. Namun sebagai developer, testing akan lebih efisien apabila dilakukan secara otomotis. Nah, salah satu implementasi dari testing secara otomatis adalah unit testing.

Unit testing sendiri adalah proses testing yang melibatkan tiap komponen yang ada pada aplikasi. Hal ini dilakukan untuk mengetahui proses pada masing-masing komponen tadi secara spesifik dan terpisah sesuai dengan hasil yang diinginkan pada tiap komponen tadi.

Topi Seleksi

Project pada tutorial ini akan menggunakan Unit Testing untuk aplikasi yang memakai ASP.NET Core MVC. Aplikasi yang akan kita buat merupakan aplikasi untuk pemilihan asrama bagi siswa siswi sekolah sihir Hogwarts. Terdapat 4 asrama yaitu Slytherin, Gryffindor, Ravenclaw, Hufflepuff. Setiap siswa dan siswi di sekolah ini akan tinggal di satu asrama sesuai pilihan topi seleksi secara acak. Nah, aplikasi yang kita buat nanti akan mempunyai fungsi yang sama dengan topi seleksi.

Pembuatan Aplikasi

Okay, mari kita buat aplikasi topi seleksi untuk pelajar sekolah sihir Hogwarts. Buka PowerShell (Windows) atau terminal (Linux dan macOS) dan buat sebuah folder dengan nama ‘aplikasi-topi-seleksi-hogwarts’. Saya akan menggunakan terminal untuk membuat folder ini.

mkdir aplikasi-topi-seleksi-hogwarts && cd aplikasi-topi-seleksi-hogwarts

Selanjutnya, kita akan membuat dua project yaitu TopiSeleksi dan TopiSeleksi.Tests untuk testing. Pertama kita buat dulu aplikasi TopiSeleksi menggunakan perintah ini.

dotnet new mvc -o TopiSeleksi

kemudian perintah ini untuk membuat TopiSeleksi.Tests

dotnet new xunit -o TopiSeleksi.Tests

Setelah melakukan perinth tadi, kita lanjutkan untuk membuat solution pada project kita.

dotnet new sln

Tambahkan TopiSeleksi kedalam solution tadi.

dotnet sln add ./TopiSeleksi/TopiSeleksi.csproj

Tambahkan juga TopiSeleksi.Tests ke solution yang sama.

dotnet sln add ./TopiSeleksi.Tests/TopiSeleksi.Tests.csproj

Setelah langkah membuat solution, kita harus membuat TopiSeleksi sebagai dependency untuk project TopiSeleksi.Tests.

dotnet add ./TopiSeleksi.Tests/TopiSeleksi.Tests.csproj reference ./TopiSeleksi/TopiSeleksi.csproj

Isi folder ‘aplikasi-topi-seleksi-hogwarts’ adalah TopiSeleksi, TopiSeleksi.Tests, dan aplikasi-topi-seleksi-hogwarts.sln.

Buka folder ‘aplikasi-topi-seleksi-hogwarts’ menggunakan VS Code atau IDE favorit kawan-kawan sekalian. Langkah selanjutnya adalah membuat SeleksiController pada folder TopiSeleksi/Controller untuk proses pengumpulan nama siswa siswi dan hasil asrama untuk mereka. Berikut kode pada SeleksiController.

using Microsoft.AspNetCore.Mvc;

namespace TopiSeleksi.Controllers
{
    public class SeleksiController : Controller
    {
        public IActionResult Index(string name)
        {
            if (!ModelState.IsValid || String.IsNullOrEmpty(name))
            {
                return BadRequest(ModelState);
            }

            string[] houses = ["Gryffindor", "Hufflepuff", "Ravenclaw", "Slytherin"];
            Random random = new();
            var randomIndex = random.Next(houses.Length);
            ViewData["house"] = houses[randomIndex];
            ViewData["name"] = name;

            return View();
        }
    }
}

SeleksiController ini mempunyai satu method yaitu Index dan method ini menerima satu paramater yaitu ’name’ yang bertipe string. SeleksiController menghasilkan BadRequest apabila model state invalid. Variable house menyimpan informasi asrama pada sekolah sihir Hogwarts. Kemudian kita menggunakan Random class untuk melakukan pemilihan asrama pada pelajar Hogwarts.

Langkah berikutnya adalah membuat tampilan untuk Index method. Buat sebuah folder yaitu Seleksi di dalam folder TopiSeleksi/Views. Pada folder TopiSeleksi/Views/Seleksi buat sebuah file yaitu Index.cshtml dan Copy kode berikut.

@{
  ViewData["Title"] = "Seleksi Asrama";
}

<h1>@ViewData["Title"]</h1>
<p>Hello @ViewData["name"]! Asrama anda adalah @ViewData["house"].</p>

Pada folder ‘aplikasi-topi-seleksi-hogwarts’, jalankan aplikasi kita menggunakan perintah ini.

dotnet run --project ./TopiSeleksi

Apabila teman teman mengunjungi /seleksi, maka akan muncul bad request information. Kita harus menyediakan paramater name untuk rute ini. Kita bisa bisa mengunjungi rute tadi dan menambahkan name seperti berikut /seleksi?name=Latuharhari dan kawan-kawan akan melihat hasil seleksi asramanya. Untuk menghentikan aplikasi kita, gunakan Ctrl + C pada terminal atau PowerShell.

Pembuatan Unit Test

Okay mari kita buat test untuk aplikasi TopiSeleksi. Sebelum membuat test, kita hapus terlebih dahulu default test dari .NET yaitu TopiSeleksi.Tests/UnitTest1.cs. Lalu kita buat SeleksiControllerTests.cs di dalam TopiSeleksi.Tests. File ini akan kita gunakan untuk melakukan test terhadap SeleksiController. Berikut kode untuk SeleksiControllerTests.cs.

using Microsoft.AspNetCore.Mvc;
using TopiSeleksi.Controllers;

namespace TopiSeleksi.Tests
{
    public class SeleksiControllerTests
    {
        [Fact]
        public void Index_ReturnsAViewResult_WithHouseInformation()
        {
            var controller = new SeleksiController();
            var result = controller.Index("Silvano Suprapto") as ViewResult;
            string[] houses = ["Gryffindor", "Hufflepuff", "Ravenclaw", "Slytherin"];
            var house = result!.ViewData["house"] as string;

            Assert.IsType<ViewResult>(result);
            Assert.Contains(house, houses);
        }

        [Fact]
        public void IndexPost_ReturnsBadRequestResult_WhenModelStateIsInvalid()
        {
            var controller = new SeleksiController();
            var result = controller.Index(String.Empty);
            var badRequestResult = Assert.IsType<BadRequestObjectResult>(result);
            Assert.IsType<SerializableError>(badRequestResult.Value);
        }
    }
}

SeleksiControllerTests.cs melakukan dua test pada SeleksiController. Test Index_ReturnsAViewResult_WithHouseInformation() merupakan test untuk memastikan Index method menghasilkan output yang tepat yaitu pilihan asrama apabila diberikan input yang sesuai.

Test IndexPost_ReturnsBadRequestResult_WhenModelStateIsInvalid() berfungsi untuk input yang membuat Model State menjadi invalid maka Index method harus memberikan respon Bad Request.

Atribut [Fact] merupakan definisi pada method sebagai sebuah test method yang harus dijalankan saat proses testing.

Test dapat dijalankan dari folder ‘aplikasi-topi-seleksi-hogwarts’ menggunakan perintah berikut.

dotnet test

Perintah dotnet test akan melakukan build pada project dan menjalankan test. Selanjutnya, kawan-kawan akan melihat hasilnya di terminal bahwa semua test nya lolos (passed).

...
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.

Passed!  - Failed:     0, Passed:     2, Skipped:     0, Total:     2, Duration: 28 ms - TopiSeleksi.Tests.dll (net8.0)

TopiSeleksi sudah kita dites dengan melakukan unit testing. Dari project ini, kawan-kawan bisa menambah skenario test tambahan untuk project ini. Dari contoh project sederhana ini juga, semoga bisa tergambar dengan jelas bagaimana menyusun unit testing pada sebuah project .NET menggunakan xUnit.

Repository untuk tutorial ini sudah tersedia di Github DevKage ya kawan-kawan.

Happy coding!

Source Code Tutorial - Github DevKage
Suka konten ini? ❤️ Dukung DevKage melalui Saweria.