|
Kanatlar-Birim testlerini akıllı ve tamamen otomatik hale getirinönsöz Birim test, yazılım kalitesini sağlamak için çok etkili bir yöntemdir; ister teste erken müdahale kavramı açısından olsun, ister kullanıcı arayüzünden etkilenmeden yüksek hızda doğrulanabilen birim testlerin özellikleri açısından olsun; bu nedenle sektör tarafından savunulan test odaklı geliştirme olarak, burada bahsedilen test sürücüsü daha çok ünite test sürücüsüne atıfta bulunur. Ancak, genel geliştirme ekibi hâlâ nadiren birim testlerini sistematik olarak yürütüyor ve uygulama yazılımı testleri daha çok profesyonel test ekipleri tarafından kara kutu testleri yapmak üzere yapılıyor. Birim testin en büyük zorluğu, giriş ve çıktının belirlenememesi değil; sonuçta modül geliştirme aşamasında zaten belirlenmiş olması; birim test vakalarının yazılması çok fazla geliştirici saati alacak ve ilgili istatistiklere göre, ünite test vakalarının süresi fonksiyonun geliştirme süresini çok daha aşacaktır. İşte geliştirmenin birim testleri yazmamasının en yaygın nedenlerinden birkazı: ●Gereksinimler her zaman sonsuzdur ve bir sonraki aşamada gerçekleşmesi gereken fonksiyonel gereksinimler vardır ve birimi doldurmaya zaman yoktur ●Desteklenmesi gereken çok fazla birim test var ve başlamak mümkün değil, bu yüzden öznel olarak direnemiyorum. ● Birim testleri yazmak zordur. Bir yandan, işlevsel fonksiyon uygulamasının yeterince makul olmaması, diğer yandan ise faydalı birim test çerçeveleri ve sahte çerçevelerin olmaması (veya bilinmeyen) olabilir. ● Birim testleri iş yüküne dahil değildir. İkincisi, fonksiyonel gereksinimler hâlâ istikrarsız ve birim testleri yazmanın maliyet performansı yüksek değil. Yani, gereksinimler yarın değişirse, sadece fonksiyonel kod değil, aynı zamanda birim testleri de iptal edilecek. Birim sınavları yazmazsanız, bu çabanın bu kısmı boşa gitmez. Aslında, yukarıdaki noktaların temel nedeni, ünite test yazmanın çok zaman alıcı olmasıdır; bu da sonunda test odaklı motorun güç kaybına yol açar ve test odaklı geliştirme vizyonunun gerçek senaryoda durmasına neden olur; çünkü bu sürücü için motoru inşa etmek çok zor ve pahalıdır. Piyasadaki çeşitli "x" birimleri ve birim test çerçeveleri, derin program anlayışına dayalı herhangi bir kullanım mantığı ve veri üretim yetenekleri olmadan test odaklı dış çerçeveler üretme sorununu çözer. Bu nedenle, geliştiricileri çeşitli geliştirme ile ilgili senaryolarda dirençli kılar. Wings'in (şu anda C için) çıkışı, programcılar için en büyük sorunlardan birini çözüyor ve birim testinin mevcut durumunu köklü bir şekilde değiştirme potansiyeline sahip; bu da sistem düzeyinde kara kutu testi ve devasa insan kaynaklarına dayalı otomatik testlerin baskısını etkili bir şekilde hafifletecek. Kısıtlama test vakaları programlar tarafından otomatik olarak oluşturulur ve en kritik temel teknoloji karmaşık parametre ayrıştırma teknolojisidir. Yani, derleyici seviyesinde rastgele karmaşık türler için içiçe içe düz özyinelemeli ayrıştırmayı keyfi olarak tanımlayabilir. Bu kritik teknolojideki bu atılım olmadan, otomatik test vakası oluşturma sistemi ya ticari olarak yeteneksiz olur ya da çok düşük verimlilikle uyumlu test verileri üretmeye evrilirdi. Örneğin, ünlü fuzzing aracı American Fuzzy Lop, kullanıcının programının gerektirdiği yapı türünü tanımlayamaz ve arama algoritmasını en dış katmana göre geliştirmesi gerekir. Programın özellikleri, arayüz seviyesindeki girdi ve dahili modülün veri gereksinimlerinin uzak olmasıdır ve dış veriler genellikle katman katman karmaşık dönüşümle dahili modülün gerektirdiği veri yapısı türüne dönüştürülür; bu nedenle dış katmandan araştırma için gereken hesaplama ve zaman hayal edilemez olacaktır. Amerikan Fuzzy Lop'a dayanarak, meşru bir SQL ifadesi üretebilmek için programın iç modülünün dakikalar veya saatler değil, günlerce keşfedilmesi gerekir. Bir diğer kısıtlama, her programın devralabileceği girdilerin çok sayıda kuralla dikkatlice yapılandırılmış ve derlenmiş veriler olmasıdır; bu verileri rastgele + keşif yöntemleriyle üretmek çok gerçekçi değil ve son derece zaman alıcıdır. Bu nedenle, kara kutudan ve en dıştaki girdiden otomatik olarak oluşturulan kullanım durumları oluşturmak mümkün değildir. Kullanım vakası odaklı, yazılımın iç yapısının analizinden oluşturuluyorsa, yazılımın derleme yapısını derinlemesine anlamak gerekir. Uygulanabilir bir test vakası oluşturma sistemi, programın ortasına (anahtar giriş noktasına) en uygun test giriş noktası olarak dayanmalıdır. Bu modüllerin girdileri, bulanık girdileri yüksek yapılandırılmış parametrelere dönüştürmüştür. Bu karmaşık yapılar tanımlanabildiği sürece, karmaşık veri türleri adım adım basit veri tiplerine ayrılabilir ve parametre oluşturma aynı anda tamamlanabilir, sürücü kullanım durumlarının oluşturulması otomatik olarak tamamlanabilir. Modül tabanlı testler, geleneksel birim testi olarak sınıflandırılabilir ve Ar-Ge aşamasında kusurları bulmanın ve kontrol altına alınmanın en iyi yoludur. Ancak, birim testinin sınırlamaları nedeniyle çok sayıda sürücü geliştirilmesi gerekiyor ve sektörde tanıtım ve uygulama oldukça sınırlıdır. Elbette, sistem entegre edildikten sonra sanal stub programları oluşturmaktan kaçınmak için birim testleri de yürütülebilir. Nebulas Testing'in Wings ürünü, birkaç gün önce ilk kez piyasaya sürülmüştür; zeki ve tamamen otomatik bir birim test vakası oluşturma sistemidir; aşağıdaki zorlukları inceleyip çözmüş ve şimdi sizinle paylaşılmaktadır. (1) Program parametrelerinin derinlemesine analizi Wings, derleyicinin temel teknolojisini kullanarak fonksiyona göre giriş kaynak dosyasına dayalı modül nesneleri oluşturur. Nesne, fonksiyonun giriş parametrelerini, dönüş değer tipini ve sürücü fonksiyon modülü ile test vakası modülü tarafından kullanılabilecek diğer bilgileri içerir. Her dosya, içindeki her fonksiyonun her parametresinin derinlemesine analizini yapan bir birimdir ve iç içe tipler, karmaşık tipler vb. için doğru ayrıştırma ve ayrıştırma sağlayabilen, karmaşık tipleri katman katman temel veri tipleri olarak açıklayabilir ve parametre yapısını içeren bir açıklama dosyası (PSD) oluşturabilir. (2) Fonksiyon sürücüsü otomatik modül üretimi PSD dosyasının format bilgilerine göre, test edilen kaynak programın tüm sürücü fonksiyonları otomatik olarak oluşturulur ve birim test süreci artık geliştiricilerin test fonksiyonlarını manuel yazmasına dayanmaz, sadece üretilen sürücü fonksiyonları ile test edilen kaynak dosyaları bir arada derlemesi yeterlidir; test sonuçları çalıştırılabilir ve test sonuçları görüntülenebilir. Test sürücüsü, PSD tanımına göre programı otomatik olarak oluşturur, test edilen testi yönlendiren tüm parametreleri ve gerekli küresel değişkenleri tamamen otomatik olarak oluşturur ve karmaşık değişkenler hiyerarşisine göre yapılandırılmış bir test sürücüsü oluşturabilir; bu da birim test vakalarının yazılmasında çok zaman kazandırır. (3) Test verilerinin otomatik üretimi ve yönetimi Test verisi otomatik olarak üretilir; bu veriler, test fonksiyonu tarafından çıkarılan bilgilere karşılık gelir ve veriler belirli bir hiyerarşik mantıksal ilişkiyle bir JSON dosyasında saklanır. Veri ve veri türü ayrıştırma ve genişletmeden sonra birbirine karşılık gelir. Kullanıcılar, bu verileri iş gereksinimlerine göre rastgele olarak marjinalize edebilir ve JSON dosyalarını yapılandırılmış ve hiyerarşik bir şekilde göstermek için kullanabilirler; bu çok açıktır. Test verisi, küresel değişkenlerin değerlerini ve test edilen fonksiyon çağrıldığında alınan parametre değerlerini içerir. Wings, sürücü fonksiyonlarını otomatik olarak oluşturmak için bir birim test yöntemi sunar ve bu yöntem esas olarak aşağıdaki adımları içerir: Şekil 1: Birim testi odaklı yapı akışı 1 Test edilen programın bilgilerinin çıkarılmasıTest edilen programın yapı bilgisi esas olarak programdaki küresel değişkenleri ve fonksiyon bilgilerini içerir; fonksiyon bilgisi ise esas olarak fonksiyonun parametreler sayısı, parametre türleri ve dönüş değer türlerini içerir. En önemli şey, bazı karmaşık tipler için sembol ve tip bilgilerini çıkarıp bunları katman katman temel veri tiplerine analiz ederek küresel değişkenler ve fonksiyon parametrelerinin oluşturulmasını tamamlamaktır. Değişken türleri genellikle temel tipler, yapı türleri, işaretçi tipleri ve null tipler olarak ayrılır. Wings, farklı değişken türlerini farklı şekillerde yönetmek için temel derleme teknolojisini kullanır. (1) Temel türler, örneğin imzasız int u_int=20, Wings değişkenin adını u_int ve veri tipini unsigned int olarak ayrıştırır. (2) İnşa türleri, yapı tipleri kabaca diziler, yapılar, ortak yapılar ve sayım türlerine ayrılır. ● Dizi türü, örneğin intarray[2][3], dizi adı dizi, tip int ve 2D dizinin uzunluğu, davranış 2, sütun 3. ●Yapı türü, yapılar dizi, yapı bağlantılı listeler vb. olarak farklı işaretçiler bölünür. (3) İşaretçi tipi, örneğin int **ptr = 0; , işaretçiyi zeka tipinde seviye 2 işaretçi olarak ayrıştırır. (4) Null tipi, NULL olarak çözülür. (5) Dosya, size_t gibi sistem türleri sistem tipleri olarak işaretlenir ve şablona eklenerek kullanıcı tarafından atanır. (6) Fonksiyon işaretçi tipi, dönüş değer türü, parametre tipi ve fonksiyonun parametre sayısını analiz edin Test edilen kaynak programın her derleme birimi için, ayrıştırılmış fonksiyon bilgisi ilgili PSD yapısında saklanır ve aşağıdaki kaynak kod örnekleri açıklanır:
Yukarıdaki programda, void StructTypeTest3(myy_struct mm_struct[2])Kaydedilen PSD yapısı aşağıdaki gibidir:
PSD dosyasındaki her düğümün anlamları şunlardır: ●StructTypeTest3 fonksiyon adını, parmType0 parametre tını, parmNum ise parametre sayısını temsil eder ●mm_struct fonksiyon parametresinin sembolünü temsil eder, baseType1 türlerin sınıflandırılmasını (temel veri türü, yapı türü, işaretçi tipi, null tip) temsil eder, type int, char, short, long, double, float, bool ve bu tür işaretsiz tipler ile diğer temel tipleri temsil eder; ayrıca bazı özel tipler vardır: ZOA_FUN tip fonksiyon tipini temsil eder, StructureOrClassType yapı tipini vb. temsil eder ve isim yapı, birlik ve enum tipinin adını temsil eder ●i_int en küçük atama birimi olan temel tipi temsil eder ●array_one dizi tipini, RowSize dizinin uzunluğunu temsil eder ve dizi tek boyutlu diziler, iki boyutlu diziler vb. olarak bölünebilir ●Nokta işaretçi tipini temsil eder, işaretçi birinci seviye işaretçi, ikinci seviye işaretçi vb. olarak ikiye ayrılır ve genel işaretçi bir dizi olarak fonksiyon parametresi olarak kullanılır; bu nedenle temel tipte işaretçi için değerleri ataymak için dinamik ayırım dizisi yöntemi kullanılır ve kullanıcı ihtiyaçlara göre ilgili değer dosyasını değiştirebilir. ● w bit alanının türünü temsil ederken, bitfileld rakam sayısını temsil eder ●functionPtr, fonksiyon işaretçi tipini temsil eder; bu tip, parametre türü, parametre sayısı ve dönüş değeri bilgisini sırasıyla analiz eder ●Dem, konsorsiyum tipi anlamına gelir ● dy enum tipini, value ise enum tipinin değerini temsil eder ●file yapı türünü temsil eder, SystemVar ise bu değişkenin sistem başlığı dosyasındaki değişkene ait olduğunu temsil eder; bu tür değişken için Wings şablon değişkenlerini şablon kütüphanesine ekler, kullanıcılar özel ihtiyaçlara göre özel değerler atalayabilir. Örneğin, Dosya tipi şu şekilde ele alınır:
Kullanıcılar ayrıca kendi atama yöntemlerini ekleyebilir. Sistem tipleri için Wings, sıradan kullanıcı tanımlı türlerden ayırt edilebilir ve sistemin yerleşik tipine ayrıştırıldığında, aşağıya doğru özyinelemeli analizi durdurabilir. ●g_int küresel değişkenleri, globalType ise küresel değişkenleri temsil eder ●next, bağlı liste yapısını temsil eder ve NodeType bu yapıyı bağlı bir liste olarak temsil eder ●returnType, fonksiyonun dönüş değeri tipini temsil eder. 2 Sürücülerin otomatik üretimiYukarıdaki makalede, küresel değişkenlerin ve fonksiyonların yapısal bilgileri analiz edilip çıkarılır ve aşağıdaki bilgiler PSD'de kaydetmek için kullanılır; böylece test edilen kaynak programın sürücü çerçevesinin genel üretimi tamamlanır. Nesil esas olarak aşağıdaki alanlara ayrılır: Ø Küresel değişkenlerin beyanı Ø Fonksiyon parametrelerinin atama işlemi, fonksiyon parametrelerinin sayısına göre sırayla değerler atanır Ø Küresel değişkenlerin ataması, analizde kullanılan küresel değişken sayısına göre sıralı olarak gerçekleştirilir Ø Orijinal fonksiyonun çağrısı Dikkate alınması gereken bazı noktalar şunlardır: ●Sürücü oluşturma sürecinde, ana fonksiyonlar, statik fonksiyonlar gibi bazı özel fonksiyonlar dış dünya tarafından erişilemediği için geçici olarak işlemez. ● Test edilen her kaynak dosya için, karşılık gelen bir sürücü dosyası oluşturulur. ● Sürücü kontrolü, makrolar aracılığıyla fonksiyonun test sayısını otomatik olarak yapılandırmak için Driver_main.cpp dahil edilmiştir Yukarıdaki kaynak program tarafından oluşturulan sürücü fonksiyonu şöyledir: ● Tüm değişkenler orijinal değişkenin adından önce adlandırılır, eklenir _ ●Karşılık gelen test verileri alındığında, değişkenler sırayla atanan ●Sistemin yerleşik parametreleri ve kullanıcının özel parametreleri için, atama yöntemi şablon yöntemiyle eşit şekilde yapılandırılır. ●Test edilen fonksiyona parametreleri atayın ve çağırın. 3 Test verileri otomatik olarak üretilirAşağıda, Şekil 3'te PSD formatında oluşturulan bir veri seti yer almaktadır; her veri seti JSON formatında kaydedilmiş, bu da verilerin hiyerarşik ilişkisini görmeyi kolaylaştırır.
Her derleme birimi için, tüm fonksiyonlara karşılık gelen bir test veri dosyası seti varsayılan olarak oluşturulur ve değer üretimi, yapılandırma sayısına göre değiştirilebilir. 4 MysqlProgram test sonuçları gösterilirSürücü çerçevesinin üretimi nasıl tamamlanır, aşağıda açık kaynak programı MySQL'in tam üretim sürecinin ayrıntılı açıklaması yer almaktadır. Aşağıda, Wings'in Mysql testinin ana arayüz diyagramı yer almaktadır: Test edilen kaynak programın proje dizinini ayarlamak için Dosya butonuna tıklayın. Ayarlar tamamlandıktan sonra, özellikle parametre ayrıştırma, sürücü oluşturma, değer dosyası oluşturma ve şablon eklemeyi içeren fonksiyon işlemine tıklayın. Analiz için aşağıdaki klasörler oluşturulur: Bunlar arasında, parametre ayrıştırma modülü, her çıkarılmış derleme biriminin fonksiyon bilgisini ve küresel değişken bilgisini sırasıyla saklayan FunXml ve GlobalXml oluşturur. Sürücü oluşturma modülü, her derleme birimi için sürücü dosyalarını saklayan ilgili Wings_Projects klasör oluşturulur Değer oluşturma modülü, her derleme birimi için oluşturulan test verilerini saklar. Aşağıdaki şekil, Mysql tarafından yüklenen sürücü dosyası yapısı bilgisini gösterir ve soldaki navigasyon ağacı, her derleme biriminin fonksiyonlarını, fonksiyonların parametrelerini ve küresel değişkenlerini içeren oluşturulan sürücü dosyasıdır. Uygun sürücü dosyasını ve ilgili değer dosyasını yüklemek için derleme birimlerinden birine tıklayın. Yukarıdaki, Mysql'in genel üretimine karşılık gelen sürücü dosyası ve değer dosyasıdır ve sürücü dosyası aşağıdaki kodda ayrıntılı olarak açıklanmıştır. ● Her derleme birimi için, küresel değişkenin referansı dışa yönelttir. ●Sürücü fonksiyonu Driver_XXX yöntemi olarak tekiz şekilde adlandırılır, test verisini elde etmek için JSON kullanılır ve zamanlar tek bir fonksiyonun test sayısını temsil eder. ●Her parametre atama işlemi için, ayrıştırılmış PSD depolama formatı her katman yapısına sırayla değerler ataymak için kullanılır. Wings'in uygulaması çok basittir, aşağıda Visual Studio 2015'te normal derlenebilen Mysql kodu kullanılarak üretilen test verilerinin istatistiksel indeksi yer alır; örnek olarak, tüm üretim süreci manuel müdahale gerektirmez, sadece oluşturulması ve sürülmesi gereken kaynak kodunun yolunu formüle etmelidir. mysqlTest verileri | MysqlSürüm | | CDil kodu dosyalarının sayısı | | Analiz için harcanan zaman (PSDÜretim süresi) | | Üretimi sürmek için harcanan zaman | | Değer, üretilmesi için alınan süreyle üretilir | |
Bilgisayar yapılandırma talimatları: | İşletim Sistemi | | | Inter(R) Core(TM) i7-7700cpu 3.60GHz | | | | |
Aşağıda, Wings tarafından tamamen otomatik olarak oluşturulan 4 milyondan fazla geçerli birim test kodu ile kaynak kod istatistiği aracı kullanılarak elde edilen sonuçlar yer almaktadır. Daha da ilginç olan, bu kodların manuel geliştirme maliyetinin 1.079 adam-ayına kadar çıktığı ve maliyetin 10,79 milyona kadar çıktığı görülebilmesidir.
Wings, programın keşfinin ilk adımını gerçekleştirdi; programı otomatik olarak oluşturdu, ilk sürüm şu anda yayınlandı, ilgilenen geliştiriciler doğrudan Code Cloud platformundan (https://gitee.com/teststars/wings_release) indirebilir, ticari lisanslama bir aylık sınırsız işlev deneyimi sunar, Wings'in büyülü gücünü hızlıca deneyimleyebilirsiniz, Wings c dil versiyonu Visual Studio gibi birden fazla platformu destekliyor, VXWORKS, GCC, QT vb. Wings, Nebulas test (www.teststar.cc) ekibi tarafından tasarlanıp geliştirilmekte ve ilgilenen geliştiriciler, Codecloud'un etkileşimli platformu aracılığıyla Nebulas test ekibiyle iletişime geçip tasarım fikirlerini ve ürün kullanım geri bildirimlerini paylaşabiliyor (kabul edilen mükemmel öneriler için Nebulas ücretsiz kullanım süresini en az üç ay uzatabilir). Wings, yazılım kalitesini büyük ölçüde artırmak için güçlü ve temel bir gene sahiptir ve gelecekte otomatik yazılmış programların okunabilirliğini (iyi programcıların yazım seviyesine daha yakın) ve C++ dilini desteklemeyi derinlemesine optimize edecektir.
|