Bagikan melalui


Mulai menggunakan Pengujian Unit Langsung

Saat Anda mengaktifkan Pengujian Unit Langsung dalam solusi Visual Studio, itu secara visual menggambarkan cakupan pengujian Anda dan status pengujian Anda. 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 MicrosoftDocs/visualstudio-docs repo di GitHub.

Prasyarat

Tutorial ini mengharuskan Anda menginstal edisi Visual Studio Enterprise dengan workload pengembangan aplikasi desktop .NET.

Membuat solusi dan proyek pustaka kelas

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

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

  1. Pilih File >Proyek Baru> 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 bernama StringLibrary yang berisi sejumlah metode ekstensi untuk bekerja dengan string.

  1. Di Solution Explorer, 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 statis:

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

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

    • HasEmbeddedSpaces mengembalikan true jika string berisi karakter spasi putih yang disematkan; jika tidak, ia mengembalikan false.

  6. Pilih Build>Build Solution dari menu Visual Studio tingkat atas. Penyusunan harus berhasil.

Membuat proyek pengujian

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

  1. Di Solution Explorer, 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 sebagai templat .NET. Klik Berikutnya.

    Nota

    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.

    Nota

    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 secara otomatis mengakses pustaka kelas yang sedang diuji. Anda memberikan akses perpustakaan pengujian dengan menambahkan referensi ke proyek perpustakaan kelas. Untuk melakukan ini, klik kanan proyek StringLibraryTests dan pilih Tambahkan>Referensi Proyek. Dalam dialog Reference Manager, pastikan tab Solusi dipilih, dan pilih proyek StringLibrary, seperti yang diperlihatkan dalam ilustrasi berikut.

    Dialog Manajer Referensi

    dialog Manajer Referensi

  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.

    Pilih pengodean file

    Pilih pengkodean file

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

    Memilih pengodean UTF-8

  10. Kompilasikan proyek pengujian unit dengan memilih Build>Rebuild Solution dari menu utama Visual Studio.

Anda telah membuat pustaka kelas serta beberapa pengujian unit untuk itu. Anda sekarang telah menyelesaikan tahap pendahuluan yang diperlukan untuk menggunakan Pengujian Unit Langsung.

Aktifkan Pengujian Unit Langsung

Sejauh ini, meskipun Anda telah menulis tes untuk perpustakaan StringLibrary, Anda belum menjalankannya. Pengujian Unit Langsung menjalankannya secara otomatis setelah Anda mengaktifkannya. Untuk melakukannya, lakukan hal berikut:

  1. Secara opsional, pilih jendela editor kode yang berisi kode untuk StringLibrary. Ini 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 Anda setelah Anda mengaktifkan Pengujian Unit Langsung.)

  2. Pilih Test>Live Unit Testing>Mulai dari menu utama Visual Studio.

  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 pranala menyertakan semua pengujian (Atau, pilih ikon tombol Daftar Putar, lalu pilih StringLibraryTest, yang memilih semua pengujian di bawahnya. Kemudian hapus pilihan 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 menyelesaikan pengujian Anda, Pengujian Unit Langsung menampilkan baik hasil keseluruhan maupun hasil dari masing-masing pengujian. Selain itu, jendela editor kode secara grafis menampilkan cakupan kode pengujian Anda dan hasilnya untuk pengujian Anda. 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, "➖").

Jendela Live Test Explorer dan editor kode setelah memulai pengujian unit live

jendela Live Test Explorer dan editor kode setelah memulai Live Unit Testing

Anda juga bisa mendapatkan informasi lebih rinci 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 berbunyi if (String.IsNullOrWhiteSpace(s)) dalam metode StartsWithUpper. Seperti yang ditunjukkan oleh ilustrasi berikut, Pengujian Unit Langsung (Live Unit Testing) menunjukkan bahwa ada tiga pengujian yang mencakup baris kode itu, dan semuanya telah berhasil dijalankan.

    cakupan kode untuk pernyataan kondisional

    cakupan kode untuk pernyataan bersyarat if

  2. Klik tanda centang hijau pada baris yang berbunyi 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 bahwa semua telah berhasil dijalankan.

    cakupan kode untuk pernyataan pengembalian

    cakupan kode untuk pernyataan pengembalian

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

