Share via


İzlenecek yol: Yönetilen kod için birim testleri oluşturma ve çalıştırma

Bu makalede, yönetilen kod ve Visual Studio Test Gezgini için Microsoft birim testi çerçevesini kullanarak bir dizi birim testi oluşturma, çalıştırma ve özelleştirme adımları gösterilmektedir. Geliştirme aşamasında olan bir C# projesiyle başlarsınız, kodunu kullanan testler oluşturur, testleri çalıştırır ve sonuçları incelersiniz. Ardından proje kodunu değiştirir ve testleri yeniden çalıştırırsınız. Bu adımları izlemeden önce bu görevlere kavramsal bir genel bakış istiyorsanız bkz . Birim testinin temelleri.

Test etmek için proje oluşturma

  1. Visual Studio'yu açın.

  2. Başlangıç penceresinde Yeni proje oluştur'u seçin.

  3. .NET için C# Konsol Uygulaması proje şablonunu arayıp seçin ve ardından İleri'ye tıklayın.

    Not

    Konsol Uygulaması şablonunu görmüyorsanız, Yeni proje oluştur penceresinden yükleyebilirsiniz. Aradığınızı bulamıyor musunuz? iletisinde Daha fazla araç ve özellik yükle bağlantısını seçin. Ardından Visual Studio Yükleyicisi .NET masaüstü geliştirme iş yükünü seçin.

  4. Projeyi Banka olarak adlandırın ve İleri'ye tıklayın.

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

    Banka projesi oluşturulur ve kod düzenleyicisinde Program.cs dosyası açık olarak Çözüm Gezgini görüntülenir.

    Not

    Program.cs düzenleyicide açık değilse, açmak için Çözüm Gezgini'daProgram.cs dosyasına çift tıklayın.

  5. Program.cs dosyasının içeriğini, BankAccount sınıfını tanımlayan aşağıdaki C# koduyla değiştirin:

    using System;
    
    namespace BankAccountNS
    {
        /// <summary>
        /// Bank account demo class.
        /// </summary>
        public class BankAccount
        {
            private readonly string m_customerName;
            private double m_balance;
    
            private BankAccount() { }
    
            public BankAccount(string customerName, double balance)
            {
                m_customerName = customerName;
                m_balance = balance;
            }
    
            public string CustomerName
            {
                get { return m_customerName; }
            }
    
            public double Balance
            {
                get { return m_balance; }
            }
    
            public void Debit(double amount)
            {
                if (amount > m_balance)
                {
                    throw new ArgumentOutOfRangeException("amount");
                }
    
                if (amount < 0)
                {
                    throw new ArgumentOutOfRangeException("amount");
                }
    
                m_balance += amount; // intentionally incorrect code
            }
    
            public void Credit(double amount)
            {
                if (amount < 0)
                {
                    throw new ArgumentOutOfRangeException("amount");
                }
    
                m_balance += amount;
            }
    
            public static void Main()
            {
                BankAccount ba = new BankAccount("Mr. Bryan Walton", 11.99);
    
                ba.Credit(5.77);
                ba.Debit(11.22);
                Console.WriteLine("Current balance is ${0}", ba.Balance);
            }
        }
    }
    
  6. Sağ tıklayıp Çözüm Gezgini'de Yeniden Adlandır'ı seçerek dosyayı BankAccount.cs olarak yeniden adlandırın.

  7. Oluştur menüsünde Çözüm Oluştur'a tıklayın (veya Ctrl + SHIFT + B tuşlarına basın).

Artık test edebilirsiniz yöntemleri olan bir projeniz var. Bu makalede testler yöntemine Debit odaklanır. Bir Debit hesaptan para çekildiğinde yöntemi çağrılır.

Birim testi projesi oluşturma

  1. Dosya menüsünde Yeni Proje Ekle'yi>seçin.

    İpucu

    Çözüme Çözüm Gezgini sağ tıklayıp Yeni Proje Ekle'yi> de seçebilirsiniz.

  2. Arama kutusuna test yazın, dil olarak C# öğesini seçin ve ardından .NET için C# MSTest Birim Test Projesi şablonunu seçin ve ardından İleri'ye tıklayın.

    Not

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

  3. Projeye BankTests 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.

    BankTests projesi Banka çözümüne eklenir.

  5. BankTests projesinde, Banka projesine bir başvuru ekleyin.

    Çözüm Gezgini'da BankTests projesinin altında Bağımlılıklar'ı seçin ve ardından sağ tıklama menüsünden Başvuru Ekle'yi (veya Proje Başvurusu Ekle'yi) seçin.

  6. Başvuru Yöneticisi iletişim kutusunda Projeler'i genişletin, Çözüm'e tıklayın ve ardından Banka öğesini işaretleyin.

  7. Tamam'ı seçin.

