Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Assert ad alanının Microsoft.VisualStudio.TestTools.UnitTesting sınıflarını belirli işlevleri doğrulamak için kullanın. Test yöntemi, uygulamanızdaki kodu çalıştırır ancak doğruluğu yalnızca Assert ifadelerini eklediğinizde raporlar.
Genel Bakış
MSTest üç onay sınıfı sağlar:
| Class | Amaç |
|---|---|
Assert |
Değerler, türler ve özel durumlar için genel amaçlı doğrulamalar. |
StringAssert |
Desenler, alt dizeler ve karşılaştırmalar için özel dize doğrulamaları. |
CollectionAssert |
Koleksiyonları doğrulamak ve karşılaştırmak için koleksiyon doğrulamaları. |
Önemli
Yeni kod için her zaman sınıfını Assert kullanın.
StringAssert ve CollectionAssert sınıfları büyük olasılıkla gelecek bir sürümde kullanım dışı bırakılacaktır. Bunlar öncelikli olarak geriye dönük uyumluluk için korunur, ancak onayları üç türe bölmek bulunabilirliği zedelediğinden önerilmez.
Tüm onaylama yöntemleri, onay başarısız olduğunda görüntülenen isteğe bağlı bir ileti parametresini kabul eder ve nedeni belirlemenize yardımcı olur:
Assert.AreEqual(expected, actual, "Values should match after processing");
Bu Assert sınıf
test altındaki kodun beklendiği gibi davrandığını doğrulamak için Assert sınıfını kullanın.
Uyarı
MSTest 4.0'dan başlayarak, tüm Assert API'ler bağımsız değişken ifadesini yakalar ve hata iletilerine ekler. Bu destek, el ile message parametre olmadan daha zengin tanılama sağlar.
Yaygın onay yöntemleri
[TestMethod]
public async Task AssertExamples()
{
// Equality
Assert.AreEqual(5, calculator.Add(2, 3));
Assert.AreNotEqual(0, result);
// Reference equality
Assert.AreSame(expected, actual);
Assert.AreNotSame(obj1, obj2);
// Boolean conditions
Assert.IsTrue(result > 0);
Assert.IsFalse(string.IsNullOrEmpty(name));
// Null checks
Assert.IsNull(optionalValue);
Assert.IsNotNull(requiredValue);
// Type checks
Assert.IsInstanceOfType<IDisposable>(obj);
Assert.IsNotInstanceOfType<string>(obj);
// Exception testing (MSTest v3.8+)
Assert.ThrowsExactly<ArgumentNullException>(() => service.Process(null!));
await Assert.ThrowsExactlyAsync<InvalidOperationException>(
async () => await service.ProcessAsync());
}
Assert.That yöntemi
MSTest 4.0'dan başlayarak tüm Assert.That Boole ifadelerini değerlendirir ve net bir hata iletisi oluşturur. Daha zengin tanılamalar için Assert.That, ifade metnini otomatik olarak yakalamak için [CallerArgumentExpression] kullanır.
Assert.That(order.Total > 0);
Kullanılabilir API’ler
- Assert.AreEqual
- Assert.AreNotEqual
- Assert.AreNotSame
- Assert.AreSame
- Assert.Contains
- Assert.ContainsSingle
- Assert.DoesNotContain
- Assert.DoesNotEndWith
- Assert.DoesNotMatchRegex
- Assert.DoesNotStartWith
- Assert.EndsWith
- Assert.Fail
- Assert.HasCount
- Assert.Inconclusive
- Assert.IsEmpty
- Assert.IsExactInstanceOfType
- Assert.IsFalse
- Assert.IsGreaterThan
- Assert.IsGreaterThanOrEqualTo
- Assert.IsInRange
- Assert.IsInstanceOfType
- Assert.IsLessThan
- Assert.IsLessThanOrEqualTo
- Assert.IsNegative
- Assert.IsNotEmpty
- Assert.IsNotExactInstanceOfType
- Assert.IsNotInstanceOfType
- Assert.IsNotNull
- Assert.IsNull
- Assert.IsPositive
- Assert.IsTrue
- Assert.MatchesRegex
- Assert.StartsWith
Assert.That- Assert.Throws
- Assert.ThrowsAsync
- Assert.ThrowsExactly
- Assert.ThrowsExactlyAsync
Uyarı
MSTest 3.8'den itibaren koleksiyon doğrulamaları Assert.Contains, Assert.DoesNotContain, Assert.HasCount, Assert.IsEmpty, Assert.IsNotEmpty ve Assert.ContainsSingle içerir.
MSTest 3.10'dan itibaren karşılaştırma doğrulamaları Assert.IsInRange, Assert.IsGreaterThan, Assert.IsGreaterThanOrEqualTo, Assert.IsLessThan, Assert.IsLessThanOrEqualTo, Assert.IsPositive ve Assert.IsNegative öğelerini içerir.
MSTest 3.10 itibarıyla, dize eşleştirme doğrulamaları Assert.StartsWith, Assert.EndsWith, Assert.MatchesRegex, Assert.DoesNotStartWith, Assert.DoesNotEndWith ve Assert.DoesNotMatchRegex içerir.
MSTest 4.1’den itibaren, Assert.IsExactInstanceOfType ve Assert.IsNotExactInstanceOfType tam tür eşleşmesi gerektirir. 'den farklı olarak Assert.IsInstanceOfType, bu yöntemler türetilmiş türlerle eşleşmez.
MSTest 4.3'te yeni koleksiyon ve denklik onayları
Uyarı
MSTest 4.3.0'da aşağıdaki onaylama yöntemleri kullanıma sunulmuştur.
-
Assert.AreSequenceEqual/Assert.AreNotSequenceEqual— öğeye göre sıra karşılaştırması. Öğe sırasını yok saymak içinSequenceOrder.InAnyOrdergeçin. -
Assert.AreEquivalent/Assert.AreNotEquivalent— iki nesnenin veya koleksiyonun derin yapısal karşılaştırması. -
Assert.ContainsAll/Assert.DoesNotContainAll— bir koleksiyonun beklenen her öğeyi içerdiğini (veya içermediğini) onaylar. -
Assert.AreAllNotNull— bir koleksiyondaki her öğeninnullolmadığını doğrular. -
Assert.AreAllDistinct— bir koleksiyonun tüm öğelerinin ayrı olduğunu onaylar. -
Assert.AreAllOfType— koleksiyonun her öğesinin beklenen türde olduğunu onaylar.
Koleksiyonları karşılaştırırken, öğeler yerine referansları karşılaştıran Assert.AreEqual yerine bu yöntemleri tercih edin.
MSTest 4.3 ayrıca şunları ekler:
- Onay hatası iletilerinde değerlerin nasıl işlendiğini özelleştirmek için deneysel
Assert.AddValueFormatterAPI. -
Span<T> için Memory<T> ve
Assert.HasCountaşırı yüklemeleri. - Değerlendirilen ifadeyi içeren,
Assert.IsTrue,Assert.IsFalse,Assert.IsNullveAssert.IsNotNulliçin yapılandırılmış doğrulama başarısızlığı iletileri. - Zaman uyumsuz
Assert.ThrowsAsync/Assert.ThrowsExactlyAsyncyöntemler için ilişkilendirilmiş dize iletisi aşırı yüklenir ve aksi takdirde beklenmeyecekValueTask<TResult>olan geri dönen temsilciler reddedilir. - Hata iletilerinde
Assert.Throws*yığın izlemeleri ve iç özel durumlar dahil olmak üzere tam özel durum ayrıntıları. - MSTest uygulama çerçevelerini gizleyen ve yerleşik sayısal değerleri tam duyarlıkta görüntüleyen doğrulama başarısızlığı yığınları.
Önemli
Aşağıdaki doğrulama aşırı yüklemeleri MSTest 4.4 için planlanmıştır ve MSTest 4.4.0 yayımlanana kadar yalnızca önizleme sürümlerinde kullanılabilir.
MSTest 4.4, Assert.IsNotEmpty, Assert.IsEmpty ve kalan koleksiyon API'lerine span ve memory aşırı yüklemeleri ekler. Aşırı yüklemeler , , ReadOnlySpan<T>Memory<T>ve ReadOnlyMemory<T>kabul Span<T>eder:
- Tüm öğe denetimleri:
AreAllDistinct,AreAllNotNullveAreAllOfType. - Karşılaştırmalar:
AreEquivalent,AreNotEquivalent,AreSequenceEqualveAreNotSequenceEqual. - Kapsama:
Contains,ContainsAll,ContainsSingle,DoesNotContainveDoesNotContainAll.
MSTest 4.4 ve MTP 2.4 önizlemeleriyle, bunu destekleyen IDE'ler ve raporlayıcılar, doğrulamaların beklenen ve gerçek değerlerini ayrı yapılandırılmış özellikler olarak alır. Tüketicilerin hata iletisinden bu değerleri ayrıştırması gerekmez.
Assert.AddValueFormatter bir IDisposable kayıt döndürür. Biçimlendiriciyi kaldırmak için kaydı serbest bırakın. Biçimlendirici yalnızca geçerli asenkron bağlam için geçerlidir; bu nedenle paralel testler, birbirlerinin çıktısını değiştirmeden farklı biçimlendiriciler kullanabilir. Bu API, MSTest 4.3'te deneysel olduğundan, kullanmadan önce MSTESTEXP tanılamasını onaylayın veya gizleyin.
Assert.Scope() ile esnek doğrulamalar
Önemli
Assert.Scope() deneysel bir API'dir. Bunu kullanmak, API’nin yapısının ve davranışının gelecekteki sürümlerde değişebileceğini kabul ettiğinizi belirtmek için bastırdığınız MSTESTEXP tanılamasını üretir (örneğin, #pragma warning disable MSTESTEXP ile veya projenizin .editorconfig dosyasında).
Varsayılan olarak, her onay işlemi başarısız olur olmaz bir AssertFailedException atar ve bu da testi hemen sonlandırır.
Assert.Scope(), yumuşak doğrulamaları sunuyor: bir kapsam etkinken, doğrulama başarısızlıkları fırlatılmak yerine toplanır; böylece yürütme devam eder ve kapsamdaki tüm başarısızlıkları tek seferde görebilirsiniz. Kapsam sonlandırıldığında, biriken hatalar birlikte rapor edilir:
[TestMethod]
public void ValidatePerson()
{
using (Assert.Scope())
{
Assert.AreEqual("Jane", person.FirstName); // failure collected, execution continues
Assert.AreEqual("Doe", person.LastName); // failure collected, execution continues
Assert.IsTrue(person.IsActive); // failure collected, execution continues
}
// On Dispose, all collected failures are reported together.
}
Kapsam kaldırıldığında:
- Tam olarak bir başarısızlık yakalandıysa, orijinal
AssertFailedExceptionfırlatılır. - Birden çok hata toplandıysa, bunların tümünü bir
AssertFailedExceptioniçinde saran tek birAggregateExceptionfırlatılır.
Ardıl koşullar bir kapsamda uygulanmaz
Başarısız bir onaylama işlemi artık bir kapsamın içine girmediğinden, sonrasında çalışan kod başarılı olan onaylama işlemine dayanamaz. Bu, null atanabilirlik ve tür daraltma dahil olmak üzere her ardıl koşul için geçerlidir:
using (Assert.Scope())
{
Assert.IsNotNull(item);
// 'item' might still be null here: the failure was collected, not thrown.
Assert.AreEqual("expected", item.Value);
// 'item.Value' might not equal "expected" either.
}
Başarısız bir doğrulama, kapsam içinde daha sonraki bir satırda NullReferenceException'a (veya başka bir istisnaya) yol açacaksa, bu ikincil istisna ayrı bir yazılım hatası değil, önceden kaydedilmiş başarısızlığın bir belirtisidir. İlk doğrulama başarısızlığı, kapsam sonlandırıldığında hâlâ bildirilir.
Değer döndüren doğrulamalar, bir kapsam içinde başarısız olduklarında null/default döndürür.
Bazı onaylar başarıda bir değer döndürür; örneğin, ThrowsThrowsExactly yakalanan özel durumu döndürür ve ContainsSingle eşleşen öğeyi döndürür. Bu doğrulamalardan biri bir kapsamda başarısız olursa, hata toplanır ve yöntem, bir özel durum fırlatmak yerine null/default döndürür:
using (Assert.Scope())
{
// No exception is thrown by the lambda, so the assertion fails. The failure is
// collected and 'ex' is null. Accessing 'ex' below throws NullReferenceException.
InvalidOperationException ex = Assert.Throws<InvalidOperationException>(() => { });
_ = ex.Message; // NullReferenceException—don't use the return value in a scope
}
Bir kapsam içinde kullanılan soft assertion'ın döndürdüğü değere güvenmeyin. Döndürülen değere (örneğin yakalanan özel duruma) ihtiyacınız varsa, doğrulamayı kapsamın dışında çağırın veya testi, kapsam sonlandırılana kadar hiçbir şey dönüş değerine bağlı olmayacak şekilde yeniden yapılandırın.
Assert.Fail ve Assert.Inconclusive her zaman hata fırlatır
Fail ve Inconclusive asla yumuşak olmazlar. Koşulsuz bir test sonucunu ifade ettiklerinden, bir kapsamın içinde bile olsalar her zaman hemen fırlatırlar. Bir koşul kritik olduğunda ve testin geri kalanı bu koşul olmadan anlamlı bir şekilde devam edememe durumunda bunlardan birini kullanın.
İç içe kapsamlar desteklenmez
Assert.Scope() çağrılarını iç içe kullanamazsınız. Aynı anda yalnızca bir doğrulama kapsamı etkin olabilir.
Bu StringAssert sınıf
Dizeleri karşılaştırmak ve incelemek için sınıfını StringAssert kullanın.
Warning
Sınıfın StringAssert gelecekteki bir sürümde kullanım dışı bırakılması olasıdır. Yalnızca geriye dönük uyumluluk için sürdürülmektedir ve yeni kodlarda kullanılması önerilmez. Tüm StringAssert yöntemlerin Assert sınıfında eşdeğerleri vardır ve bu da daha iyi bulunabilirlik sunar. Mevcut kullanımları taşımak için bkz. çözümleyici MSTEST0046.
Kullanılabilir API'ler şunlardır:
- StringAssert.Contains
- StringAssert.DoesNotMatch
- StringAssert.EndsWith
- StringAssert.Matches
- StringAssert.StartsWith
Bu CollectionAssert sınıf
CollectionAssert Nesne koleksiyonlarını karşılaştırmak veya bir koleksiyonun durumunu doğrulamak için sınıfını kullanın.
Warning
Sınıfın CollectionAssert gelecekteki bir sürümde kullanım dışı bırakılması olasıdır. Temel olarak geriye dönük uyumluluk için sürdürülür ve yeni kodda kullanılması önerilmez.
Assert üzerinde eşdeğer bir yöntem varsa (Assert.Contains, Assert.DoesNotContain veya Assert.HasCount gibi), daha iyi keşfedilebilirlik için Assert kullanın.
Kullanılabilir API'ler şunlardır:
- CollectionAssert.AllItemsAreInstancesOfType
- CollectionAssert.AllItemsAreNotNull
- CollectionAssert.AllItemsAreUnique
- CollectionAssert.AreEqual
- CollectionAssert.AreEquivalent
- CollectionAssert.AreNotEqual
- CollectionAssert.AreNotEquivalent
- CollectionAssert.Contains
- CollectionAssert.DoesNotContain
- CollectionAssert.IsNotSubsetOf
- CollectionAssert.IsSubsetOf
Assert.That ile özel doğrulamalar oluşturun
Yerleşik onaylama yöntemleri her senaryoyu kapsamaz. MSTest, onaylama altyapısını kendi denetimlerinizle genişletmeniz için Assert.That singleton özelliğini bir genişletilebilirlik kancası olarak sunar. Örnek türüne Assert C# uzantısı yöntemleri olarak özel onaylar eklersiniz ve çağıranlar bunları tanıdık Assert.That.MyAssertion(...) söz dizimiyle çağırır.
Daha iyi keşfedilebilirlik için proje genelindeki doğrulamaları özel bir statik sınıfta düzenleyin.
Assert.That üzerinden erişilen özel doğrulamalar, IntelliSense'te yerleşik yöntemlerle birlikte görüntülenir; böylece kullanıcılar ayrı bir yardımcı türü ayrıca hatırlamak zorunda kalmaz.
Özel doğrulama oluşturma
Koşul başarısız olduğunda Assert fırlatan ve AssertFailedException türünü hedefleyen bir uzantı yöntemi ekleyin:
using System;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
public static class CustomAssertExtensions
{
public static void IsPrime(this Assert assert, int value)
{
if (value < 2 || Enumerable.Range(2, (int)Math.Sqrt(value) - 1).Any(i => value % i == 0))
{
throw new AssertFailedException($"Assert.That.IsPrime failed. Value <{value}> is not a prime number.");
}
}
}
Özel doğrulama kullan
Uzantı yöntemlerinizi içeren ad alanını içeri aktardıktan sonra, özel doğrulamanızı Assert.That aracılığıyla çağırın:
[TestMethod]
public void Compute_ReturnsPrime()
{
int result = _calculator.NextPrime(10);
Assert.That.IsPrime(result);
}
StringAssert ve CollectionAssert üzerindeki uzantı kancaları
StringAssert.That ve CollectionAssert.That özellikleri, geriye dönük uyumluluk için aynı singleton desenini sunar. Yeni özel doğrulamalar için her zaman Assert.That öğesini hedefleyin. Aksi takdirde, yardımcılarınız eski sınıflarla aynı bulunabilirlik sorunlarını devralır ve StringAssert ile CollectionAssert kullanımdan kaldırılırsa taşınmaları gerekir.
Assert.Thatözellik ve yöntem karşılaştırması Assert.That(...)
Uyarı
Genişletilebilirlik kancası olarak kullanılan singleton Assert.That MSTest 3.8'e eklenen yöntemleAssert.That(() => condition) karıştırmayın. İkincisi bir Boole ifadesi kabul eder ve ifade ağacını analiz ederek ayrıntılı hata iletileri oluşturur (örneğin, Assert.That(() => order.Total > 0)). İki API bir adı paylaşır ancak farklı amaçlara hizmet eder.
En iyi yöntemler
Belirli onayları kullanın: Daha iyi hata iletileri için
AreEqualyerineIsTrue(a == b)tercih edin.Açıklayıcı iletiler ekleyin: Net onay iletileriyle hataları hızla belirlemeye yardımcı olun.
Bir kerede bir şeyi test edin: Her test yöntemi tek bir davranışı doğrulamalıdır.
Özel durumlar için
Throws/ThrowsExactlykullanın: MSTest v3.8+'daAssert.Throwsözelliği yerineAssert.ThrowsExactly,ThrowsAsyncve bunların zaman uyumsuz karşılıkları (ThrowsExactlyAsync,ExpectedException) tercih edin.AssertStringAssert/ yerineCollectionAsserttercih edin: Daha iyi bulunabilirlik ve tutarlılık içinAssertsınıfını kullanın.StringAssertveCollectionAssertsınıfları büyük olasılıkla gelecek bir sürümde kullanım dışı bırakılacaktır.Özel onaylar için
Assert.Thatgenişletin: Tutarlı keşfedilebilirlik için, özel onaylarıAssertüzerinde uzantı yöntemleri olarak ekleyin ve bunlarıAssert.Thataracılığıyla çağırın. Yeni koddaStringAssert.ThatveyaCollectionAssert.Thathedeflemeyin.
İlgili çözümleyiciler
Aşağıdaki çözümleyiciler onayların düzgün bir şekilde kullanımını sağlamaya yardımcı olur:
-
MSTEST0006 - Özniteliğinden kaçının
ExpectedException, bunun yerine yöntemleri kullanınAssert.Throws. - MSTEST0017 - Doğrulama argümanları doğru sırayla geçirilmelidir.
- MSTEST0023 - Boole onaylarını olumsuzlamayın.
-
MSTEST0025 - Her zaman yanlış olan koşullardan ziyade
Assert.Failtercih edin. - MSTEST0026 - Onay bağımsız değişkenleri koşullu erişim işlemlerinden kaçınmalıdır.
- MSTEST0032 - Her zaman doğru olan assert koşullarını gözden geçirin.
- MSTEST0037 - Uygun onay yöntemlerini kullanın.
-
MSTEST0038 - Değer türleriyle
Assert.AreSamekullanmaktan kaçının. -
MSTEST0039 - Daha
Assert.Throwsyeni yöntemler kullanın. - MSTEST0040 - Assert ifadelerini async void bağlamında kullanmaktan kaçının.
-
MSTEST0046 - yerine
AssertkullanınStringAssert. -
-
Assert.ThrowsMSTEST0051 tek bir deyim içermelidir. -
MSTEST0053 - Biçim parametrelerinden kaçının
Assert. - MSTEST0058 - Catch bloklarında doğrulamalardan kaçınılmalıdır.