Bagikan melalui


Mulai menggunakan Pengujian Unit Langsung

Saat Anda mengaktifkan Pengujian Unit Langsung dalam solusi Visual Studio, cakupan pengujian dan status pengujian Anda akan digambarkan secara visual. Pengujian Unit Langsung juga secara dinamis menjalankan pengujian setiap kali Anda memodifikasi kode dan segera memberi tahu Anda ketika perubahan Anda menyebabkan pengujian gagal.

Pengujian Unit Langsung dapat digunakan untuk menguji solusi yang menargetkan .NET Framework, .NET Core, atau .NET 5+. Dalam tutorial ini, Anda akan belajar menggunakan Pengujian Unit Langsung dengan membuat pustaka kelas sederhana yang menargetkan .NET, dan Anda akan membuat proyek MSTest yang menargetkan .NET untuk mengujinya.

Solusi C# lengkap dapat diunduh dari repositori MicrosoftDocs/visualstudio-docs di GitHub.

Prasyarat

Tutorial ini mengharuskan Anda menginstal edisi Visual Studio Enterprise dengan beban kerja pengembangan desktop .NET.

Membuat solusi dan proyek pustaka kelas .NET Framework

Mulailah dengan membuat solusi Visual Studio bernama UtilityLibraries yang terdiri dari satu proyek pustaka kelas .NET, StringLibrary.

Solusinya adalah satu kontainer untuk satu atau beberapa proyek. Untuk membuat solusi kosong, buka Visual Studio dan lakukan hal berikut:

  1. Pilih File>Baru>Proyek dari menu Visual Studio tingkat atas.

  2. Ketik solusi ke dalam kotak pencarian templat, lalu pilih templat Solusi Kosong. Beri nama proyek UtilityLibraries.

  3. Selesaikan pembuatan solusi.

Setelah membuat solusi, Anda akan membuat pustaka kelas .NET Framework bernama StringLibrary yang berisi sejumlah metode ekstensi untuk bekerja dengan string.

  1. Di Penjelajah Solusi, klik kanan pada solusi UtilityLibraries dan pilih Tambahkan>Proyek Baru.

  2. Ketik pustaka kelas ke dalam kotak pencarian templat, dan pilih templat Pustaka Kelas yang menargetkan .NET atau .NET Standard. Klik Berikutnya.

  3. Beri nama proyek StringLibrary.

  4. Klik Buat untuk membuat proyek.

  5. Ganti semua kode yang ada di editor kode dengan kode berikut:

    using System;
    
    namespace UtilityLibraries
    {
        public static class StringLibrary
        {
            public static bool StartsWithUpper(this string s)
            {
                if (String.IsNullOrWhiteSpace(s))
                    return false;
    
                return Char.IsUpper(s[0]);
            }
    
            public static bool StartsWithLower(this string s)
            {
                if (String.IsNullOrWhiteSpace(s))
                    return false;
    
                return Char.IsLower(s[0]);
            }
    
            public static bool HasEmbeddedSpaces(this string s)
            {
                foreach (var ch in s.Trim())
                {
                    if (ch == ' ')
                        return true;
                }
                return false;
            }
        }
    }
    

    StringLibrary memiliki tiga metode statik:

    • StartsWithUpper mengembalikan true jika string dimulai dengan karakter huruf besar; jika tidak, false akan dikembalikan.

    • StartsWithLower mengembalikan true jika string dimulai dengan karakter huruf kecil; jika tidak, false akan dikembalikan.

    • HasEmbeddedSpaces mengembalkan true jika string berisi karakter spasi kosong yang disematkan; jika tidak, false akan dikembalikan.

  6. Pilih Build>Solusi Build dari menu Visual Studio tingkat atas. Build itu seharusnya berhasil dimulai.

Membuat proyek pengujian

