writing unit tests with spock framework
çevik ve şelale testi arasındaki fark
Spock Framework ile Birim Testleri Yazma: Test Fikstürleri, Onaylar ve Raporlama
Bunda Spock'ta Yeni Başlayanlar Kılavuzunu Tamamlayın , kısa bir Spock Framework ve Groovy programlamaya giriş önceki eğitimimizde verildi.
Bu eğiticide, başlamak için gereken tüm ayrıntıları / adımları inceleyeceğiz. Birim testi Spock'ta.
Basitlik adına, toplama, çıkarma, çarpma, bölme gibi farklı yöntemlere sahip basit bir Hesap Makinesi Uygulamasını test edeceğiz, bunların tümü tamsayı parametrelerini kabul eder ve bir tamsayı çıktı döndürür.
Ne öğreneceksin:
- Spock Video Eğitimi ile Birim Testi
- Başlarken
- 'Def' Anahtar Kelime
- Spock Spesifikasyonunun Yaşam Döngüsü
- Spock İddiaları
- Raporlama
- Sonuç
- Önerilen Kaynaklar
Spock Video Eğitimi ile Birim Testi
Başlarken
Diğer Birim test çerçevelerine benzer şekilde, Spock da test edilen bir uygulama için senaryolar / test senaryoları yazmak için kullanılabilir. Spock çerçevesinin farklı özelliklerini aşağıdaki gibi mevcut / bilinen çerçevelerle karşılaştırmaya ve karşılaştırmaya çalışacağız. JUnit .
'Def' Anahtar Kelime
Öncelikle Groovy’nin 'def' anahtar kelimesini kısaca anlamaya çalışalım. Def anahtar sözcüğü type-def'i tanımlamak için kullanılır ve bir işlevin yanı sıra bir alan / değişken bildirmek için kullanılabilir.
'Def' genellikle bir alanın türünü veya bir yöntemin dönüş türünü kısıtlamak istemediğimizde kullanılır. Harika bir sınıfta bazı def anahtar kelime örneklerini ve tüm geçerli kullanımlarını görelim.
// def as variable types def inputNum = 100 def inputStr = 'hello world!!' def app = new CalculatorApp() // def as return type of function def 'test function'() { // function body here }
Spock Spesifikasyonunun Yaşam Döngüsü
Spock spec, çalıştırıldığında tanımlanan tüm testleri arar ve bunları tek tek yürütür. Bununla birlikte, testleri daha az gereksiz ve daha okunaklı hale getirmek için Spock tarafından sağlanan birkaç başka işlev / özellik vardır.
Aşağıda bazı özellikleri tartışalım:
Girdileri / Değişkenleri Spec'in bir parçası olarak tanımlama
Hepsi aynı giriş değerlerini kullanan birden fazla test yapmayı düşünün. Bunun bir yolu, her bir testteki girdi değerlerini ayrı ayrı başlatmak olabilir, aksi takdirde alanları doğrudan özellik düzeyinde tanımlayabilir ve her testten önce alanların başlatılacağını ve yürütülen test için kullanılabilir olmasını sağlayabiliriz.
Hesap makinesi uygulama sınıfımız için bir Örnek görelim .
Girdi verilerini spesifikasyon seviyesinde tanımlayacağız, böylece spesifikasyonda bulunan tüm testler için başlangıç değerleriyle kullanılabilir olacaktır.
class CalculatorAppSpec extends Specification { def input1 = 50 def input2 = 10 def result = 0 def app = new CalculatorApp() def 'addition with valid inputs return expected result'() { when: result = app.add(input1, input2) then: result == 60 } def 'multiplication with valid inputs return expected result'() { when: result = app.multiply(input1, input2) then: result == 500 } def 'division with valid inputs return expected result'() { when: result = app.divide(input1, input2) then: result == 5 } def 'subsctraction with valid inputs return expected result'() { when: result = app.substract(input1, input2) then: result == 40 } }
Bu kod örneğinde, input1, input2, test edilen uygulamayı tanımladığımızı ve spec düzeyinde sonuç verdiğimizi görebilirsiniz. Bunun sağladığı şey, özellik dosyalarından her test çalıştırıldığında ve başlatılan alanların bu teste geçirilmesidir. Bu gerçekten de her seferinde giriş değerleriyle testler kurma ihtiyacını ortadan kaldırır.
Test Fikstürleri
Birim test çerçevelerinin çoğuna benzer şekilde, Spock ayrıca test yürütmenin belirli yaşam döngüsü olaylarında özel mantık / görevleri yürütmek için kurulum ve temizleme yöntemleri sağlar.
setupSpec & cleanupSpec
Bu yöntemler, her Spec yürütmesi için bir kez çağrılır ve sırasıyla test yürütmeden önce ve sonra çağrılır. Bunlar @ ile karşılaştırılabilir Dersten önce ve @ Dersten sonra JUnit ek açıklamaları.
kurulum ve temizleme
Bu yöntemler, spesifikasyondaki her testin yürütülmesinden önce ve sonra çağrılır.
Bu kancalar, test yürütmeden önce ve sonra yürütmek istediğiniz herhangi bir mantık / kod parçası için doğru yerdir. Örneğin Temizlemede, test sırasında kullanılan veritabanı bağlantısını (varsa) kapatmak için bir kod yazabilirsiniz.
Bunlar @ ile karşılaştırılabilir Test Öncesi ve @ Test Sonrası JUnit'teki ek açıklamalar.
Hesap makinesi uygulama testimizde bu fikstürlerin bir örneğini görelim.
def setupSpec() { println('###in setup spec!') } def cleanupSpec() { println('###in cleanup spec!') } def setup() { println('>>>in test setup!') } def cleanup() { println('>>>in test cleanup!') }
Yukarıdaki test fikstürü kodu 4 test içeren bir spesifikasyona eklenirse, çıktı aşağıdaki gibi olacaktır:
yazılım testinde qa ve qc nedir
###in setup spec! >>>in test setup! >>>in test cleanup! >>>in test setup! >>>in test cleanup! >>>in test setup! >>>in test cleanup! >>>in test setup! >>>in test cleanup! ###in cleanup spec!
Spock İddiaları
Spock'taki iddialara güç iddia denir (ve daha sonra Spock tarafından tanıtıldıktan sonra groovy tarafından benimsenmiştir). Spock iddiaları, herhangi bir iddia hatası durumunda birçok teşhis istisnası sağlar.
Ayrıntılı bilgi yerine arıza teşhisine bakarak neyin yanlış gittiğini kolayca öğrenebilirsiniz. Onaylama Hataları JUnit ve diğer çerçevelerde.
Bunu bir Örnekle anlamaya çalışalım ve JUnit ile karşılaştıralım
Dizge eşitliğini kontrol eden basit bir testle çalışacağız ve bir onaylama hatası durumunda hangi teşhislerin oluşturulduğunu göreceğiz.
Spock Testi
def 'check case-insensitive equality of 2 strings'() { given: 'two input strings' String str1 = 'hello' String str2 = 'HELLO world' when: 'strings are lowercased' str1 = str1.toLowerCase() str2 = str2.toLowerCase() then: 'equal strings should return success' str1 == str2 }
JUnit Testi
@Test public void compareStrings_withValidInput_shouldReturnSuccess() { // Arrange String str1 = 'hello'; String str2 = 'HELLO world'; // Act str1 = str1.toLowerCase(); str2 = str2.toLowerCase(); // Assert Assert.assertEquals(str1,str2); }
Spock Çıkışı
Condition not satisfied: str1 == str2 | | | hello| hello world false 6 differences (45% similarity) hello(------) hello( world) Expected :hello world Actual :hello
JUnit Çıkışı
org.junit.ComparisonFailure: Expected :hello Actual :hello world
Yukarıdan anlaşılacağı gibi, Spock tarafından sağlanan teşhis bilgileri daha iyi ayrıntıya sahiptir ve JUnit gibi diğer çerçevelere kıyasla daha kullanıcı dostudur.
Onaylama İpuçları ve Püf Noktaları
Birden çok öğeyi aynı anda öne sürmek - Spock, iddialar için çeşitli kısaltmalar sağlar ve bunlardan biri, listedeki öğelerin onaylanmasına olanak tanıyan '*' notasyonudur.
Bunu bir Örnek ile anlayalım:
Alanlar olarak cityName ve popülasyona sahip bir CityInfo sınıfını düşünün. Verilen listede bulunan şehirlerin adlarını doğrulamak için bir Spock testi yazacağız.
public class CityInfo { public CityInfo(String cityName, int population) { this.cityName = cityName; this.population = population; } public String cityName; public int population; }
Şimdi testi görelim:
def 'Assert multiple elements of list' () { given: def cityList = new LinkedList() cityList.add(new CityInfo('Mumbai', 120)) cityList.add(new CityInfo('Delhi', 80)) cityList.add(new CityInfo('Chennai', 100)) expect: cityList*.cityName == ('Mumbai', 'Delhi', 'Chennai') }
Yukarıdaki iddia kısaltmasında gösterildiği gibi, “*” anahtar kelimesinin yardımıyla tüm listeyi doğrulayabilirsiniz.
Ayrıca bir başarısızlığın nasıl göründüğüne de bakalım. Yukarıdaki iddiadan herhangi bir şehrin adını kaldıracağım.
Condition not satisfied: cityList*.cityName == ('Delhi', 'Chennai') | | | | | false | (Mumbai, Delhi, Chennai) (app.CityInfo@31368b99, app.CityInfo@1725dc0f, app.CityInfo@3911c2a7)
Onaylama başarısızlığının tanı bilgilerinin zengin ve anlaşılması kolay olduğunu görebilirsiniz.
Kapatma parametresinden yararlanma - every ().
Bir listenin veya koleksiyonun her öğesi için bir iddia eklemek için every () adlı kapanış parametresinden nasıl yararlanabileceğimizi görelim. Aynı örnekte, verilen giriş> 50 ise her şehrin nüfusunu doğrulayan bir iddia eklemeyi deneyelim.
def 'Assert multiple elements of list' () { given: def cityList = new LinkedList() cityList.add(new CityInfo('Mumbai', 120)) cityList.add(new CityInfo('Delhi', 80)) cityList.add(new CityInfo('Chennai', 100)) expect: cityList*.cityName == ('Mumbai', 'Delhi', 'Chennai') and: cityList.population.every() { it > 50 } }
Atılan İstisnaları İddia Etme
İstisnaların 'then' bloğuna atılacağı iddia edilebilir (bu, bloğun da gerekli olduğu anlamına gelir). İstisna ayrıntısı, fırlatılan istisnayı bir alana atayarak ve atılan istisnanın gerekli özelliklerini iddia ederek teşhis edilebilir.
Şimdi aynı CityInfo sınıfını kullanalım ve istisna oluşturan bir yöntem tanımlayalım ve bunun için bir test yazalım.
public class CityInfo { public CityInfo(String cityName, int population) { this.cityName = cityName; this.population = population; } public String cityName; public int population; public CityInfo() { } public int getCleanlinessScore() { throw new RuntimeException('method not implemented'); } }
Şimdi teste bakalım:
def 'cleanliness score throws runtime exception with message - method not implemented'() { given: CityInfo app = new CityInfo(); when: app.cleanlinessScore() then: def e = thrown(RuntimeException) e.message == 'method not implemented' }
Raporlama
Güzel ve ayrıntılı HTML tabanlı raporlar oluşturmak için, derleme dosyasına eklenebilecek kitaplıklar vardır ve şimdi derleme sırasında (veya doğrudan yürütme yoluyla) testler yürütüldüğünde, içinde ayrıntılı bir html tabanlı rapor oluşturulacaktır. çıktı dosyası.
Oluşturulan test raporlarını almak için, build.gradle dosyasına aşağıdaki kitaplıkları ekleyin (ve benzer şekilde Maven pom.xml dosyası için de).
testCompile 'com.athaydes:spock-reports:1.6.1' testCompile 'org.slf4j:slf4j-api:1.7.13' testCompile 'org.slf4j:slf4j-simple:1.7.13'
Şimdi projeyi oluşturun ve 'test' klasöründeki tüm testleri çalıştırarak veya ' gradle temizleme testi ”.
Açabilirsiniz index.html yürütülebilecek tüm Spock spesifikasyonları için özet bir rapor almak için.
java kodu mülakat soruları ve cevapları
Belirli bir Spesifikasyon için ayrıntılı raporu görmek istiyorsanız, yukarıdaki listeden spesifikasyona tıklayın ve başarıların yanı sıra başarısızlıkların da ayrıntılı bir raporunu görebilirsiniz.
Sonuç
Bu eğiticide, Spock Framework ile Birim testinin temellerini ele aldık. İddiaları yazmanın farklı yollarını ve kısayollarını ve iddia hataları için Spock çerçevesi tarafından üretilen zengin tanılama bilgisini gördük.
Ayrıca, Spock testleri için, yürütülen testler için aynı ayrıntılı teşhisi içeren sessiz, hoş HTML tabanlı raporları nasıl oluşturabileceğimize de baktık.
Yaklaşan eğitimimiz, Spock ile parametreleştirilmiş testleri ayrıntılı olarak yazma konusunda size bilgi verecek !!
PREV Eğitimi | SONRAKİ Eğitici
Önerilen Kaynaklar
- Spock Framework ile Veriye Dayalı veya Parametreli Test
- Spock Mülakat Soruları ve Cevapları (En Popüler)
- Selenyum ile Entegrasyon ve Fonksiyonel Test İçin Spock
- Spock Alay ve Stubbing (Video Eğitimleri ile Örnekler)
- Spock Eğitimi: Spock ve Groovy ile Test Etme
- Mockito Eğitimi: Birim Testinde Alay için Mockito Çerçevesi
- Birim Testi, Entegrasyon Testi ve İşlevsel Test Arasındaki Farklar
- Başarılı Birim Testinin Anahtarı - Geliştiriciler Kendi Kodlarını Nasıl Test Ediyor?