Birim Testi Oluşturmayı Otomatikleştirme


11

Birim test senaryolarının oluşturulmasını otomatikleştirmek için kullanılabilecek bazı stratejiler nelerdir? En azından iyi bir test senaryosu iskeleti oluşturabilmek için her sınıfta hangi yönlere bakmanız gerekir?

Kapsamlı bir otomatik çözümün pratik olmadığını anlıyorum, ancak en azından bir iskelet oluşturarak test oluşturmayı biraz hızlandırmak istiyorum. Ben kod örnekleri, belki de sadece bazı öneriler nerede başlayacağımı veya böyle bir şey nerede bu yüzden nasıl yaklaştı ve ne mümkün olduğunu görebiliyordu örnekleri için arıyorum.

Özellikle PHP'de birim test iskeletleri oluşturma yöntemleriyle ilgileniyorum, örneğin diğer türlerin sağladığı tüm araçları sağlamaz, örneğin tam tip ipucu gibi.


En son Visual Studio ihtiyaç duyduğunuz her şey ...
İş

Yanıtlar:


5

Stratejiniz ve iskeletiniz, önemsiz bir şekilde, ne tür testler oluşturmak istediğinize, ne tür bir kapsam aradığınıza ve içinde çalıştığınız dile / ortama bağlıdır.

C veya Java gibi diller için sınıf imzalarını okuyan ve otomatik olarak standart köşe vakaları için testler üreten (0, 2 rasgele değer, MAX_INT, MIN_INT) bir tamsayı argümanına, null için boş değer sağlayan bir test oluşturucu yazmak oldukça basittir. , vb...). Daha sonra, oluşturulan testleri çalıştırabilir, her test için sonuçları kaydedebilir ve alakasız olanları kaldırmak için manuel olarak filtreleyebilir, geçen testler için kabul edilebilir sonuçları onaylayabilir (böylece otomatik olarak ondan sonra geçebilirler) ve başarısız olan geçersiz testler olarak işaretleyebilirsiniz .

Bunu, jeneratörünüzün ekstra ipuçları ile yardımcı olması için sınıfların etiketlenmesi / yorumlanması / yeniden düzenlenmesi ile artırabilirsiniz. Bir yöntem çağrısının yükseltilmesine izin verilen tüm olası istisnaları listeleyen veya bir tamsayı bağımsız değişkeni için daha az geçerli tamsayı aralığı veren bir etiketiniz olabilir. Bunlara testleri kendiniz yazmak zorunda olduğunuz için kısa el olarak bakın.

İşte, bakmak isteyeceğiniz bazı bileşenler:

  • Kaynak kodunu / işlev imzalarını / manuel ek açıklamaları otomatik olarak ayrıştıran, standart test senaryoları üreten veya girdinizin tamamlanmasını bekleyen test senaryolarının ana hatlarını / imzalarını içeren bir bileşen.
  • Otomatik test oluşturucunun ipuçlarını temsil eden herhangi bir ayrıntı düzeyine (yöntem / sınıf / imza / while döngüler / vb.) Gidebilecek sürekli büyüyen / değişen etiket / ek açıklama / yorum dili. İdeal olarak, çerçevenizi veya içindeki herhangi bir parçayı yeniden kodlamak zorunda kalmadan bu dil ile oynayabilmeniz gerekir.
  • Her test için "kabul edilebilir" cevaplara karşı yeni / eski testleri belirleme ve kaydetme / test etme özelliği ile otomatik test koşucusu. İdeal olarak, bu koşucu her test için test çalışmalarının, kabul edilen / reddedilen sonuçların ve mevcut kabul edilebilir sonuçların bir veritabanını oluşturacaktır.
  • Bir sınıf adı ve adlar haritası> değerleri verildiğinde, sınıfı taklit eden, işlev çağrıları, erişimciler, genel veri yuvaları vb. İçin özelleştirilebilir veriler döndüren bir nesne oluşturabilen otomatik "nesne faker" ...

Çeşitli diller ve platformlar için zaten bu işlevselliğin parçalarını içeren birçok test çerçevesi var. Bu işi kendiniz yapmaya başlamak ve organik olarak kurum içinde bu tür bir çerçeveyi büyütmek oldukça kolay olsa da, muhtemelen mevcut çalışmaları çoğaltacak sonsuz uzun vadeli bir projedir. İlk önce nelerin mevcut olduğuna bakmak için önemli zaman ayırmanızı ve ardından dalmaya zaman ayırmaya değer olup olmadığına karar vermenizi öneririm.


5

Henüz anlamlı boyutu veya karmaşıklığı bir uygulama üzerinde kullanmak için bir fırsatım olmadı, ancak dahil araçlar vardır Google'ın CodePro analytix , o otomatikleştirmek Java uygulamaları için birim testlerin nesil . Ayrıca , C ++ birim testlerinin oluşturulmasına izin veren ticari bir ürün olan Parasoft'un C ++ Testi'ni buldum

