Live Unit Testing kullanmaya başlama

Visual Studio çözümünde Canlı Birim Testi'ni etkinleştirdiğinizde, test kapsamınızı ve testlerinizin durumunu görsel olarak gösterir. Live Unit Testing ayrıca kodunuzu her değiştirdiğinizde testleri dinamik olarak yürütür ve değişiklikleriniz testlerin başarısız olmasına neden olduğunda size hemen bildirir.

Canlı Birim Testi, .NET Framework, .NET Core veya .NET 5+ hedefli çözümleri test etmek için kullanılabilir. Bu öğreticide, .NET'i hedefleyen basit bir sınıf kitaplığı oluşturarak Live Unit Testing kullanmayı öğrenecek ve test etmek için .NET'i hedefleyen bir MSTest projesi oluşturacaksınız.

C# çözümünün tamamı GitHub'da MicrosoftDocs/visualstudio-docs deposundan indirilebilir.

Önkoşullar

Bu öğretici, .NET masaüstü geliştirme iş yüküyle Visual Studio Enterprise sürümünü yüklemiş olmanız gerekir.

Çözümü ve sınıf kitaplığı projesini oluşturma

Tek bir .NET sınıf kitaplığı projesi olan StringLibrary'den oluşan UtilityLibraries adlı bir Visual Studio çözümü oluşturarak başlayın.

Çözüm yalnızca bir veya daha fazla proje için bir kapsayıcıdır. Boş bir çözüm oluşturmak için Visual Studio'yu açın ve aşağıdakileri yapın:

  1. Üst düzey Visual Studio menüsünden Dosya>Yeni>Proje'yi seçin.

  2. Şablon arama kutusuna çözüm yazın ve ardından Boş Çözüm şablonunu seçin. Projeye UtilityLibraries adını verin.

  3. Çözümü oluşturmayı tamamlayın.

Çözümü oluşturduğunuza göre, dizelerle çalışmak için bir dizi uzantı yöntemi içeren StringLibrary adlı bir sınıf kitaplığı oluşturacaksınız.

  1. Çözüm Gezgini'da UtilityLibraries çözümüne sağ tıklayın ve Yeni Proje Ekle'yi>seçin.

  2. Şablon arama kutusuna sınıf kitaplığı yazın ve .NET veya .NET Standard'ı hedefleyen Sınıf Kitaplığı şablonunu seçin. İleri'ye tıklayın.

  3. Projeye StringLibrary adını verin.

  4. Projeyi oluşturmak için Oluştur'a tıklayın.

  5. Kod düzenleyicisindeki mevcut kodun tümünü aşağıdaki kodla değiştirin:

    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'nin üç statik yöntemi vardır:

    • StartsWithUpper dize büyük harf karakterle başlıyorsa döndürür true ; aksi takdirde döndürür false.

    • StartsWithLowerdize küçük harfle başlıyorsa döndürür true ; aksi takdirde döndürür false.

    • HasEmbeddedSpaces bir dize eklenmiş bir boşluk karakteri içeriyorsa döndürür true ; aksi takdirde döndürür false.

  6. Üst düzey Visual Studio menüsünden Derleme Çözümü Oluştur'a>tıklayın. Derleme başarılı olmalıdır.

Test projesini oluşturma

