İzlenecek yol: Yönetilen Kod için Birim Testleri Oluşturma ve Çalıştırma

Bu kılavuz size oluşturma, çalışan ve yönetilen kod ve Visual Studio Test Gezgini için Microsoft birim testi çerçevesi kullanarak birim testleri bir dizi özelleştirme adım.Geliştirilmekte olan C# proje başlayın, kendi kodu deneyen, testler ve sonuçları inceleyin testleri oluşturun.Ardından, proje kodunuzu değiştirip testleri yeniden çalıştırın.

Bu konu aşağıdaki bölümleri içerir:

Yönergeyi Hazırla

Birim testi projesi oluşturun

Test sınıf oluşturun

İlk test yöntemi oluşturun

Oluşturun ve test çalışması

Kodunuzu düzeltin ve yeniden testinizi çalıştırın

Kodunuzu geliştirmek için birim testleri kullanın

[!NOT]

Bu kılavuz Microsoft birim testi çerçevesi için yönetilen kod kullanır.Test gezginini ayrıca üçüncü taraf birim bağdaştırıcısı için Test Gezgini olan testi çerçevelerinden testler çalıştırabilirsiniz.Daha fazla bilgi için Nasıl yapılır: Üçüncü Şahıs Birim Test Çerçevelerini Yükleme

[!NOT]

Bir komut satırından testler hakkında daha fazla bilgi için bkz İzlenecek yol: Komut satırı test yardımcı programını kullanma.

Önkoşullar

Yönergeyi Hazırla

  1. Visual Studio'yu açın.

  2. Üzerinde Dosya menüsü, işaretleyin Yeni ve ardından Proje.

    Yeni proje iletişim kutusu görüntülenir.

  3. Altında yüklü şablonlar, tıklatın Visual C#.

  4. Uygulama türleri listesinden tıklatın Sınıf Kitaplığı.

  5. İçindeki adı kutusuna Bank ve ardından Tamam.

    [!NOT]

    "Bank" adı zaten kullanılıyor, proje için başka bir ad seçin.

    Yeni Bank Proje oluşturulur ve Kod Düzenleyicisi'nde açık Class1.cs dosyası ile Çözüm Gezgini'nde görüntülenir.

    [!NOT]

    Class1.cs dosyası Kod Düzenleyicisi'nde açık durumda değilse, dosyayı açmak için Çözüm Gezgini'nde Class1.cs çift tıklatın.

  6. Kaynak kodu Kopyala Birim Testleri Oluşturmak için Örnek Proje.

  7. Koddan Class1.cs özgün içeriğinin yerine Birim Testleri Oluşturmak için Örnek Proje.

  8. Dosya BankAccount.cs Kaydet

  9. Oluştur menüsünde Çözümü Derle öğesine tıklatın.

Artık Bank adlı bir proje vardır.Bu test etmek için kaynak kodu ve ile test etmek için Araçlar içerir.Ad alanı, Bank için BankAccountNS, ortak bir sınıf içerir BankAccount, yöntemler aşağıdaki yordamları test.

Hızlı Başlangıç, biz odaklanmanızı Debit yöntemi.Para bir hesaptan geri olduğunda ve aşağıdaki kodu içeren ATM yöntem çağrılır:

// method under test
public void Debit(double amount)
{
    if(amount > m_balance)
    {
        throw new ArgumentOutOfRangeException("amount");
    }
    if (amount < 0)
    {
        throw new ArgumentOutOfRangeException("amount");
    }
    m_balance += amount;
}

Birim testi projesi oluşturun

Önkoşul: yordam adımları Yönergeyi Hazırla.

Bir birim sınama projesini oluşturmak için

  1. Üzerinde Dosya menüsünde seçin Ekle, ve sonra seçin Yeni proje.

  2. Yeni Proje iletişim kutusunda genişletin yüklü, genişletme Visual C#, ve sonra seçin Test.

  3. Şablonlar listesinde birim testi projesi.

  4. İçindeki adı kutusuna BankTest girin ve ardından seçin Tamam.

    BankTests proje eklenen Bank çözüm.

  5. İçindeki BankTests bir başvuru ekleyin, proje Bank çözüm.

    Çözüm Gezgini'nde seçin başvuruları içinde BankTests 'ı seçin ve proje Başvuru Ekle... ve bağlam menüsünden.

  6. Başvuru Yöneticisi iletişim kutusunda genişletin Çözüm ve Bank öğesi.

Test sınıf oluşturun