Test sınıfı oluşturma

Sınıfı doğrulamak BankAccount için bir test sınıfı oluşturun. Proje şablonu tarafından oluşturulan UnitTest1.cs dosyasını kullanabilirsiniz, ancak dosyaya ve sınıfa daha açıklayıcı adlar verebilirsiniz.

Dosyayı ve sınıfı yeniden adlandırma

  1. Dosyayı yeniden adlandırmak için Çözüm Gezgini'da BankTests projesinde UnitTest1.cs dosyasını seçin. Sağ tıklama menüsünden Yeniden Adlandır'ı seçin (veya F2 tuşuna basın) ve dosyayı BankAccountTests.cs olarak yeniden adlandırın.

  2. Sınıfı yeniden adlandırmak için, imleci UnitTest1 kod düzenleyicisinde üzerine getirin, sağ tıklayın ve yeniden adlandır'ı seçin (veya F2 tuşuna basın). BankAccountTests yazın ve Enter tuşuna basın.

BankAccountTests.cs dosyası artık aşağıdaki kodu içerir:

// The 'using' statement for Test Tools is in GlobalUsings.cs
// using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace BankTests
{
    [TestClass]
    public class BankAccountTests
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
}

using deyimi ekleme

Tam adları kullanmadan test altındaki projeye çağrı yapabilmek için test sınıfına bir using deyim ekleyin. Sınıf dosyasının en üstüne şunları ekleyin:

using BankAccountNS;

Sınıf gereksinimlerini test edin

Test sınıfı için en düşük gereksinimler şunlardır:

  • [TestClass] Özniteliği, Test Gezgini'nde çalıştırmak istediğiniz birim testi yöntemlerini içeren herhangi bir sınıfta gereklidir.

  • Test Gezgini'nin tanımasını istediğiniz her test yönteminin [TestMethod] özniteliği olmalıdır.

Bir birim testi projesinde özniteliği olmayan [TestClass] başka sınıflara sahip olabilir ve test sınıflarında özniteliği olmayan [TestMethod] başka yöntemleriniz de olabilir. Bu diğer sınıfları ve yöntemleri test yöntemlerinizden çağırabilirsiniz.

İlk test yöntemini oluşturma

Bu yordamda, sınıfın yönteminin DebitBankAccount davranışını doğrulamak için birim testi yöntemleri yazarsınız.

Denetlenilmesi gereken en az üç davranış vardır:

İpucu

Bu kılavuzda kullanmayacağınız için varsayılan TestMethod1 yöntemi silebilirsiniz.

Test yöntemi oluşturmak için

İlk test, geçerli bir tutarın (hesap bakiyesinden küçük ve sıfırdan büyük bir tutar) hesaptan doğru miktarı geri çektiğini doğrular. Bu sınıfa BankAccountTests aşağıdaki yöntemi ekleyin:

[TestMethod]
public void Debit_WithValidAmount_UpdatesBalance()
{
    // Arrange
    double beginningBalance = 11.99;
    double debitAmount = 4.55;
    double expected = 7.44;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);

    // Act
    account.Debit(debitAmount);

    // Assert
    double actual = account.Balance;
    Assert.AreEqual(expected, actual, 0.001, "Account not debited correctly");
}

Yöntemi basittir: başlangıç bakiyesi olan yeni BankAccount bir nesne ayarlar ve ardından geçerli bir miktarı geri çeker. Bitiş bakiyesinin Assert.AreEqual beklendiği gibi olduğunu doğrulamak için yöntemini kullanır. , Assert.IsTrueve gibi Assert.AreEqualyöntemler birim testinde sıklıkla kullanılır. Birim testi yazma hakkında daha fazla kavramsal bilgi için bkz . Testlerinizi yazma.

Test yöntemi gereksinimleri

Test yöntemi aşağıdaki gereksinimleri karşılamalıdır:

  • Özniteliğiyle [TestMethod] dekore edilmiştir.

  • döndürür void.

  • Parametreleri olamaz.