Bu uygulamalar, test senaryoları oluşturmak için sezgisel tarama kullandı. Bir iskelet üretmek için kullanabileceğiniz tek bir çerçeve olduğundan emin değilim, ancak arayabileceğiniz yapılar var. Döngülere, koşullu ifadelere ( ifbloklar, switch/ caseifadeler) ve istisnalara odaklanma eğilimindeyim ve farklı yürütme yollarını gerçekleştirmeye zorlayan test senaryoları oluşturuyorum.

Bir iskelet veya şablon oluşturmaya çalışarak değil, şartname ve / veya uygulama analizini geliştirerek ve yüksek kalite testleri yazarak testlerin yazılmasını hızlandırmaya odaklanmam. Hangi testlerin erken en fazla değeri sağladığını belirleyebilmek, bunları yazmak ve daha sonra delikleri doldurmak üretkenlik ve kalite üzerinde daha büyük bir etkiye sahip olacaktır.


Sadece biraz daha tanıtım yapmak için Falcon , bir projede CodePro'yu denedi ve deneyimleri hakkında biraz bulanık yazdı .


Google'ın CodePro Analytix'i kulağa ilginç geliyor. Ama "Quis velayeti ipsos velayeti?" Testleri kim test ediyor? Bu sadece mevcut bir projeyi birim testleri ile yedeklemek için kullanılabilir ve muhtemelen arızaları tespit etmez, kusurların doğru olduğunu varsayar.
Falcon

@Falcon Herhangi bir araca körü körüne güvenemezsiniz - bunu yapmak daha fazla baş ağrısına neden olur. Pragmatik Programcı'nın ipucunun "zanaatınıza özen göstermesi" nin burada geçerli olduğunu düşünüyorum. CodePro, hangi değerlerin iletildiğini ve beklenen sonucun ne olduğunu görmeyi önemsiz kılmak ve sonra değişiklik yapmak (ve bu değişiklikleri yansıtacak şekilde oluşturulan test kodunu güncellemek) için bir test düzenleyicisi içerir.
Thomas Owens

Bu durumda, insan veya makinede neyin daha güvenilir olduğunu merak ediyorum. Bu üretilen testlerin elle yazılmış testlerden daha fazla baş ağrısına neden olacağını düşünüyorum. İdeal olarak test ilk önce yazılmalıdır. Ama kesinlikle deneyeceğim. Resmi gereksinimlere dayalı testler ve sistemi bir gün arayüzlemek için bazı meta veri tutkalı oluşturabilen bir araç görmek isterim.
Falcon

@Falcon Evet, ideal olarak önce bazı testler yazılmalıdır, ancak bir uygulamanız olana ve beyaz kutu testi yapana kadar, bir uygulamanızın ardından görebileceğiniz tüm farklı uç durumlarını mutlaka görmeniz gerekmez. CodePro'nun test oluşturma özellikleriyle oynama şansınız varsa, düşüncelerinizi bir yere gönderebilir ve bir şekilde bana bir bağlantı alabilir misiniz? Ne kadar iyi çalıştığını ve diğer insanların deneyimini görmek istiyorum.
Thomas Owens

Önümüzdeki hafta, gerçekten zor iş kurallarını içeren orta ölçekli bir J2EE uygulaması (120 klocs) ile test edeceğim ve size buradaki deneyimlerimi anlatacağım.
Falcon

1

Birkaç yıl önce bir .NET projesi için birim testini hızlandırmak için bir jeneratör yazdım. Birim testi olmayan büyük bir kod tabanı vardı ve temel kapsamı hızla artırmayı amaçladı. İşte size yardımcı olabilecek birkaç not:

  • Benim şansım, projenin geliştirildiği çekirdek çerçevenin standart operasyonlar ve sınıf adlandırması sağlamasıydı. Kendinizinkini yazmayı düşünüyorsanız, bunun gibi standart bir yapı çok yardımcı olacaktır.
  • data-driven testingKod tabanınız izin veriyorsa, kullanmak çok yardımcı olur. Test çerçevesi, test verilerini depolamak için her birim testi için bir veritabanı tablosu oluşturdu, böylece bu tablodaki her satır ayrı bir test oldu ve ek kod gerekmedi ( Temsil Kuralı ). Bu noktadan itibaren, gerçek testler otomatik olarak kolayca oluşturulabilir veya manuel olarak girilebilir.
  • Ortaya çıkan birim testleri basitti ancak smoke testen azından s olarak hizmet ettiler . Daha yüksek riskli alanlar için ek manuel testler yazılmıştır.

Özetlemek gerekirse, genel bir çözümün (mümkünse) uygulanamaz olacağını kabul ediyorum. Kod tabanı test üretimi için uygunsa ve test çerçevesi yapısından yararlanabiliyorsa, şansın daha iyi olduğuna inanıyorum.

(Bir yan not olarak Pex var , ancak .NET için)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.