Perluas cakupan pengujian

Di bagian ini, Anda akan memperluas pengujian unit ke metode StartsWithLower. Saat Anda melakukannya, Pengujian Unit Langsung akan terus menguji kode Anda 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 secara otomatis menjalankan pengujian baru dan yang dimodifikasi saat Anda memodifikasi kode sumber Anda. Seperti yang ditunjukkan oleh ilustrasi berikut, semua pengujian, termasuk dua yang telah Anda tambahkan dan yang telah Anda ubah, telah berhasil.

    The Live Test Explorer setelah memperluas cakupan pengujian

    The Live Test Explorer setelah memperluas cakupan pengujian

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

    cakupan kode untuk metode StartsWithLower

    cakupan kode untuk metode StartsWithLower

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 tes kami telah berhasil. Di bagian berikutnya, kami akan memeriksa bagaimana Anda dapat menangani kegagalan pengujian.

Menangani kegagalan pengujian

Di bagian ini, Anda akan menjelajahi bagaimana Anda dapat menggunakan Pengujian Unit Langsung untuk mengidentifikasi, memecahkan masalah, dan mengatasi kegagalan pengujian. Anda akan melakukan ini 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. Saat pengujian dijalankan, Pengujian Unit Langsung menunjukkan bahwa metode TestHasEmbeddedSpaces telah gagal, seperti yang ditunjukkan oleh ilustrasi berikut:

    The Live Test Explorer melaporkan pengujian yang gagal

    The Live Test Explorer melaporkan pengujian yang gagal

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

  4. Arahkan mouse ke baris dengan penanda metode HasEmbeddedSpaces. Pengujian Unit Langsung menampilkan tipsalat yang melaporkan bahwa metode dicakup oleh satu pengujian, seperti yang ditunjukkan oleh ilustrasi berikut:

    informasi Pengujian Unit Langsung pada pengujian yang gagal

    informasi pengujian unit langsung pada pengujian yang mengalami kegagalan

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

    Opsi Pengujian Unit Langsung untuk pengujian yang gagal

    opsi Pengujian Unit Langsung untuk pengujian yang gagal

  6. Pilih Debug Semua untuk memperbaiki 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 berhenti dan memanggil debugger saat pertama kali ekpresi assert false. Dialog pengecualian yang dihasilkan dari nilai tak terduga dalam panggilan metode Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsTrue diperlihatkan dalam ilustrasi berikut.

    dialog pengecualian untuk Pengujian Unit Langsung

    dialog pengecualian Pengujian Unit Langsung

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

    alat penelusuran kesalahan Visual Studio

    alat penelusuran kesalahan Visual Studio

    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 lulus string ini; sebaliknya, ia mengembalikan false. Terbukti, ini tidak mengenali "\t", karakter tab, sebagai spasi yang disematkan.

  8. Pilih Debug>Lanjutkan, tekan F5, atau klik tombol Lanjutkan pada toolbar untuk terus menjalankan program pengujian. Karena terjadi pengecualian yang tidak tertangani, pengujian berakhir. Ini memberikan informasi yang cukup untuk penyelidikan awal bug. Baik TestHasEmbeddedSpaces (rutinitas pengujian) 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 perbandingan dalam metode HasEmbeddedSpaces. Ini menganggap ruang yang disematkan menjadi U+0020. Namun, Standar Unicode 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 secara otomatis menjalankan ulang metode uji yang gagal.

    Pengujian Unit Live menunjukkan hasil yang diperbarui, yang juga terlihat di jendela editor kode.