Langkah selanjutnya adalah membuat proyek pengujian unit untuk menguji pustaka StringLibrary. Buat pengujian unit dengan melakukan langkah-langkah berikut:

  1. Di Penjelajah Solusi, klik kanan pada solusi UtilityLibraries dan pilih Tambahkan>Proyek Baru.

  2. Ketik pengujian unit ke dalam kotak pencarian templat, pilih C# sebagai bahasa, lalu pilih MSTest Unit Test Project untuk templat .NET. Klik Berikutnya.

    Catatan

    Di Visual Studio 2019 versi 16.9, nama templat proyek MSTest adalah Unit Test Project.

  3. Beri nama proyek StringLibraryTests dan klik Berikutnya.

  4. Pilih kerangka kerja target yang direkomendasikan atau .NET 8, lalu pilih Buat.

    Catatan

    Tutorial memulai ini menggunakan Pengujian Unit Langsung dengan kerangka kerja pengujian MSTest. Anda juga dapat menggunakan kerangka kerja pengujian xUnit dan NUnit.

  5. Proyek pengujian unit tidak dapat mengakses pustaka kelas yang sedang diuji secara otomatis. Anda memberikan akses pustaka pengujian dengan menambahkan referensi ke proyek pustaka kelas .NET Framework. Untuk melakukan ini, klik StringLibraryTests kanan proyek dan pilih Tambahkan>Referensi Proyek. Dalam dialog Manajer Referensi, pastikan tab Solusi dipilih, dan pilih proyek StringLibrary, seperti yang diperlihatkan dalam ilustrasi berikut.

    The Reference Manager dialog

    The Reference Manager dialog

  6. Ganti kode pengujian unit boilerplate yang disediakan oleh templat dengan kode berikut:

    using System;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using UtilityLibraries;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public class UnitTest1
        {
            [TestMethod]
            public void TestStartsWithUpper()
            {
                // Tests that we expect to return true.
                string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва" };
                foreach (var word in words)
                {
                    bool result = word.StartsWithUpper();
                    Assert.IsTrue(result,
                                  $"Expected for '{word}': true; Actual: {result}");
                }
            }
    
            [TestMethod]
            public void TestDoesNotStartWithUpper()
            {
                // Tests that we expect to return false.
                string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                                   "1234", ".", ";", " " };
                foreach (var word in words)
                {
                    bool result = word.StartsWithUpper();
                    Assert.IsFalse(result,
                                   $"Expected for '{word}': false; Actual: {result}");
                }
            }
    
            [TestMethod]
            public void DirectCallWithNullOrEmpty()
            {
                // Tests that we expect to return false.
                string[] words = { String.Empty, null };
                foreach (var word in words)
                {
                    bool result = StringLibrary.StartsWithUpper(word);
                    Assert.IsFalse(result,
                                   $"Expected for '{(word == null ? "<null>" : word)}': " +
                                   $"false; Actual: {result}");
                }
            }
        }
    }
    
  7. Simpan proyek Anda dengan memilih ikon Simpan pada toolbar.

    Karena kode pengujian unit menyertakan beberapa karakter non-ASCII, Anda akan melihat dialog berikut untuk memperingatkan bahwa beberapa karakter akan hilang jika Anda menyimpan file dalam format ASCII defaultnya.

  8. Pilih tombol Simpan dengan Pengodean Lainnya.

    Choose a file encoding

    Choose a file encoding

  9. Dalam daftar drop-down Pengodean dialog Opsi Simpan Lanjutan, pilih Unicode (UTF-8 tanpa tanda tangan) - Codepage 65001, seperti yang ditunjukkan oleh ilustrasi berikut:

    Choosing the UTF-8 encoding

  10. Kompilasi proyek pengujian unit dengan memilih Build>Solusi Build Ulang dari menu Visual Studio tingkat atas.

Anda telah membuat pustaka kelas .NET Framework serta beberapa pengujian unit untuknya. Anda sekarang telah menyelesaikan persiapan yang diperlukan untuk menggunakan Pengujian Unit Langsung.