Sonraki adım, StringLibrary kitaplığını test etmek için birim testi projesi oluşturmaktır. Aşağıdaki adımları gerçekleştirerek birim testlerini oluşturun:

  1. Çözüm Gezgini'da UtilityLibraries çözümüne sağ tıklayın ve Yeni Proje Ekle'yi>seçin.

  2. Şablon arama kutusuna birim testi yazın, dil olarak C# seçeneğini belirleyin ve ardından .NET için MSTest Birim Test Projesi şablonunu seçin. İleri'ye tıklayın.

    Not

    Visual Studio 2019 sürüm 16.9'da, MSTest proje şablonu adı Birim Testi Projesi'dir.

  3. Projeye StringLibraryTests adını verin ve İleri'ye tıklayın.

  4. Önerilen hedef çerçeveyi veya .NET 8'i ve ardından Oluştur'u seçin.

    Not

    Bu başlangıç öğreticisinde MSTest test çerçevesiyle Live Unit Testing kullanılır. xUnit ve NUnit test çerçevelerini de kullanabilirsiniz.

  5. Birim testi projesi, testte olduğu sınıf kitaplığına otomatik olarak erişemiyor. Sınıf kitaplığı projesine başvuru ekleyerek test kitaplığına erişim verirsiniz. Bunu yapmak için projeye sağ tıklayın StringLibraryTests ve Proje Başvurusu Ekle'yi>seçin. Başvuru Yöneticisi iletişim kutusunda Çözüm sekmesinin seçili olduğundan emin olun ve aşağıdaki çizimde gösterildiği gibi StringLibrary projesini seçin.

    The Reference Manager dialog

    The Reference Manager dialog

  6. Şablon tarafından sağlanan ortak birim test kodunu aşağıdaki kodla değiştirin:

    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. Araç çubuğundaki Kaydet simgesini seçerek projenizi kaydedin.

    Birim testi kodu bazı ASCII olmayan karakterler içerdiğinden, dosyayı varsayılan ASCII biçiminde kaydederseniz bazı karakterlerin kaybolacağı konusunda uyarmak için aşağıdaki iletişim kutusunu görürsünüz.

  8. Diğer Kodlama ile Kaydet düğmesini seçin.

    Choose a file encoding

    Choose a file encoding

  9. Kaydetme Seçeneklerini İlerlet iletişim kutusunun Kodlama açılan listesinde, aşağıdaki çizimde gösterildiği gibi Unicode (imzasız UTF-8) - Codepage 65001'i seçin:

    Choosing the UTF-8 encoding

  10. En üst düzey Visual Studio menüsünden Derleme Yeniden Derleme>Çözümü'ne tıklayarak birim testi projesini derleyin.

Sınıf kitaplığı ve bunun için bazı birim testleri oluşturdunuz. Canlı Birim Testi'ni kullanmak için gereken ön hazırlıkları tamamladınız.

Canlı Birim Testlerini Etkinleştirme