Doğrulamak için test sınıfı ihtiyacımız BankAccount sınıfı.Proje şablonu tarafından oluşturulan UnitTest1.cs kullanırız, ancak şu dosyaya verin ve daha açıklayıcı adları sınıfı gerekir.Çözüm Gezgini'nde yeniden adlandırma tarafından ki, tek bir adım yapabilirsiniz.

Bir sınıf dosyası yeniden adlandırma

Çözüm Gezgini'nde BankTests projesindeki UnitTest1.cs dosyasını seçin.Bağlam menüsünden seçin Yeniden Adlandır, ve BankAccountTests.cs için dosyayı yeniden adlandırın.Seçin Evet projedeki tüm başvuruları 'UnitTest1' kod öğesine yeniden adlandırma isteyip istemediğinizi sorar iletişim kutusunda.Bu adım için sınıf adını değiştirir BankAccountTests.

BankAccountTests.cs dosya şimdi aşağıdaki kod içerir:

// unit test code
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

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

Kullanarak bir Ekle test altındaki projeye bildirimi

Ayrıca kullanarak bir ekleyebiliriz bize test altındaki proje adları kullanarak tam nitelenmiş olmadan çağırmak için sınıfa ifade.Sınıf dosyası üstünde Ekle:

using BankAccountNS;

Test sınıfı gereksinimleri

Test sınıfı için en az gereksinimleri şunlardır:

  • [TestClass] Özniteliği gereken framework yönetilen için test Microsoft biriminde kodunu herhangi bir sınıf için Test Gezgininde çalıştırmak istediğiniz birim testi yöntemleri içerir.

  • Test Gezgini çalıştırmak istediğiniz her test yöntemi olmalıdır [TestMethod]özniteliği.

Sahip olmadığınız diğer birim testi projesi sınıflarda olabilir [TestClass] özniteliği ve olabilir diğer yöntemleri sahip olmadığınız test sınıflarda [TestMethod] özniteliği.Bu diğer sınıflar ve yöntemler, test yöntemleri kullanabilirsiniz.

İlk test yöntemi oluşturun

Bu yordamda biz birim testi davranışını doğrulamak için yöntemleri yazılacak Debit yöntemi BankAccount sınıfı.Yöntemi, yukarıda listelenen.

Test altındaki yöntem analiz ederken, denetlenmelidir en az üç davranışı vardır belirleriz:

  1. Yöntem oluşturur bir [ArgumentOutOfRangeException] ATM miktarını Bakiye büyükse.

  2. Ayrıca oluşturur ArgumentOutOfRangeException ATM miktarı küçükse sıfır.

  3. Eğer 1'deki denetler.) ve 2.) tatmin edici, yöntem bakiye tutarı çıkarır.

Geçerli bir miktar bizim ilk test, kullanmak hesabından (bir, hesap bakiyesi küçük ve sıfırdan büyük) çeker doğru tutar.

Test yöntemi oluşturmak için

  1. Kullanarak bir ekleme BankAccountNS; bildirimi BankAccountTests.cs dosyasına kayıt yapar.

  2. Aşağıdaki yöntem eklemek için BankAccountTests sınıfı:

    // unit test code
    [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");
    }
    

Bunun yerine basit yöntemdir.Yeni bir ayarlamamızın BankAccount Nesne başına bakiyesi olan ve sonra geçerli bir miktar programdan çıkın.Microsoft birim testi çerçevesi için yönetilen kod kullanırız AreEqual Bitiş biz beklediğiniz olduğunu doğrulamak için yöntemi.

Test yöntemi gereksinimleri

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

  • Yöntem ile tasarlanmış gerekir [TestMethod] özniteliği.

  • Yöntem döndürmelidir void.

  • Yöntem parametreleri olamaz.

Oluşturun ve test çalışması

Oluşturun ve test çalıştırmak için

  1. Üzerinde Yapı menüsünde seçin Yapı çözümü.

    Herhangi bir hata varsa, UnitTestExplorer penceresi görüntülenir Debit_WithValidAmount_UpdatesBalance listelenen Testleri değil Çalıştır grubu.Test gezginini sonra bir başarılı yapının görünmüyorsa seçin Test menüde, ardından seçin Windows, ve sonra seçin Test Gezgini.

  2. Seçin Tümünü Çalıştır test için.Test pencerenin üst kısmında durum çubuğunu çalışırken animasyon.Herhangi bir test başarısız olursa test çalışması sonunda tüm test yöntemlerini geçirirseniz yeşil veya Kırmızı çubuk kapatır.

  3. Bu durumda, sınama başarısız.Test yöntemi taşınır başarısız testler.olmalıdır.Pencerenin altındaki ayrıntılarını görüntülemek için Test Gezgininde yöntemi seçin.

