Guava ünite testleri otomatik olarak nasıl üretildi?


31

Guava otomatik olarak oluşturulan birim test durumlarına sahiptir :

Guava şaşırtıcı sayıda birim testine sahiptir: Temmuz 2012 itibariyle, guava-test paketi 286.000'den fazla bireysel test vakası içermektedir. Bunların çoğu otomatik olarak üretilir, elle yazılmaz, ancak Guava'nın test kapsamı özellikle com.google.common.collect için son derece ayrıntılıdır.

Nasıl üretildiler? Onları tasarlamak ve üretmek için hangi teknikler ve teknolojiler kullanıldı?


Bu konuya dokunan bir google ahbap tarafından yapılan bir konuşma gördüğümü hatırlıyorum. Adı hakkında hiçbir ipucu yok, konuşma bence bazı java kongresindeydi
Zavior

3
com.google.common.collect.testing paketi , adlarında "Jeneratör" ile bir çok sınıfa sahiptir - bu da test oluşturma için bir çerçeve gibi görünmesini sağlar. Ayrıca testler için "iskeletler" veya "temel sınıflar" olarak belgelenen sınıflara sahip alt paketler de vardır ...
gnat

1
@gnat Evet, bir yerde gördüğümden emindim. com.google.common.collect.testing.features , örneğin bir koleksiyon sınıfının yerine getirmesi gereken nitelikleri / kısıtlamaları gösterir ve bir test durumu bunların bir birleşimidir. Bu şekilde testlerini parametreleştirebilirler
dzieciou


Soru topluluğun dikkatini çekti ancak şu ana kadar makul bir cevap yoktu, bu yüzden Martin'in önerisini takip ettim ve buraya koydum: sqa.stackexchange.com/questions/5214/… .
dzieciou

Yanıtlar:


8

Bu test kütlesinin büyük bir kısmı Guava toplama uygulamaları içindir. Koleksiyon arayüzlerini ayrıntılı bir şekilde test eden genel testler yazdılar ve bu uygulama başına bir paket oluşturuyor. Örneğin, denilen sınıflar için, bakınız CollectionAddAllTester, ListIndexOfTester.

Bunların hepsi Guava'nın bir parçası olan testlib adlı bir kütüphane tarafından desteklenmektedir. Bu oldukça genel. Herhangi bir arayüz için genel testler yazmayı destekler (sadece koleksiyonlar için değil). Belirtebilirsiniz Featureolası uygulamalarının s ve bunları test (örneğin sizin seti farklı bir sonuç beklemek unmodifiable ise set.add()), ve size uygulama özellikleri desteklediğini belirttiğiniz testleri çalıştırdığınızda.

4 ünite JUnit 3'e dayanmaktadır. Normalde, TestCaseadlandırılmış yöntemlerle dolu bir sınıfa sahipsiniz testSomething()ve JUnit bunları yansıtıcı olarak çalıştırır. Testlib kütüphanesi, bu testlerin uygulanmasına kancalar, böylece yaşam döngüsü şöyle görünür:

  • Test etmek istediğiniz her uygulama için
  • Her (uygulanabilir) test yöntemi için
  • oluştur TestCaseörneği
  • Sıfırla TestSubjectGenerator- Bu, gerçekten test konusunu oluşturduğunuz yerde genişlettiğiniz testlib arabirimidir.
  • Test yöntemini yansıtıcı olarak çalıştırın. Bu yöntem sırasında getSubjectGenerator()test konusuna erişim sağlar

Anahtar biti, genel test senaryosuna belirli bir test konusunu enjekte etmelerini sağlayan ekstra başlatma aşamasıdır.

Ben bir yazı yazdım kendi arayüzleri için testlib üreten suit yazma konusunda.

(Aynı zamanda sqa sitesinde de aynı soruya gönderildi .)


6

Birim test jeneratörleri var. Örneğin, .NET dünyasında, Microsoft Pex gibi bir şey bunu yapabilirdi.

Örneğin, Microsoft Pex, bir yönteme ilişkin tüm olası değerleri kod analizine dayanarak dener. Bazı argümanların, yöntemin bir istisna atmasına izin vermesi bekleniyor. Bu tür şeyler otomatik olarak oluşturulan testler yapabilir. Belirli durumlarda döndürülen boş bir dize gibi statik değerler de otomatik olarak test edilebilir.


2
Bu, yalnızca negatif yol testi (istisnalar, geçersiz girdi, kilitlenme, zaman aşımı) için yararlı olan rastgele bir testtir. Mutlu yol için de testler yaptıklarına inanıyorum ve bu sadece statik analiz aracı başlatmak için değil, daha fazla tasarım gerektiriyor.
dzieciou

Ve mutlu bir yol için test üretmenin yolları ve araçları olduğunu biliyorum (örneğin, bu cevaba bakınız ), ancak bunun Guava
dzieciou
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.