Share via


Dinamik sembolik yürütme kullanarak giriş oluşturma

IntelliTest, programdaki dal koşullarını analiz ederek parametreli birim testleri için girişler oluşturur. Test girişleri, programın yeni dallanma davranışlarını tetikleyip tetikleyemeyeceği temelinde seçilir. Analiz artımlı bir işlemdir. Resmi test giriş parametrelerine göre bir koşulu q: I -> {true, false} iyileştirir I. q IntelliTest'in önceden gözlemlediği davranış kümesini temsil eder. Başlangıçta, q := falsehenüz hiçbir şey gözlemlenmediğinden.

Döngünün adımları şunlardır:

  1. IntelliTest, kısıtlama çözücü kullanan girişleri iq(i)=false belirler. Oluşturma işlemiyle giriş i , daha önce görülmemiş bir yürütme yolu alır. Başlangıçta bu herhangi bir giriş olabileceği anlamına gelir i çünkü henüz hiçbir yürütme yolu keşfedilmemiştir.

  2. IntelliTest, seçilen giriş iile testi yürütür ve testin ve test altındaki programın yürütülmesini izler.

  3. Yürütme sırasında program, programın tüm koşullu dalları tarafından belirlenen belirli bir yolu izler. Yürütmeyi belirleyen tüm koşullar kümesine yol koşulu adı verilir ve resmi giriş parametreleri üzerinde koşul p: I -> {true, false} olarak yazılır. IntelliTest bu koşulun bir gösterimini hesaplar.

  4. IntelliTest kümeleri q := (q or p). Başka bir deyişle, tarafından ptemsil edilen yolu gördüğü gerçeğini kaydeder.

  5. 1. adıma gidin.

IntelliTest'in kısıtlama çözücü, .NET programlarında görünebilecek tüm türlerin değerleriyle ilgilenebilir:

IntelliTest, belirtilen varsayımları ihlal eden girişleri filtreler.

Anlık girişlerin (parametreli birim testlerine yönelik bağımsız değişkenler) yanı sıra, bir test PexChoose statik sınıfından daha fazla giriş değeri çizebilir. Seçenekler ayrıca parametreli sahte işlemlerin davranışını da belirler.

Kısıtlama çözücü

IntelliTest, bir testin ve test altındaki programın ilgili giriş değerlerini belirlemek için bir kısıtlama çözücü kullanır.

IntelliTest, Z3 kısıtlama çözücüyü kullanır.

Dinamik kod kapsamı

IntelliTest, çalışma zamanı izlemesinin yan etkisi olarak dinamik kod kapsamı verilerini toplar. Bu dinamik olarak adlandırılır çünkü IntelliTest yalnızca yürütülen kodu bilir, bu nedenle diğer kapsam aracının genellikle yaptığı gibi kapsama için mutlak değerler veremez.

Örneğin, IntelliTest dinamik kapsamı 5/10 temel blok olarak bildirdiğinde, on bloktan beşinin kapsandığı anlamına gelir; burada analiz tarafından şimdiye kadar ulaşılan tüm yöntemlerdeki blokların toplam sayısı (test altındaki derlemede bulunan tüm yöntemlerin aksine) on blok olur. Analizin ilerleyen bölümlerinde daha erişilebilir yöntemler keşfedildikçe hem payda (bu örnekte 5) hem de payda (10) artabilir.

Tamsayılar ve kayan noktalı sayılar

IntelliTest kısıtlama çözücü, test ve test altındaki program için farklı yürütme yollarını tetikleme amacıyla bayt, int, float ve diğerleri gibi temel öğe türlerinin test giriş değerlerini belirler.

Nesneler

IntelliTest mevcut .NET sınıflarının örneklerini oluşturabilir veya IntelliTest kullanarak belirli bir arabirimi uygulayan ve kullanıma bağlı olarak farklı şekillerde davranan sahte nesneleri otomatik olarak oluşturabilirsiniz.

Mevcut sınıfların örneğini oluşturma

Sorun nedir?

IntelliTest, bir test çalıştırdığında ve program test altındayken yürütülen yönergeleri izler. Özellikle, alanlara tüm erişimi izler. Ardından, nesneler ve alan değerleri dahil olmak üzere yeni test girişlerini belirlemek için bir kısıtlama çözücü kullanır; böylece test ve test altındaki program başka ilginç şekillerde davranır.

Bu, IntelliTest'in belirli türlerde nesneler oluşturması ve alan değerlerini ayarlaması gerektiği anlamına gelir. Sınıf görünürse ve görünür bir varsayılan oluşturucuya sahipse, IntelliTest sınıfın bir örneğini oluşturabilir. Sınıfın tüm alanları görünür durumdaysa, IntelliTest alanları otomatik olarak ayarlayabilir.