Kodunuzu düzeltin ve yeniden testinizi çalıştırın

Test sonuçlarını analiz edin

Sınama sonucu hatayı açıklayan bir ileti içerir.İçin AreEquals yöntemini iletisi görüntüler, ne bekleniyordu ((**beklenen <XXX>**parametresi) ve ne gerçekten alındı ( gerçek <YYY> parametresi).Başlangıç bakiyesi reddetmek için Bakiye şuydu, ancak bunun yerine mevzuatı miktarı tarafından çıkarıldı.

Bir reexamination ATM kod birim testi içinde bir hata bulma başarılı olduğunu gösterir.Mevzuatı miktarı çıkarılır hesap bakiye olarak eklenir.

Hatayı düzeltin

Hatayı düzeltmek için basitçe satır Değiştir

m_balance += amount;

ile

m_balance -= amount;

Testi yeniden çalıştırın

Test Gezgininde seçin Tümünü Çalıştır için testi yeniden çalıştırın.Kırmızı/yeşil çubuğu yeşil kapatır ve test taşınır testleri geçti grubu.

Kodunuzu geliştirmek için birim testleri kullanın

Bu bölüm, çözümleme, birim testi geliştirme ve yeniden düzenleme yinelemeli süreç üretim kodunuzu daha güçlü ve etkili hale nasıl yardımcı olabileceğini açıklar.

Sorunları çözümleyin

Onaylamak için bir test yöntemi oluşturduktan sonra geçerli bir miktar doğru olduğunu içinde kesilen Debit yöntemi, biz etkinleştirmek için kalan durumları bizim özgün analizi:

  1. Yöntem oluşturur bir ArgumentOutOfRangeException ATM miktarını Bakiye büyükse.

  2. Ayrıca oluşturur ArgumentOutOfRangeException ATM miktarı küçükse sıfır.

Test yöntemlerini oluştur

Bu sorunları gidermek için test yöntemi oluşturma sırasında bir ilk deneme taahhüt gibi görünüyor:

//unit test method
[TestMethod]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange()
{
    // arrange
    double beginningBalance = 11.99;
    double debitAmount = -100.00;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);

    // act
    account.Debit(debitAmount);

    // assert is handled by ExpectedException
}

Kullanırız ExpectedExceptionAttribute sağ özel durum oluşturdu onaylanacak özniteliği.Öznitelik testin sürece başarısız olmasına neden olan bir ArgumentOutOfRangeException oluşturulur.Her ikisi de pozitif ve negatif çalışan debitAmount değerleri ve ardından genel atmak için test altındaki yöntem geçici olarak değiştirme ApplicationException test düzgün şekilde davranır zaman miktarı sıfırdan küçüktür gösterir.Durum geri tutar Bakiye büyük olduğunda, test etmek için tek yapmak için ihtiyacımız var olan:

  1. Adlı yeni bir test yöntemi oluşturmak Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange.

  2. Yöntem gövdesinden kopyalamak Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange Yeni yöntemine.

  3. Ayarlama debitAmount Bakiye büyük bir sayı.

Testleri çalıştırın

İki yöntem için farklı değerlere sahip çalıştıran debitAmount Testleri, bizim kalan durumları işlemek gösterir.Tüm üç testi Onayla bizim özgün analysis tüm durumlarda doğru kapsamdaki çalışıyor.

Analysis devam et

Ancak, son iki test de biraz gönderilmiş rahatınızı yöntemleri.Biz ya da test çalışmaları, test altındaki kodu hangi koşulu oluşturur belirli olamaz.İki koşul ayrım, herhangi bir şekilde yardımcı olur.Biz hakkında daha fazla, sorun düşünme, hangi koşulunu ihlal bilmeden bizim güvenirlikli testlerinde artacaktır belirgin olur.Bu bilgiler ayrıca çok büyük olasılıkla test altındaki yöntemi tarafından oluşturulan özel durumu işler üretim mekanizması için yardımcı olacaktır.Daha fazla bilgi yöntemi atar ilgili tüm yardımcı olduğunda oluşturmak ancak ExpectedException özniteliği olamaz bu bilgileri sağlayın..

Test altındaki yöntemi yeniden bakarak, biz kullanan her iki koşul deyimleri bakın bir ArgumentOutOfRangeException bağımsız değişkeni olarak bir parametre adı alan oluşturucu:

throw new ArgumentOutOfRangeException("amount");