Mengaktifkan Pengujian Unit Langsung

Sejauh ini, meskipun Anda telah menulis pengujian untuk pustaka kelas .NET Framework StringLibrary, Anda belum menjalankannya. Pengujian Unit Langsung menjalankannya secara otomatis setelah Anda mengaktifkannya. Untuk melakukannya, lakukan berikut ini:

  1. Secara opsional, pilih jendela editor kode yang berisi kode untuk StringLibrary. Ini adalah Class1.cs untuk proyek C# atau Class1.vb untuk proyek Visual Basic. (Langkah ini memungkinkan Anda memeriksa hasil pengujian secara visual dan sejauh mana cakupan kode setelah Anda mengaktifkan Pengujian Unit Langsung.)

  2. Pilih Pengujian>Pengujian Unit Langsung>Mulai dari menu Visual Studio tingkat atas.

  3. Verifikasi konfigurasi untuk Pengujian Unit Langsung dengan memastikan Repositori Root menyertakan jalur ke file sumber untuk proyek utilitas dan proyek pengujian. Pilih Berikutnya lalu Selesai.

  1. Di jendela Pengujian Unit Langsung, pilih tautan sertakan semua pengujian (Atau, pilih ikon tombol Daftar Putar, lalu pilih StringLibraryTest, yang memilih semua pengujian di bawahnya. Kemudian batal pilih tombol Daftar Putar untuk keluar dari mode edit.)

  2. Visual Studio akan membangun kembali proyek dan memulai Pengujian Unit Langsung, yang secara otomatis menjalankan semua pengujian Anda.

  1. Visual Studio akan membangun kembali proyek dan memulai Pengujian Unit Langsung, yang secara otomatis menjalankan semua pengujian Anda.

Setelah selesai menjalankan pengujian, Pengujian Unit Langsung menampilkan hasil keseluruhan dan hasil pengujian individu. Selain itu, jendela editor kode menampilkan cakupan kode pengujian dan hasil pengujian secara grafis. Seperti yang ditunjukkan oleh ilustrasi berikut, ketiga pengujian telah berhasil dijalankan. Ini juga menunjukkan bahwa pengujian kami telah mencakup semua jalur kode dalam metode StartsWithUpper, dan pengujian tersebut semuanya berhasil dijalankan (yang ditunjukkan oleh tanda centang hijau, "✓"). Akhirnya, ini menunjukkan bahwa tidak ada metode lain dalam StringLibrary yang memiliki cakupan kode (yang ditunjukkan oleh garis biru, "➖").

The Live Test Explorer and code editor window after starting Live Unit testing

The Live Test Explorer and code editor window after starting Live Unit testing

Anda juga bisa mendapatkan informasi lebih detail tentang cakupan pengujian dan hasil pengujian dengan memilih ikon cakupan kode tertentu di jendela editor kode. Untuk memeriksa detail ini, lakukan hal berikut:

  1. Klik tanda centang hijau pada baris yang bertuliskan if (String.IsNullOrWhiteSpace(s)) dalam metode StartsWithUpper. Seperti yang ditunjukkan oleh ilustrasi berikut, Pengujian Unit Langsung menunjukkan bahwa tiga pengujian mencakup baris kode tersebut, dan semuanya telah berhasil dijalankan.

    Code coverage for the if conditional statement

    Code coverage for the if conditional statement

  2. Klik tanda centang hijau pada baris yang bertuliskan return Char.IsUpper(s[0]) dalam metode StartsWithUpper. Seperti yang ditunjukkan oleh ilustrasi berikut, Pengujian Unit Langsung menunjukkan bahwa hanya dua pengujian yang mencakup baris kode tersebut, dan semuanya telah berhasil dijalankan.

    Code coverage for the return statement

    Code coverage for the return statement

Masalah utama yang diidentifikasi Pengujian Unit Langsung adalah cakupan kode yang tidak lengkap. Anda akan membahasnya di bagian berikutnya.