Testi derleme ve çalıştırma

  1. Derle menüsünde Çözüm Derle'yi seçin (veya Ctrl SHIFT + B tuşlarına + basın).

  2. Test Gezgini açık değilse, üst menü çubuğundan Test>Test Gezgini'ni (veya >Test Windows>Test Gezgini'ni) seçerek açın (veya Ctrl + E, T tuşlarına basın).

  3. Testi çalıştırmak için Tümünü Çalıştır'ı seçin (veya Ctrl + R, V tuşlarına basın).

    Test çalışırken, Test Gezgini penceresinin üst kısmındaki durum çubuğu animasyonludur. Test çalıştırmasının sonunda, tüm test yöntemleri geçerse çubuk yeşile veya testlerden herhangi biri başarısız olursa kırmızıya dönüşür.

    Bu durumda test başarısız olur.

  4. Pencerenin en altındaki ayrıntıları görüntülemek için Test Gezgini'nde yöntemini seçin.

Kodunuzu düzeltme ve testlerinizi yeniden çalıştırma

Test sonucu, hatayı açıklayan bir ileti içerir. Bu iletiyi görmek için detaya gitmeniz gerekebilir. yöntemi için AreEqual , ileti nelerin beklendiğini ve gerçekte nelerin alındığını görüntüler. Bakiyenin azalmasını bekliyorsunuz, ancak bunun yerine para çekme miktarına göre arttı.

Birim testi bir hata ortaya çıkardı: çekilme miktarı çıkarılması gerektiğinde hesap bakiyesine eklenir.

Hatayı düzeltme

Hatayı düzeltmek için BankAccount.cs dosyasında satırı değiştirin:

m_balance += amount;

Yeni değer:

m_balance -= amount;

Testi yeniden çalıştırma

Testi yeniden çalıştırmak için Test Gezgini'nde Tümünü Çalıştır'ı seçin (veya Ctrl + R, V tuşlarına basın). Testin geçtiğini belirtmek için kırmızı/yeşil çubuk yeşile döner.

Test Explorer in Visual Studio 2019 showing passed test

Test Explorer in Visual Studio 2019 showing passed test

Kodunuzu geliştirmek için birim testlerini kullanma

Bu bölümde yinelemeli analiz, birim testi geliştirme ve yeniden düzenleme işlemlerinin üretim kodunuzu daha sağlam ve etkili hale getirmenize nasıl yardımcı olabileceği açıklanmaktadır.

Sorunları analiz etme

Yöntemde geçerli bir tutarın doğru şekilde düşüldüğünü Debit onaylamak için bir test yöntemi oluşturdunuz. Şimdi, yöntemin borç miktarından biriyse bir ArgumentOutOfRangeException attığını doğrulayın:

  • bakiyeden büyük veya
  • sıfırdan küçük.

Yeni test yöntemleri oluşturma ve çalıştırma

Borç tutarı sıfırdan küçük olduğunda doğru davranışı doğrulamak için bir test yöntemi oluşturun:

[TestMethod]
public void Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange()
{
    // Arrange
    double beginningBalance = 11.99;
    double debitAmount = -100.00;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);

    // Act and assert
    Assert.ThrowsException<System.ArgumentOutOfRangeException>(() => account.Debit(debitAmount));
}

ThrowsException Doğru özel durumun oluştuğunun onayını almak için yöntemini kullanın. Bu yöntem, bir ArgumentOutOfRangeException atılmadığı sürece testin başarısız olmasına neden olur. Banka tutarı sıfırdan küçük olduğunda test altındaki yöntemi geçici olarak daha genel ApplicationException bir değer oluşturacak şekilde değiştirirseniz, test doğru şekilde davranır; yani başarısız olur.

Çekilen tutar bakiyeden büyük olduğunda durumu test etmek için aşağıdaki adımları uygulayın:

  1. adlı Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRangeyeni bir test yöntemi oluşturun.

  2. yönteminin gövdesini Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange yeni yönteme kopyalayın.

  3. değerini debitAmount bakiyeden daha büyük bir sayıya ayarlayın.

İki testi çalıştırın ve geçtiklerini doğrulayın.

Çözümlemeye devam et

Test edilen yöntem daha da geliştirilebilir. Geçerli uygulamayla, test sırasında özel durumun hangi koşula (amount > m_balance veya amount < 0) neden olduğunu bilmemizin hiçbir yolu yoktur. Yönteminde bir yere bir ArgumentOutOfRangeException atıldığını biliyoruz. Yöntemimizin bağımsız değişkenlerini doğru bir şekilde denetlediğinden emin olmak için özel durumun (amount > m_balance veya amount < 0) hangi koşulda BankAccount.Debit oluştuğunu anlayabilirsek daha iyi olur.

Test edilen yönteme (BankAccount.Debit) yeniden bakın ve her iki koşullu deyimin de bağımsız değişkenin adını parametre olarak alan bir ArgumentOutOfRangeException oluşturucu kullandığına dikkat edin:

