Microsoft IntelliTest’e Genel Bakış

IntelliTest, hataları erkenden bulmanıza olanak sağlar ve test bakımı maliyetlerini düşürür. IntelliTest, otomatikleştirilmiş ve şeffaf bir test yaklaşımı kullanarak .NET kodunuz için bir aday test paketi oluşturabilir. Belirttiğiniz doğruluk özellikleri, test paketi oluşturma işlemine daha fazla yol gösterebilir. IntelliTest, test edilen kod geliştikçe, otomatik olarak test paketini de geliştirir.

Not

IntelliTest yalnızca Enterprise sürümünde kullanılabilir. .NET Framework'ün hedeflendiği C# kodu için desteklenir. IntelliTest ile .NET 6 desteği için Visual Studio Enterprise'ın Önizleme sürümünü yükleyin ve duyuruya bakın.

Karakterizasyon testleri IntelliTest, geleneksel birim testi paketi açısından kodun davranışını belirlemenize olanak sağlar. Böyle bir test paketi, gerileme paketi olarak kullanılabilir ve eski veya bilindik olmayan kodun yeniden düzenlenmesiyle ilişkili karmaşıklığın giderilmesinde temeli oluşturur.

Kılavuzlu test girişi oluşturma IntelliTest, genellikle herhangi bir kullanıcı müdahalesi olmadan hassas test girişi değerlerini otomatik olarak oluşturmak için açık kod analizi ve kısıtlamayı giderme yaklaşımını benimser. Karmaşık nesne türleri için otomatik olarak üreteçler oluşturur. Üreteçleri gereksinimlerinize uygun şekilde genişletip yapılandırarak test girişi oluşturma işlemine yol gösterebilirsiniz. Kodda onay olarak belirtilen doğruluk özellikleri, test girişi oluşturma işlemine daha fazla yol göstermek için otomatik olarak kullanılır.

IDE tümleştirmesi IntelliTest, Visual Studio IDE ile tamamen tümleşiktir. Test paketi oluşturma sırasında toplanan tüm bilgiler (örn. otomatik olarak oluşturulan girişler, kodunuzun çıktısı, oluşturulan test çalışmaları ve bunların başarı veya başarısızlık durumu), Visual Studio IDE içinde görüntülenir. Visual Studio IDE’den çıkmadan kodunuzu düzeltme ile IntelliTest’i yeniden çalıştırma arasında kolayca yineleme yapabilirsiniz. Testler çözüme Birim Testi Projesi olarak kaydedilebilir ve daha sonra Visual Studio Test Gezgini tarafından otomatik olarak algılanabilir.

Mevcut test uygulamalarını tamamlama Hali hazırda takip ediyor olabileceğiniz tüm mevcut test uygulamalarını tamamlamak için IntelliTest’i kullanın.

Test etmek istiyorsanız:

  • İlkel veriler veya ilkel veri dizileri üzerindeki algoritmalar:
  • Derleyici gibi karmaşık veriler üzerinde algoritmalar:
    • IntelliTest’in önce verilerin soyut temsilini oluşturmasını ve sonra bunu algoritmaya beslemesini sağlayın
    • IntelliTest’in özel nesne oluşturma ve veri sabitlerini kullanarak örnekler derlemesini ve sonra algoritmayı çağırmasını sağlayın
  • Veri kapsayıcıları:
  • Mevcut bir kod tabanı:

IntelliTest Merhaba Dünya

IntelliTest, test edilen programla ilgili girişleri bulur, bu da ünlü Merhaba Dünya! dizesini oluşturmak için kullanabileceğiniz anlamına gelir. Burada, C# MSTest tabanlı bir test projesi oluşturduğunuz ve Microsoft.Pex.Framework başvurusunu eklediğiniz varsayılır. Farklı bir test çerçevesi kullanıyorsanız bir C# sınıf kitaplığı oluşturun ve projenin nasıl ayarlanacağına ilişkin test çerçevesi belgelerine bakın.

Aşağıdaki örnek, IntelliTest'in gerekli dizeyi oluşturması için value adlı parametrede iki kısıtlama oluşturur:

using System;
using Microsoft.Pex.Framework;
using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public partial class HelloWorldTest {
    [PexMethod]
    public void HelloWorld([PexAssumeNotNull]string value) {
        if (value.StartsWith("Hello")
            && value.EndsWith("World!")
            && value.Contains(" "))
            throw new Exception("found it!");
    }
}

IntelliTest, derlenip yürütüldükten sonra aşağıdaki küme gibi bir dizi test oluşturur:

  1. ""
  2. "\0\0\0\0\0"
  3. "Merhaba"
  4. "\0\0\0\0\0\0"
  5. "Merhaba\0"
  6. "Merhaba\0\0"
  7. "Merhaba\0Dünya!"
  8. "Merhaba Dünya!"

Not

Derleme sorunları için, Microsoft.VisualStudio.TestPlatform.TestFramework ve Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions başvurularını, Microsoft.VisualStudio.QualityTools.UnitTestFramework başvurusuyla değiştirin.

