Share via


Test oluşturma

Geleneksel birim testinde bir test birkaç şeyden oluşur:

  • Yöntem çağrıları dizisi
  • Yöntemlerin çağrıldığı bağımsız değişkenler; bağımsız değişkenler test girişleridir
  • Bir dizi onay belirterek test edilen uygulamanın hedeflenen davranışını doğrulama

Aşağıda örnek bir test yapısı verilmiştir:

[Test]
void MyTest() {
    // data
    ArrayList a = new ArrayList();

    // method sequence
    a.Add(5);

    // assertions
    Assert.IsTrue(a.Count==1);
    Assert.AreEqual(a[0], 5);
}

IntelliTest genellikle yöntem çağrılarının ve onaylarının sırasını sağlayan daha genel Parametreli Birim Testleri için ilgili bağımsız değişken değerlerini otomatik olarak belirleyebilir.

Test oluşturucuları

IntelliTest, yürütülecek test kapsamındaki uygulama yöntemlerinin bir dizisini seçerek ve ardından türetilmiş veriler üzerinde onayları denetlerken yöntemler için girişler oluşturarak test çalışmaları oluşturur.

Parametreli birim testi, gövdesinde bir dizi yöntem çağrısını doğrudan belirtir.

IntelliTest'in nesneleri oluşturması gerektiğinde, oluşturuculara ve fabrika yöntemlerine yapılan çağrılar gerektiğinde otomatik olarak diziye eklenir.

Parametreli birim testi

Parametreli Birim Testleri (PUT), parametre kullanan testlerdir. Genellikle kapalı yöntemler olan geleneksel birim testlerinden farklı olarak, PUT'lar herhangi bir parametre kümesini alır. Bu kadar basit mi? Evet - buradan, IntelliTest testten ulaşılabilen kodu tam olarak kapsayan (minimum) giriş kümesini oluşturmaya çalışır.

PUT'lar PexMethod özel özniteliği kullanılarak MSTest(veya NUnit, xUnit) ile benzer şekilde tanımlanır. PUT'lar, PexClass ile etiketlenmiş sınıflarda mantıksal olarak gruplandırılmış örnek yöntemleridir. Aşağıdaki örnekte MyPexTest sınıfında depolanan basit bir PUT gösterilmektedir:

[PexMethod]
void ReplaceFirstChar(string target, char c) {

    string result = StringHelper.ReplaceFirstChar(target, c);

    Assert.AreEqual(result[0], c);
}

burada ReplaceFirstChar bir dizenin ilk karakterinin yerini alan bir yöntemdir:

class StringHelper {
    static string ReplaceFirstChar(string target, char c) {
        if (target == null) throw new ArgumentNullException();
        if (target.Length == 0) throw new ArgumentOutOfRangeException();
        return c + target.Substring(1);
    }
}

Bu testten, IntelliTest test edilen kodun birçok yürütme yolunu kapsayan bir PUT için otomatik olarak girişler oluşturabilir. Farklı bir yürütme yolunu kapsayan her giriş, birim testi olarak "serileştirilir":

[TestMethod, ExpectedException(typeof(ArgumentNullException))]
void ReplaceFirstChar0() {
    this.ReplaceFirstChar(null, 0);
}
...
[TestMethod]
void ReplaceFirstChar10() {
    this.ReplaceFirstChar("a", 'c');
}

Genel parametreli birim testi

Parametreli birim testleri genel yöntemler olabilir. Bu durumda, kullanıcının PexGenericArguments kullanarak yöntemin örneğini oluşturmak için kullanılan türleri belirtmesi gerekir.

[PexClass]
public partial class ListTest {
    [PexMethod]
    [PexGenericArguments(typeof(int))]
    [PexGenericArguments(typeof(object))]
    public void AddItem<T>(List<T> list, T value)
    { ... }
}

Özel durumlara izin verme

IntelliTest, özel durumları beklenen özel durumlara ve beklenmeyen özel durumlara ayırmaya yardımcı olmak için çok sayıda doğrulama özniteliği sağlar.

Beklenen özel durumlar ExpectedException(typeof(xxx)) gibi uygun ek açıklamayla negatif test çalışmaları oluştururken, beklenmeyen özel durumlar başarısız test çalışmaları oluşturur.