throw new ArgumentOutOfRangeException("amount");

Çok daha zengin bilgileri bildiren bir oluşturucu vardır: ArgumentOutOfRangeException(String, Object, String) bağımsız değişkenin adını, bağımsız değişken değerini ve kullanıcı tanımlı bir iletiyi içerir. Bu oluşturucuyu kullanmak için test altındaki yöntemi yeniden düzenleyebilirsiniz. Daha da iyisi, hataları belirtmek için genel kullanıma açık tür üyelerini kullanabilirsiniz.

Test altındaki kodu yeniden düzenleme

İlk olarak, sınıf kapsamındaki hata iletileri için iki sabit tanımlayın. Tanımları test BankAccountaltındaki sınıfına yerleştirin:

public const string DebitAmountExceedsBalanceMessage = "Debit amount exceeds balance";
public const string DebitAmountLessThanZeroMessage = "Debit amount is less than zero";

Ardından yöntemindeki iki koşullu deyimi Debit değiştirin:

if (amount > m_balance)
{
    throw new System.ArgumentOutOfRangeException("amount", amount, DebitAmountExceedsBalanceMessage);
}

if (amount < 0)
{
    throw new System.ArgumentOutOfRangeException("amount", amount, DebitAmountLessThanZeroMessage);
}

Test yöntemlerini yeniden düzenleme

için çağrısını Assert.ThrowsExceptionkaldırarak test yöntemlerini yeniden düzenleme. Çağrıyı Debit() bir try/catch blokta sarmalayın, beklenen özel durumu yakalayın ve ilişkili iletisini doğrulayın. yöntemi, Microsoft.VisualStudio.TestTools.UnitTesting.StringAssert.Contains iki dizeyi karşılaştırma olanağı sağlar.

Şimdi, Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange aşağıdaki gibi görünebilir:

[TestMethod]
public void Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange()
{
    // Arrange
    double beginningBalance = 11.99;
    double debitAmount = 20.0;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);

    // Act
    try
    {
        account.Debit(debitAmount);
    }
    catch (System.ArgumentOutOfRangeException e)
    {
        // Assert
        StringAssert.Contains(e.Message, BankAccount.DebitAmountExceedsBalanceMessage);
    }
}

Yeniden test etme, yeniden yazma ve yeniden analiz etme

Şu anda test yöntemi olması gereken tüm durumları işlememektedir. Test altındaki yöntem, Debit yöntemi bakiyeden büyük olduğunda (veya sıfırdan küçüksedebitAmount) bir ArgumentOutOfRangeException atamadıysa, test yöntemi geçer. Özel durum oluşturulursa test yönteminin başarısız olmasını istediğiniz için bu senaryo iyi değildir.

Bu sonuç, test yöntemindeki bir hatadır. Sorunu çözmek için, özel durum oluşturmadığı durumu işlemek için test yönteminin sonuna bir Assert.Fail onay ekleyin.

Testin yeniden çalıştırılması, doğru özel durum yakalanırsa testin başarısız olduğunu gösterir. Blok catch özel durumu yakalar, ancak yöntemi yürütülmeye devam eder ve yeni Assert.Fail onayda başarısız olur. Bu sorunu çözmek için bloğundan StringAssertcatch sonra bir return deyim ekleyin. Testi yeniden çalıştırmak, bu sorunu çözdüğünüzden emin olur. son sürümü Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange şöyle görünür:

[TestMethod]
public void Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange()
{
    // Arrange
    double beginningBalance = 11.99;
    double debitAmount = 20.0;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);

    // Act
    try
    {
        account.Debit(debitAmount);
    }
    catch (System.ArgumentOutOfRangeException e)
    {
        // Assert
        StringAssert.Contains(e.Message, BankAccount.DebitAmountExceedsBalanceMessage);
        return;
    }

    Assert.Fail("The expected exception was not thrown.");
}

Sonuç

Test kodundaki iyileştirmeler daha sağlam ve bilgilendirici test yöntemlerine yol açtı. Ancak daha da önemlisi, test altındaki kodu da geliştirdiler.

İpucu

Bu kılavuzda yönetilen kod için Microsoft birim testi çerçevesi kullanılmaktadır. Test Gezgini, Test Gezgini için bağdaştırıcıları olan üçüncü taraf birim test çerçevelerinden de testler çalıştırabilir. Daha fazla bilgi için bkz . Üçüncü taraf birim testi çerçevelerini yükleme.

Testleri komut satırından çalıştırma hakkında bilgi için bkz . VSTest.Console.exe komut satırı seçenekleri.