Tür görünmüyorsa veya alanlar görünmüyorsa, IntelliTest'in en yüksek kod kapsamını elde etmek için nesneleri oluşturmak ve ilginç durumlara getirmek için yardıma ihtiyacı vardır. IntelliTest, örnekleri rastgele yollarla oluşturmak ve başlatmak için yansıma kullanabilir, ancak nesneyi normal program yürütme sırasında asla gerçekleşemeyecek bir duruma getirebileceğinden bu genellikle tercih edilmez. Bunun yerine, IntelliTest kullanıcıdan gelen ipuçlarına dayanır.

Görünürlük

.NET ayrıntılı bir görünürlük modeline sahiptir: türler, yöntemler, alanlar ve diğer üyeler özel, genel, ve daha fazlası olabilir.

IntelliTest testler oluşturduğunda, oluşturulan testler bağlamından yalnızca .NET görünürlük kurallarıyla ilgili olarak yasal olan eylemleri (oluşturucuları çağırma, yöntemler ve alanları ayarlama gibi) gerçekleştirmeye çalışır.

Kurallar aşağıdaki gibidir:

  • İç üyelerin görünürlüğü

  • PexClass'ın özel ve aile (C# ile korunan) üyelerinin görünürlüğü

    • IntelliTest, oluşturulan testleri her zaman doğrudan PexClass'a veya bir alt sınıfa yerleştirir. Bu nedenle, IntelliTest tüm görünür aile üyelerini (C# ile korunan ) kullanabileceğini varsayar.
    • Oluşturulan testler doğrudan PexClass'a yerleştirilirse (genellikle kısmi sınıflar kullanılarak), IntelliTest PexClass'ın tüm özel üyelerini de kullanabileceğini varsayar.
  • Genel üyelerin görünürlüğü

    • IntelliTest, PexClass bağlamında görünür olan tüm dışarı aktarılan üyeleri kullanabileceğini varsayar.

Parametreli sahte nesneler

Arabirim türü parametresi olan bir yöntemi test etme Ya da korumalı olmayan bir sınıftan? IntelliTest, bu yöntem çağrıldığında daha sonra hangi uygulamaların kullanılacağını bilmiyor. Ve belki de test zamanında gerçek bir uygulama bile yoktur.

Geleneksel yanıt, sahte nesneleri açık davranışla kullanmaktır.

Sahte nesne bir arabirim uygular (veya korumalı olmayan bir sınıfı genişletir). Gerçek bir uygulamayı temsil etmez, yalnızca sahte nesneyi kullanarak testlerin yürütülmesine izin veren bir kısayoldur. Davranışı, kullanıldığı her test çalışması kapsamında el ile tanımlanır. Sahte nesneleri ve beklenen davranışlarını tanımlamayı kolaylaştıran birçok araç vardır, ancak bu davranış yine de el ile tanımlanmalıdır.

IntelliTest, sahte nesnelerdeki sabit kodlanmış değerler yerine değerleri oluşturabilir. IntelliTest, parametreli birim testlerine olanak sağladığı gibi parametreli sahteleri de etkinleştirir.

Parametreli sahteler iki farklı yürütme moduna sahiptir:

  • seçme: Kodu keşfederken parametreli sahteler ek test girişlerinin kaynağıdır ve IntelliTest ilginç değerler seçmeye çalışır
  • yeniden yürütme: Önceden oluşturulmuş bir testi yürütürken, parametreli sahteler davranışla saplamalar gibi davranır (başka bir deyişle, önceden tanımlanmış davranış).

Parametreli sahte değerler elde etmek için PexChoose kullanın.

Yapılar

IntelliTest'in yapı değerleriyle ilgili mantığı, nesnelerle başa çıkış şekline benzer.

Diziler ve dizeler

IntelliTest, bir test ve test altındaki programı çalıştırırken yürütülen yönergeleri izler. Özellikle, programın bir dizenin veya dizinin uzunluğuna (ve çok boyutlu bir dizinin alt sınırlarına ve uzunluklarına) bağlı olduğunu gözlemler. Ayrıca, programın bir dizenin veya dizinin farklı öğelerini nasıl kullandığını da gözlemler. Daha sonra test ve test altındaki programın ilginç şekillerde davranmasına neden olabilecek uzunlukları ve öğe değerlerini belirlemek için bir kısıtlama çözücü kullanır.

IntelliTest, ilginç program davranışlarını tetikleyebilmek için gereken dizilerin ve dizelerin boyutunu en aza indirmeye çalışır.

Ek girişler alma

PexChoose statik sınıfı, teste ek girişler elde etmek için kullanılabilir ve parametreli sahteleri uygulamak için kullanılabilir.

Geri bildirimde mi bulunmak istiyorsunuz?

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