Oluşturulan testlerin nereye kaydedileceğini anlamak için IntelliTest ile birim testleri oluşturma bölümünü okuyun. Oluşturulan test kodu, aşağıdaki kod gibi bir test içermelidir:

[TestMethod]
[PexGeneratedBy(typeof(global::HelloWorldTest))]
[PexRaisedException(typeof(Exception))]
public void HelloWorldThrowsException167()
{
    this.HelloWorld("Hello World!");
}

Bu kadar kolay!

Ek kaynaklar:

Önemli öznitelikler

using Microsoft.Pex.Framework;

[..., PexClass(typeof(Foo))]
public partial class FooTest {
    [PexMethod]
    public void Bar([PexAssumeNotNull]Foo target, int i) {
        target.Bar(i);
    }
}
[assembly: PexAssemblyUnderTest("MyAssembly")] // also instruments "MyAssembly"
[assembly: PexInstrumentAssembly("Lib")]

Önemli statik yardımcı sınıfları

  • PexAssume, varsayımları değerlendirir (giriş filtreleme)
  • PexAssert, onay deyimlerini değerlendirir
  • PexChoose, yeni seçimler oluşturur (ek girişler)
  • PexObserve, oluşturulan testlere canlı değerleri kaydeder
[PexMethod]
void StaticHelpers(Foo target) {
    PexAssume.IsNotNull(target);

    int i = PexChoose.Value<int>("i");
    string result = target.Bar(i);

    PexObserve.ValueForViewing<string>("result", result);
    PexAssert.IsNotNull(result);
}

Sınırlamalar

Bu bölümde, IntelliTest kısıtlamaları açıklanmaktadır:

Belirleyici olmama

IntelliTest, analiz edilen programın belirleyici olduğunu varsayar. Değilse, IntelliTest bir keşif sınırına ulaşana kadar döngü oluşturur.

IntelliTest, IntelliTest'in denetleyebildiği girişlere dayanırsa programı caydırıcı olmayan olarak kabul eder.

IntelliTest, parametreli birim testlerine sağlanan ve PexChoose öğesinden alınan girişleri denetler. Bu anlamda, yönetilmeyen veya yetkisiz koda yapılan çağrıların sonuçları, izlenen programa yönelik "girişler" olarak da kabul edilir, ancak IntelliTest bunları denetleyemez. Programın denetim akışı bu dış kaynaklardan gelen belirli değerlere bağlıysa, IntelliTest programı daha önce açığa çıkarılmış alanlara "yönlendiremez".

Ayrıca program yeniden çalıştırılırken dış kaynaklardan gelen değerler değişiyorsa da o program belirleyici değil olarak değerlendirilir. Bu gibi durumlarda IntelliTest, programın yürütmesi üzerinde denetimini kaybeder ve araması verimsiz olur.

Bazen böyle bir şey olduğunda belli olmaz. Aşağıdaki örnekleri değerlendirin:

  • GetHashCode() yönteminin sonucu yönetilmeyen kod tarafından sağlanır ve tahmin edilebilir değildir.
  • System.Random sınıfı, gerçekten rastgele değerler sunmak için geçerli sistem saatini kullanır.
  • System.DateTime sınıfı, IntelliTest'in denetimi altında olmayan geçerli saati sağlar.

Eşzamanlılık

IntelliTest, çok iş parçacıklı programları işlemez.

Yerel kod

IntelliTest, P/Invoke aracılığıyla çağrılan x86 yönergeleri gibi yerel kodu anlamaz. Bu tür çağrıların, kısıtlama çözücüye geçirilebilen kısıtlamalara nasıl çevrileceğini bilmez. .NET kodu için bile yalnızca işaretlediği kodu analiz edebilir. IntelliTest, yansıma kitaplığı da dahil olmak üzere mscorlib'in belirli bölümlerini izleyemez. DynamicMethod izlenemez.

Önerilen çözüm, bu tür yöntemlerin dinamik bir derlemedeki türlerde bulunduğu bir test modunun olmasıdır. Ancak, bazı yöntemler yetkisiz olsa bile IntelliTest, izlemeli kodun mümkün olduğunca çoğunu kapsamaya çalışır.

Platform

IntelliTest yalnızca X86, 32-bit .NET framework’te desteklenir.

Dil

Prensipte IntelliTest, herhangi bir .NET dilinde yazılmış rastgele .NET programlarını analiz edebilir. Ancak Visual Studio’da yalnızca C# dilini destekler.

Sembolik akıl yürütme

IntelliTest, test ve test edilmekte olan program için hangi değerlerin ilişkili olduğunu belirlemek için otomatik bir kısıtlama çözücü kullanır. Ancak kısıtlama çözücünün yetenekleri şu an ve gelecekte her zaman sınırlı olacaktır.

Hatalı yığın izlemeleri

IntelliTest, her bir izleme yönteminde özel durumları yakalar ve "yeniden oluşturur" olduğundan, yığın izlemelerindeki satır numaraları doğru olmaz. Bu, “yeniden oluşturma” yönergesinin tasarımından kaynaklanan bir sınırlamadır.