Memperluas cakupan pengujian

Di bagian ini, Anda akan mengembangkan pengujian unit ke metode StartsWithLower. Saat Anda melakukannya, Pengujian Unit Langsung akan terus menguji kode secara dinamis.

Untuk memperluas cakupan kode ke metode StartsWithLower, lakukan hal berikut:

  1. Tambahkan metode TestStartsWithLower dan TestDoesNotStartWithLower berikut ke file kode sumber pengujian proyek Anda:

    // Code to add to UnitTest1.cs
    [TestMethod]
    public void TestStartsWithLower()
    {
        // Tests that we expect to return true.
        string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство" };
        foreach (var word in words)
        {
            bool result = word.StartsWithLower();
            Assert.IsTrue(result,
                          $"Expected for '{word}': true; Actual: {result}");
        }
    }
    
    [TestMethod]
    public void TestDoesNotStartWithLower()
    {
        // Tests that we expect to return false.
        string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва",
                           "1234", ".", ";", " "};
        foreach (var word in words)
        {
            bool result = word.StartsWithLower();
            Assert.IsFalse(result,
                           $"Expected for '{word}': false; Actual: {result}");
        }
    }
    
  2. Ubah metode DirectCallWithNullOrEmpty dengan menambahkan kode berikut segera setelah panggilan ke metode Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsFalse.

    // Code to add to UnitTest1.cs
    result = StringLibrary.StartsWithLower(word);
    Assert.IsFalse(result,
                   $"Expected for '{(word == null ? "<null>" : word)}': " +
                   $"false; Actual: {result}");
    
  3. Pengujian Unit Langsung otomatis menjalankan pengujian baru dan yang diubah jika Anda mengubah kode sumber. Seperti yang ditunjukkan oleh ilustrasi berikut, semua pengujian, termasuk dua yang telah ditambahkan dan yang telah diubah, telah berhasil.

    The Live Test Explorer after expanding test coverage

    The Live Test Explorer after expanding test coverage

  4. Beralih ke jendela yang berisi kode sumber untuk kelas StringLibrary. Pengujian Unit Langsung sekarang menunjukkan bahwa cakupan kode kami diperluas ke metode StartsWithLower.

    Code coverage for the StartsWithLower method

    Code coverage for the StartsWithLower method

Dalam beberapa kasus, pengujian yang berhasil di Test Explorer mungkin berwarna abu-abu. Itu menunjukkan bahwa pengujian saat ini sedang dijalankan, atau bahwa pengujian belum berjalan lagi karena tidak ada perubahan kode yang akan memengaruhi pengujian sejak terakhir kali dijalankan.

Sejauh ini, semua pengujian kami telah berhasil. Di bagian berikutnya, kita akan memeriksa bagaimana Anda dapat menangani kegagalan pengujian.

Menangani kegagalan pengujian