MSDN Kitaplığı aramadan bir oluşturucu çok daha zengin bilgilerini raporlar var olduğunu keşfedin.#ctor(String, Object, String) bağımsız değişken, bağımsız değişken değeri ve kullanıcı tanımlı bir ileti adını içerir.Biz yöntem bu oluşturucu kullanmak için test altındaki yeniden düzenle.Bile daha iyi biz hataları belirtmek için genel kullanıma açık tür üyeleri kullanabilirsiniz.

Test altındaki kodun yeniden Düzenle

Biz öncelikle iki sabitler sınıfı kapsamında hata iletileri için tanımlayın:

// class under test
public const string DebitAmountExceedsBalanceMessage = "Debit amount exceeds balance";
public const string DebitAmountLessThanZeroMessage = "Debit amount less than zero";

Biz sonra iki koşullu tablolarda değişiklik Debit yöntemi:

// method under test
// ...
    if (amount > m_balance)
    {
        throw new ArgumentOutOfRangeException("amount", amount, DebitAmountExceedsBalanceMessage);
    }

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

Test yöntemlerini yeniden Düzenle

Bizim test yöntemine biz önce kaldırın ExpectedException özniteliği.Onun yerine, oluşturulan özel durum yakalama ve doğru durum bildiriminde oluşturulan doğrulayın.Ancak, biz şimdi bizim kalan koşulları doğrulamak için iki seçenek arasında karar vermeniz gerekir.Örneğin, Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange yöntemi, biz alabilir aşağıdaki eylemlerden birini:

  • Onaylama işlemi ActualValue özel durumun özelliği (ikinci parametresi ArgumentOutOfRangeException Oluşturucu) Başlangıç bakiyesi büyük.Bu seçenek, test ederiz gerektirir ActualValue karşı özel durumun özelliği beginningBalance test yönteminin değişken ve ayrıca gerektirir ardından doğrulayın ActualValue sıfırdan büyük.

  • İleti (üçüncü parametre yapıcısının) içerdiğini iddia DebitAmountExceedsBalanceMessage tanımlanan BankAccount sınıfı.

StringAssert.Contains Microsoft birim testi çerçevesi yönteminde bize ilk seçeneği gerekli olan hesaplamaları olmadan ikinci seçeneği doğrulamak sağlar.

Düzeltme konumunda bir ikinci deneme Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange 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 (ArgumentOutOfRangeException e)
    {
        // assert
        StringAssert.Contains(e.Message, BankAccount. DebitAmountExceedsBalanceMessage);
    }
}

Sürücüyle, yeniden yazma ve yeniden Çözümle

Biz farklı değerleri olan test yöntemlerini yeniden sınayın, biz aşağıdaki bilgiler karşılaştığınız:

  1. Bir izin kullanarak biz doğru hata yakalama varsa burada debitAmount Bakiye büyük Contains izin geçirir, özel durum göz ardı edilir ve bu nedenle test yöntemi geçirir.İstiyoruz davranış budur.

  2. Biz kullanırsanız, bir debitAmount 0'dan küçük, yanlış hata iletisi döndürdüğünden izin başarısız olur.Biz geçici tanıtmak izin de başarısız olur ArgumentOutOfRange yönteminde test kod yolunda başka bir noktada özel durum.Bu çok uygundur.

  3. Varsa debitAmount değeri geçerli (yani, Bakiye sıfırdan, ancak daha az istisna yakalandı, izin hiçbir zaman karşılaştığı için.Test yöntemi geçirir.Hiçbir özel durum oluşursa başarısız olmasına test yöntemi istiyoruz çünkü bu iyi değil.

Üçüncü olay bizim test yöntemi bir hata olduğunu.Sorunu çözmeye çalışmak için biz Ekle bir Fail nerede hiçbir özel durum durumu işlemek için test yöntemi sonunda iddia.

Ancak retesting doğru özel durum yakalanmışsa sınama şimdi başarısız olduğunu gösterir.Özel durum yakalama bildirimi sıfırlar ve yöntemi yeni izin başarısız yürütmek, devam eder.Yeni sorunu çözmek için biz ekleyin bir return sonra bildirimi StringAssert.Retesting bizim sorunları düzelttikten onaylar.En son sürümünü Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange aşağıdaki gibi 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 (ArgumentOutOfRangeException e)
    {
        // assert
        StringAssert.Contains(e.Message, BankAccount. DebitAmountExceedsBalanceMessage);
        return;
    }
    Assert.Fail("No exception was thrown.");
}

Bu son bölümünde, daha güçlü ve bilgilendirici test yöntemlerini vermedi biz bizim test kodu geliştirme iş neden.Ancak daha da önemlisi ek analiz de daha iyi kod bizim projesinde test etmeleri.