İzlenecek yol: Test Gezgini'nin kullanıldığı test temelli geliştirme
Artımlı kod değişiklikleriyle kodunuzun düzgün çalışmasını sağlamaya yardımcı olmak için birim testleri oluşturun. Üçüncü taraflar tarafından geliştirilenler de dahil olmak üzere birim testleri yazmak için kullanabileceğiniz çeşitli çerçeveler vardır. Bazı test çerçeveleri farklı dillerde veya platformlarda test için özel olarak tasarlanmıştır. Test Gezgini, bu çerçevelerden herhangi birinde birim testleri için tek bir arabirim sağlar. Test Gezgini hakkında daha fazla bilgi için bkz. Test Gezgini ile birim testleri çalıştırma ve Test Gezgini hakkında SSS.
Bu izlenecek yol, Microsoft Test Framework (MSTest) kullanarak C# dilinde test edilmiş bir yöntemin nasıl geliştir yapılacağını gösterir. NUnit gibi diğer diller veya diğer test çerçeveleri için kolayca uyarlayabilirsiniz. Daha fazla bilgi için bkz . Üçüncü taraf birim testi çerçevelerini yükleme.
Test oluşturma ve kod oluşturma
.NET veya .NET Standard için bir C# Sınıf Kitaplığı projesi oluşturun. Bu proje, test etmek istediğimiz kodu içerir. Projeye MyMath adını verin.
Aynı çözümde .NET için yeni bir MSTest test projesi ekleyin.
Visual Studio 2019 sürüm 16.9'da, MSTest proje şablonu adı Birim Testi Projesi'dir.
Test projesine MathTests adını verin.
Belirli bir giriş için elde edilen sonucu doğrulayan basit bir test yöntemi yazın. Sınıfına
UnitTest1
aşağıdaki kodu ekleyin:[TestMethod] public void BasicRooterTest() { // Create an instance to test: Rooter rooter = new Rooter(); // Define a test input and output value: double expectedResult = 2.0; double input = expectedResult * expectedResult; // Run the method under test: double actualResult = rooter.SquareRoot(input); // Verify the result: Assert.AreEqual(expectedResult, actualResult, delta: expectedResult / 100); }
Test kodundan bir tür oluşturun.
İmleci üzerine
Rooter
getirin ve ampul menüsünden Oluştur türü 'Rooter'Yeni tür oluştur'u> seçin.Tür Oluştur iletişim kutusunda, Project'i sınıf kitaplığı projesi olan MyMath olarak ayarlayın ve tamam'ı seçin.
Test kodundan bir yöntem oluşturun. İmleci üzerine
SquareRoot
getirin ve ampul menüsünden 'Rooter.SquareRoot' yöntemi oluştur'u seçin.Birim testini çalıştırın.
Test Gezgini'ne gidin.
Test menüsünden Test Gezgini'ni açmak için Test Gezgini'ni seçin.
Test menüsünden Test Gezgini'ni açmak için Windows>Test Gezgini'ni seçin.
Testi çalıştırmak için Test Gezgini'nde Tümünü Çalıştır düğmesini seçin.
Çözüm derlenip test çalıştırılır ve başarısız olur.
Testin adını seçin.
Testin ayrıntıları Test Ayrıntı Özeti bölmesinde görünür.
Testin başarısız olduğu konuma atlamak için Yığın İzleme'nin altındaki üst bağlantıyı seçin.
Bu noktada, testin geçmesi için değiştirebileceğiniz bir test ve saplama oluşturdunuz.
Kod değişikliğini doğrulama
Class1.cs dosyasında kodunu geliştirin
SquareRoot
:public double SquareRoot(double input) { return input / 2; }
Test Gezgini'nde Tümünü Çalıştır'ı seçin.
Çözüm derlenip test çalıştırılır ve geçer.
Giriş aralığını genişletme
Kodun her durumda çalıştığına olan güvenimizi artırmak için, daha geniş bir giriş değerleri aralığı deneyen testler ekleyin.
İpucu
Geçen mevcut testleri değiştirmekten kaçının. Bunun yerine yeni testler ekleyin. Mevcut testleri yalnızca kullanıcı gereksinimleri değiştiğinde değiştirin. Bu ilke, kodu genişletmek için çalışırken mevcut işlevselliği kaybetmediğinizden emin olmanıza yardımcı olur.
Test sınıfına, bir dizi giriş değeri deneyen aşağıdaki testi ekleyin:
[TestMethod] public void RooterValueRange() { // Create an instance to test. Rooter rooter = new Rooter(); // Try a range of values. for (double expected = 1e-8; expected < 1e+8; expected *= 3.2) { RooterOneValue(rooter, expected); } } private void RooterOneValue(Rooter rooter, double expectedResult) { double input = expectedResult * expectedResult; double actualResult = rooter.SquareRoot(input); Assert.AreEqual(expectedResult, actualResult, delta: expectedResult / 1000); }
Test Gezgini'nde Tümünü Çalıştır'ı seçin.
Yeni test başarısız olur (ilk test yine de geçer). Hata noktasını bulmak için başarısız olan testi seçin ve ardından Test Ayrıntı Özeti bölmesindeki ayrıntılara bakın.
Neyin yanlış olabileceğini görmek için test altındaki yöntemi inceleyin.
SquareRoot
Kodu aşağıdaki gibi değiştirin:public double SquareRoot(double input) { double result = input; double previousResult = -input; while (Math.Abs(previousResult - result) > result / 1000) { previousResult = result; result = result - (result * result - input) / (2 * result); } return result; }
Test Gezgini'nde Tümünü Çalıştır'ı seçin.
İki test de geçti.
Olağanüstü durumlar için test ekleme
Negatif girişler için yeni bir test ekleyin:
[TestMethod] public void RooterTestNegativeInput() { Rooter rooter = new Rooter(); Assert.ThrowsException<ArgumentOutOfRangeException>(() => rooter.SquareRoot(-1)); }
Test Gezgini'nde Tümünü Çalıştır'ı seçin.
Test döngüleri altındaki yöntemin el ile iptal edilmesi gerekir.
Test Gezgini'nin araç çubuğunda İptal'i seçin.
Test yürütmeyi durdurur.
Yönteminin
SquareRoot
başına aşağıdakiif
deyimi ekleyerek kodu düzeltin:public double SquareRoot(double input) { if (input <= 0.0) { throw new ArgumentOutOfRangeException(); } ...
Test Gezgini'nde Tümünü Çalıştır'ı seçin.
Tüm testler geçer.
Test altındaki kodu yeniden düzenleme
Kodu yeniden düzenleme, ancak testleri değiştirme.
İpucu
Yeniden düzenleme , kodun daha iyi veya daha kolay anlaşılmasını sağlamayı amaçlayan bir değişikliktir. Kodun davranışını değiştirmek için tasarlanmamıştır ve bu nedenle testler değiştirilmez.
Yeniden düzenleme adımlarını işlevselliği genişleten adımlardan ayrı olarak gerçekleştirmenizi öneririz. Testleri değiştirmeden tutmak, yeniden düzenleme sırasında yanlışlıkla hata vermediğiniz konusunda size güven verir.
yönteminde
SquareRoot
hesaplayanresult
satırı aşağıdaki gibi değiştirin:public double SquareRoot(double input) { if (input <= 0.0) { throw new ArgumentOutOfRangeException(); } double result = input; double previousResult = -input; while (Math.Abs(previousResult - result) > result / 1000) { previousResult = result; result = (result + input / result) / 2; //was: result = result - (result * result - input) / (2*result); } return result; }
Tümünü Çalıştır'ı seçin ve tüm testlerin yine de geçtiğini doğrulayın.