Şu ana kadar StringLibrary sınıf kitaplığı için testleri yazdınız ancak henüz yürütmediniz. Canlı Birim Testi, etkinleştirdikten sonra bunları otomatik olarak yürütür. Bunu yapmak için aşağıdakileri yapın:

  1. İsteğe bağlı olarak StringLibrary kodunu içeren kod düzenleyicisi penceresini seçin. Bu, C# projesi için Class1.cs veya Visual Basic projesi için Class1.vb'dir . (Bu adım, Canlı Birim Testi'ni etkinleştirdikten sonra testlerinizin sonucunu ve kod kapsamınızın kapsamını görsel olarak incelemenizi sağlar.)

  2. Üst düzey Visual Studio menüsünden Test Canlı Birim Testi>Başlangıç'ı seçin.>

  3. Depo Kökü'nde hem yardımcı program projesi hem de test projesi için kaynak dosyaların yolunun bulunduğundan emin olarak Canlı Birim Testi yapılandırmasını doğrulayın. İleri'yi ve ardından Son'u seçin.

  1. Canlı Birim Testi penceresinde Tüm testleri dahil et bağlantısını seçin (Alternatif olarak, Çalma Listesi düğmesi simgesini ve ardından altındaki tüm testleri seçen StringLibraryTest'i seçin. Ardından düzenleme modundan çıkmak için Çalma Listesi düğmesinin seçimini kaldırın.)

  2. Visual Studio projeyi yeniden oluşturur ve tüm testlerinizi otomatik olarak çalıştıran Canlı Birim Testi'ni başlatır.

  1. Visual Studio projeyi yeniden oluşturur ve tüm testlerinizi otomatik olarak çalıştıran Canlı Birim Testi'ni başlatır.

Testlerinizi çalıştırmayı bitirdiğinde, Live Unit Testing hem genel sonuçları hem de tek tek testlerin sonuçlarını görüntüler. Buna ek olarak, kod düzenleyicisi penceresi hem test kodu kapsamınızı hem de testlerinizin sonucunu grafik olarak görüntüler. Aşağıdaki çizimde gösterildiği gibi, üç test de başarıyla yürütüldü. Ayrıca testlerimizin yöntemdeki tüm kod yollarını kapsadığını ve bu testlerin tümünün StartsWithUpper başarıyla yürütüldüğünü (yeşil onay işaretiyle gösterilir, "✓") gösterir. Son olarak, StringLibrary'deki diğer yöntemlerin hiçbirinin kod kapsamına sahip olmadığını gösterir (mavi çizgiyle gösterilir, "➖").

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

Ayrıca kod düzenleyicisi penceresinde belirli bir kod kapsamı simgesini seçerek test kapsamı ve test sonuçları hakkında daha ayrıntılı bilgi edinebilirsiniz. Bu ayrıntıyı incelemek için aşağıdakileri yapın:

  1. Yönteminde okunan if (String.IsNullOrWhiteSpace(s)) satırda yeşil onay işaretine StartsWithUpper tıklayın. Aşağıdaki çizimde gösterildiği gibi, Canlı Birim Testi üç testin bu kod satırını kapsadığını ve tümünün başarıyla yürütüldüğünü gösterir.

    Code coverage for the if conditional statement

    Code coverage for the if conditional statement

  2. Yönteminde okunan return Char.IsUpper(s[0]) satırda yeşil onay işaretine StartsWithUpper tıklayın. Aşağıdaki çizimde gösterildiği gibi, Live Unit Testing yalnızca iki testin bu kod satırını kapsadığını ve tümünün başarıyla yürütüldüğünü gösterir.

    Code coverage for the return statement

    Code coverage for the return statement

Live Unit Testing'in belirlemiş olduğu en önemli sorun eksik kod kapsamıdır. Sonraki bölümde ele alacağız.

Test kapsamını genişletme

Bu bölümde birim testlerinizi yöntemine StartsWithLower genişleteceksiniz. Bunu yaparken, Live Unit Testing kodunuzu dinamik olarak test etmeye devam eder.

Kod kapsamını yöntemine StartsWithLower genişletmek için aşağıdakileri yapın:

  1. Projenizin test kaynak kodu dosyasına aşağıdaki TestStartsWithLower ve TestDoesNotStartWithLower yöntemlerini ekleyin:

    // 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. yönteminin DirectCallWithNullOrEmpty çağrısından Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsFalse hemen sonra aşağıdaki kodu ekleyerek yöntemini değiştirin.

    // Code to add to UnitTest1.cs
    result = StringLibrary.StartsWithLower(word);
    Assert.IsFalse(result,
                   $"Expected for '{(word == null ? "<null>" : word)}': " +
                   $"false; Actual: {result}");
    
  3. Canlı Birim Testi, kaynak kodunuzu değiştirdiğinizde yeni ve değiştirilmiş testleri otomatik olarak yürütür. Aşağıdaki çizimde gösterildiği gibi, eklediğiniz ikisi ve değiştirdiğiniz test de dahil olmak üzere tüm testler başarılı olmuştur.

    The Live Test Explorer after expanding test coverage

    The Live Test Explorer after expanding test coverage

  4. StringLibrary sınıfının kaynak kodunu içeren pencereye geçin. Live Unit Testing artık kod kapsamımızın yöntemine StartsWithLower genişletildiğini gösteriyor.

    Code coverage for the StartsWithLower method

    Code coverage for the StartsWithLower method

Bazı durumlarda, Test Gezgini'ndeki başarılı testler gri gösterilebilir. Bu, testin şu anda yürütülmekte olduğunu veya testin son yürütüldükten sonra testi etkileyecek kod değişikliği olmadığından yeniden çalışmadığını gösterir.

Şimdiye kadar tüm testlerimiz başarılı oldu. Sonraki bölümde test hatasını nasıl işleyebileceğinizi inceleyeceğiz.

Test hatasını işleme

Bu bölümde, test hatalarını belirlemek, gidermek ve gidermek için Canlı Birim Testi'ni nasıl kullanabileceğinizi keşfedeceksiniz. Bunu, test kapsamını yöntemine HasEmbeddedSpaces genişleterek yapacaksınız.

  1. Test dosyanıza aşağıdaki yöntemi ekleyin:

    [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. Test yürütürken, Live Unit Testing aşağıdaki çizimde gösterildiği gibi yöntemin TestHasEmbeddedSpaces başarısız olduğunu gösterir:

    The Live Test Explorer reporting a failed test

    The Live Test Explorer reporting a failed test

  3. Kitaplık kodunu görüntüleyen pencereyi seçin. Live Unit Testing, kod kapsamını yöntemine HasEmbeddedSpaces genişletti. Ayrıca, başarısız testlerin kapsadığı satırlara kırmızı bir "🞩" ekleyerek test hatasını bildirir.

  4. Yöntem imzasını içeren satırın HasEmbeddedSpaces üzerine gelin. Canlı Birim Testi, aşağıdaki çizimde gösterildiği gibi yöntemin bir test kapsamında olduğunu bildiren bir araç ipucu görüntüler:

    Live Unit Testing information on a failed test

    Live Unit Testing information on a failed test

  5. Başarısız TestHasEmbeddedSpaces testini seçin. Canlı Birim Testi, aşağıdaki çizimde gösterildiği gibi tüm testleri çalıştırma ve tüm testlerde hata ayıklama gibi birkaç seçenek sunar:

    Live Unit Testing options for a failed test

    Live Unit Testing options for a failed test

  6. Başarısız testte hata ayıklamak için Tümünü Hatalarını Ayıkla'ya tıklayın.

  7. Visual Studio testi hata ayıklama modunda yürütür.

    Test, bir dizideki her dizeyi adlı phrase bir değişkene atar ve yöntemine HasEmbeddedSpaces geçirir. Program yürütme, assert ifadesi ilk kez olduğunda falsehata ayıklayıcısını duraklatır ve çağırır. Yöntem çağrısındaki Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsTrue beklenmeyen değerden kaynaklanan özel durum iletişim kutusu aşağıdaki çizimde gösterilmiştir.

    Live Unit Testing exception dialog

    Live Unit Testing exception dialog

    Ayrıca, aşağıdaki çizimde gösterildiği gibi, Visual Studio'nun sağladığı tüm hata ayıklama araçları başarısız testimizin sorunlarını gidermemize yardımcı olmak için kullanılabilir:

    Visual Studio debugging tools

    Visual Studio debugging tools

    Otomatikler penceresinde değişkenin değerinin phrase dizinin ikinci öğesi olan "Name\tDescription" olduğuna dikkat edin. Test yöntemi bu dize geçirildiğinde döndürülmesini true beklerHasEmbeddedSpaces; bunun yerine döndürürfalse. Açıkçası, sekme karakteri olan "\t" öğesini eklenmiş bir boşluk olarak tanımaz.

  8. Devam Et'i> seçin, F5 tuşuna basın veya test programını yürütmeye devam etmek için araç çubuğundaki Devam et düğmesine tıklayın. İşlenmeyen bir özel durum oluştuğundan test sonlandırılır. Bu, hatanın ön araştırması için yeterli bilgi sağlar. ( TestHasEmbeddedSpaces Test yordamı) yanlış bir varsayımda bulundu veya HasEmbeddedSpaces tüm katıştırılmış alanları doğru tanımıyor.

  9. Sorunu tanılamak ve düzeltmek için yöntemiyle StringLibrary.HasEmbeddedSpaces başlayın. yöntemindeki karşılaştırmaya HasEmbeddedSpaces bakın. Ekli bir alanı U+0020 olarak kabul eder. Ancak, Unicode Standart başka bir dizi boşluk karakteri içerir. Bu, kitaplık kodunun bir boşluk karakteri için yanlış test ettiğini gösterir.

  10. Eşitlik karşılaştırmasını yöntemine System.Char.IsWhiteSpace yapılan bir çağrıyla değiştirin:

    if (Char.IsWhiteSpace(ch))
    
  11. Live Unit Testing, başarısız test yöntemini otomatik olarak yeniden çalıştırır.

    Canlı Birim Testi, kod düzenleyicisi penceresinde de görünen güncelleştirilmiş sonuçların göründüğünü gösterir.