[PexMethod, PexAllowedException(typeof(ArgumentNullException))]
void SomeTest() {...}

Doğrulayıcılar şunlardır:

İç türleri test etme

IntelliTest, iç türleri görebildiği sürece "test edebilir". IntelliTest'in türleri görmesi için, Visual Studio IntelliTest sihirbazları tarafından ürün veya test projenize aşağıdaki öznitelik eklenir:

[assembly: InternalsVisibleTo("Microsoft.Pex, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293")]

Varsayımlar ve onaylamalar

Kullanıcılar, testleriyle ilgili önkoşulları (varsayımlar) ve son koşullarını (onaylar) ifade etmek için varsayımları ve onayları kullanabilir. IntelliTest bir parametre değerleri kümesi oluşturduğunda ve kodu "araştırdığında", test varsayımını ihlal edebilir. Bu durumda, bu yol için bir test oluşturmaz, ancak sessizce yok sayar.

Onaylar, düzenli birim testi çerçevelerinde iyi bilinen bir kavramdır, bu nedenle IntelliTest desteklenen her test çerçevesi tarafından sağlanan yerleşik Assert sınıflarını zaten "anlar". Ancak çoğu çerçeve bir Assume sınıfı sağlamaz. Bu durumda IntelliTest, PexAssume sınıfını sağlar. Mevcut bir test çerçevesini kullanmak istemiyorsanız, IntelliTest'in PexAssert sınıfı da vardır.

[PexMethod]
public void Test1(object o) {
    // precondition: o should not be null
    PexAssume.IsNotNull(o);

    ...
}

Özellikle null olmayan varsayımı özel bir öznitelik olarak kodlanabilir:

[PexMethod]
public void Test2([PexAssumeNotNull] object o)
// precondition: o should not be null
{
   ...
}

Ön koşul

Bir yöntemin önkoşulu, yöntemin başarılı olacağı koşulları ifade eder.

Önkoşul genellikle parametreleri ve nesne durumunu denetleyerek ve ihlal edilirse ArgumentException veya InvalidOperationException oluşturarak zorlanır.

IntelliTest'te, parametreli birim testinin önkoşulu PexAssume ile ifade edilir.

Son koşul

Bir yöntemin son koşulu, ön koşulların başlangıçta geçerli olduğu varsayılarak, yöntemin yürütülmesi sırasında ve sonrasında tutulması gereken koşulları ifade eder.

Genellikle, son koşul Assert yöntemlerine çağrılar tarafından zorlanır.

IntelliTest ile parametreli birim testinin son koşulu PexAssert ile ifade edilir.

Test hataları

Oluşturulan bir test çalışması ne zaman başarısız olur?

  1. Yapılandırılan yol sınırları içinde sonlandırılmazsa, TestExcludePathBoundsExceeded seçeneği ayarlanmadığı sürece hata olarak kabul edilir

  2. Test bir PexAssumeFailedException oluşturursa başarılı olur. Ancak, TestEmissionFilter Tümü olarak ayarlanmadığı sürece genellikle filtrelenmiş olur

  3. Test bir onaylamayı ihlal ederse; örneğin, bir birim testi çerçevesinin onay ihlali özel durumu oluşturarak başarısız olur

Yukarıdakilerden hiçbiri bir karar vermezse, yalnızca özel durum oluşturmazsa test başarılı olur. Onay ihlalleri özel durumlarla aynı şekilde ele alınır.

Kurulum ve kapatma

Test çerçeveleriyle tümleştirmenin bir parçası olarak IntelliTest, kurulum ve yok etme yöntemlerini algılamayı ve çalıştırmayı destekler.

Örnek

using Microsoft.Pex.Framework;
using NUnit.Framework;

namespace MyTests
{
    [PexClass]
    [TestFixture]
    public partial class MyTestClass
    {
        [SetUp]
        public void Init()
        {
            // monitored
        }

        [PexMethod]
        public void MyTest(int i)
        {
        }

        [TearDown]
        public void Dispose()
        {
            // monitored
        }
    }
}

Daha fazla bilgi

Geri bildirimde mi bulunmak istiyorsunuz?

Fikirlerinizi ve özellik isteklerinizi Geliştirici Topluluğu’na gönderin.