Di bagian ini, Anda akan mempelajari cara menggunakan Pengujian Unit Langsung untuk mengidentifikasi, memecahkan masalah, dan mengatasi kegagalan pengujian. Anda akan melakukannya dengan memperluas cakupan pengujian ke metode HasEmbeddedSpaces.

  1. Tambahkan metode berikut ke file pengujian Anda:

    [TestMethod]
    public void TestHasEmbeddedSpaces()
    {
        // Tests that we expect to return true.
        string[] phrases = { "one car", "Name\u0009Description",
                             "Line1\nLine2", "Line3\u000ALine4",
                             "Line5\u000BLine6", "Line7\u000CLine8",
                             "Line0009\u000DLine10", "word1\u00A0word2" };
        foreach (var phrase in phrases)
        {
            bool result = phrase.HasEmbeddedSpaces();
            Assert.IsTrue(result,
                          $"Expected for '{phrase}': true; Actual: {result}");
        }
    }
    
  2. Ketika pengujian dijalankan, Pengujian Unit Langsung menunjukkan bahwa metode TestHasEmbeddedSpaces telah gagal, seperti yang ditunjukkan oleh ilustrasi berikut:

    The Live Test Explorer reporting a failed test

    The Live Test Explorer reporting a failed test

  3. Pilih jendela yang menampilkan kode pustaka. Pengujian Unit Langsung telah memperluas cakupan kode ke metode HasEmbeddedSpaces. Ini juga melaporkan kegagalan pengujian dengan menambahkan "🞩" merah ke baris yang dicakup oleh pengujian yang gagal.

  4. Arahkan kursor ke atas baris dengan tanda tangan metode HasEmbeddedSpaces. Pengujian Unit Langsung menampilkan tooltip yang melaporkan bahwa metode dicakup oleh satu pengujian, seperti yang ditunjukkan oleh ilustrasi berikut:

    Live Unit Testing information on a failed test

    Live Unit Testing information on a failed test

  5. Pilih pengujian TestHasEmbeddedSpaces yang gagal. Pengujian Unit Langsung memberi Anda beberapa opsi seperti menjalankan semua pengujian dan menelusuri kesalahan semua pengujian, seperti yang ditunjukkan oleh ilustrasi berikut:

    Live Unit Testing options for a failed test

    Live Unit Testing options for a failed test

  6. Pilih Debug Semua untuk men-debug pengujian yang gagal.

  7. Visual Studio menjalankan pengujian dalam mode debug.

    Pengujian menetapkan setiap string dalam array ke variabel bernama phrase dan meneruskannya ke metode HasEmbeddedSpaces. Eksekusi program dijeda dan memanggil debugger saat pertama kali ekspresi pernyataannya adalah false. Dialog pengecualian yang dihasilkan dari nilai tak terduga dalam panggilan metode Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsTrue diperlihatkan dalam ilustrasi berikut.

    Live Unit Testing exception dialog

    Live Unit Testing exception dialog

    Selain itu, semua alat penelusuran kesalahan yang disediakan Visual Studio tersedia untuk membantu kami memecahkan masalah pengujian yang gagal, seperti yang ditunjukkan oleh ilustrasi berikut:

    Visual Studio debugging tools

    Visual Studio debugging tools

    Perhatikan di jendela Autos bahwa nilai variabel phrase adalah "Name\tDescription", yang merupakan elemen kedua dari array. Metode pengujian mengharapkan HasEmbeddedSpaces untuk mengembalikan true ketika melewati string ini; bukan, mengembalikan false. Terbukti, "\t", karakter tab, tidak dikenali sebagai spasi yang disematkan.

  8. Pilih Debug>Lanjutkan, tekan F5, atau klik tombol Lanjutkan pada toolbar untuk melanjutkan eksekusi program pengujian. Karena terjadi pengecualian yang tidak tertangani, pengujian berakhir. Ini memberikan informasi yang cukup untuk penyelidikan awal bug. Baik TestHasEmbeddedSpaces (pengujian rutin) membuat asumsi yang salah, atau HasEmbeddedSpaces tidak mengenali semua spasi yang disematkan dengan benar.

  9. Untuk mendiagnosis dan memperbaiki masalah, mulailah dengan metode StringLibrary.HasEmbeddedSpaces. Lihat perbandingannya dalam metode HasEmbeddedSpaces. Ruang yang disematkan dianggap U+0020. Namun, Unicode Standar menyertakan sejumlah karakter spasi lainnya. Ini menunjukkan bahwa kode pustaka telah salah diuji untuk karakter spasi kosong.

  10. Ganti perbandingan kesetaraan dengan panggilan ke metode System.Char.IsWhiteSpace:

    if (Char.IsWhiteSpace(ch))
    
  11. Pengujian Unit Langsung otomatis menjalankan ulang metode pengujian yang gagal.

    Pengujian Unit Langsung menunjukkan hasil yang diperbarui muncul, yang juga muncul di jendela editor kode.