İ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. Mevcut koddan testleri otomatik olarak oluşturmak istiyorsanız bkz . Koddan birim testi yöntemi saptamaları oluşturma.
Test etmek için proje oluşturma
Visual Studio'yu açın.
Başlangıç penceresinde Yeni proje oluştur'u seçin.
.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.
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
Düzenleyicide Program.cs açık değilse, Çözüm Gezgini'da dosya Program.cs çift tıklayarak açın.
Program.cs 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); } } }
Sağ tıklayıp Çözüm Gezgini'de Yeniden Adlandır'ı seçerek dosyayı BankAccount.cs olarak yeniden adlandırın.
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
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.
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.
Projeye BankTests adını verin ve İleri'ye tıklayın.
Önerilen hedef çerçeveyi veya .NET 8'i ve ardından Oluştur'u seçin.
BankTests projesi Banka çözümüne eklenir.
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.
Başvuru Yöneticisi iletişim kutusunda Projeler'i genişletin, Çözüm'e tıklayın ve ardından Banka öğesini işaretleyin.
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
Dosyayı yeniden adlandırmak için Çözüm Gezgini'da BankTests projesindeki UnitTest1.cs dosyasını seçin. Sağ tıklama menüsünden Yeniden Adlandır'ı seçin (veya F2 tuşuna basın) ve ardından dosyayı BankAccountTests.cs olarak yeniden adlandırın.
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ı şimdi 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 Debit
BankAccount
davranışını doğrulamak için birim testi yöntemleri yazarsınız.
Denetlenilmesi gereken en az üç davranış vardır:
yöntemi, borç tutarı bakiyeden büyükse bir ArgumentOutOfRangeException oluşturur.
yöntemi, borç tutarı sıfırdan küçükse bir ArgumentOutOfRangeException oluşturur.
Borç tutarı geçerliyse, yöntem borç tutarını hesap bakiyesinden çıkarı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.AreEqual
yö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
Derle menüsünde Çözüm Derle'yi seçin (veya Ctrl SHIFT + B tuşlarına + basın).
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).
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.
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ını 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.
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:
adlı
Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange
yeni bir test yöntemi oluşturun.yönteminin gövdesini
Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange
yeni yönteme kopyalayın.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 BankAccount
altı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 StringAssert
catch
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.
İlgili içerik
Testleri komut satırından çalıştırma hakkında bilgi için bkz . VSTest.Console.exe komut satırı seçenekleri.