MSTest onayları

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

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çin SequenceOrder.InAnyOrder geç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 öğenin null olmadığı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.AddValueFormatter API.
  • Span<T> için Memory<T> ve Assert.HasCount aşırı yüklemeleri.
  • Değerlendirilen ifadeyi içeren, Assert.IsTrue, Assert.IsFalse, Assert.IsNull ve Assert.IsNotNull için yapılandırılmış doğrulama başarısızlığı iletileri.
  • Zaman uyumsuz Assert.ThrowsAsync/Assert.ThrowsExactlyAsync yöntemler için ilişkilendirilmiş dize iletisi aşırı yüklenir ve aksi takdirde beklenmeyecek ValueTask<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, AreAllNotNullve AreAllOfType.
  • Karşılaştırmalar: AreEquivalent, AreNotEquivalent, AreSequenceEqualve AreNotSequenceEqual.
  • Kapsama: Contains, ContainsAll, ContainsSingle, DoesNotContainve DoesNotContainAll.

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 AssertFailedException fırlatılır.
  • Birden çok hata toplandıysa, bunların tümünü bir AssertFailedException içinde saran tek bir AggregateException fı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:

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:

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 AreEqual yerine IsTrue(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/ThrowsExactly kullanın: MSTest v3.8+'da Assert.Throws özelliği yerine Assert.ThrowsExactly, ThrowsAsync ve bunların zaman uyumsuz karşılıkları (ThrowsExactlyAsync, ExpectedException) tercih edin.

  • Assert StringAssert / yerine CollectionAssert tercih edin: Daha iyi bulunabilirlik ve tutarlılık için Assert sınıfını 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.

  • Özel onaylar için Assert.That genişletin: Tutarlı keşfedilebilirlik için, özel onayları Assert üzerinde uzantı yöntemleri olarak ekleyin ve bunları Assert.That aracılığıyla çağırın. Yeni kodda StringAssert.That veya CollectionAssert.That hedeflemeyin.

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ın Assert.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.Fail tercih 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.AreSame kullanmaktan kaçının.
  • MSTEST0039 - Daha Assert.Throws yeni yöntemler kullanın.
  • MSTEST0040 - Assert ifadelerini async void bağlamında kullanmaktan kaçının.
  • MSTEST0046 - yerine AssertkullanınStringAssert.
  • - Assert.Throws MSTEST0051 tek bir deyim içermelidir.
  • MSTEST0053 - Biçim parametrelerinden kaçının Assert .
  • MSTEST0058 - Catch bloklarında doğrulamalardan kaçınılmalıdır.

Ayrıca bakınız