2013-05-07 16 views

cevap

9

sonra dinleyici sınıfı

class ExampleListener extends AbstractRunListener { 

    def void error(ErrorInfo error) { 
    println "Actual on error logic" 
    } 
} 

oluştur her Spec

class GlobalSpecExtension implements IGlobalExtension { 

    @Override 
    void visitSpec(SpecInfo specInfo) { 
    specInfo.addListener(new ExampleListener()) 
    } 
} 
için yürütülür IGlobalExtension uygulanmasını kullanarak her şartname eklemek

ve son olarak, META-INF/services directory (Maile kullanıyorsanız src/test/resources'un altında olacak şekilde) org.spockframework.runtime.extension.IGlobalExtension adlı dosyayı oluşturun; örneğin, IGlobalExtension uygulamanızın tam adıyla

com.example.tests.GlobalSpecExtension 
+0

Hizmetler dizinindeki paketin adını içeren bir dosya oluşturmanın ardındaki mantık nedir? – eddyrokr

3

Bunu gerçekleştirmenin en iyi yolu, bir AbstractRunListener uygulayan ve kaydeden bir (genel veya ek açıklama tabanlı) Spock uzantısı yazmaktır. Örneğin, bkz. OptimizeRunOrderExtension. Genel uzantının nasıl kaydedileceği hakkında IGlobalExtension tanımlayıcısına bakın.

API'lar hala değişime tabi olduğundan uzantılarla ilgili fazla belge yok. Güvenli oynamak istiyorsanız (ve bazı kısıtlamalarla yaşayabilir), bunun yerine bir JUnit Rule uygulayabilirsiniz.

Her iki durumda da karşılaşabileceğiniz bir sorun, geçerli özellik örneğine erişim sağlamadıklarıdır. Buna ihtiyacınız varsa, her ikisi de aynı uzantı tarafından kaydedilmiş olan AbstractRunListener (arızanın bildirilmesi için) ve bir IMethodInterceptor (özelliğin tutulması için) kullanabilirsiniz. (Bu zor olabilir, ama orada şu anda olan budur gerekmiyor.)

+0

Merhaba Peter! Bozuk bir sürücü örneğini geçersiz kılmak ve belki de yeniden oluşturmak için bu ikisini birleştirmeye nasıl giderim? Bulut testlerinde 'WebDriverException: Session [...] gibi bir şey aldığım takdirde TIMEOUT' nedeniyle sonlandırıldı, dinleyicide hatayı kesip kaydedebilirim, ancak 'sürücüye' veya bir sürücü fabrikasına erişemiyorum. ki bunu geçersiz kılabilirim. Herhangi bir fikir? – kriegaex

3

Ben bu şekilde yapmak başardınız: Her test durumu "başarılı" kurulum() yöntemi ile false olarak ayarlanır

class ExampleTest extends GebSpec{ 

    static boolean success = false 

    def setup(){ 
     success = false 
    } 

    def cleanup(){ 
     assert success == true, someAction() 
    } 

    def someAction(){ 
    } 

    def "TestCase"(){ 
     expect: 
     /*What you expect here*/ 

     (success = true) != null 
    } 
} 

önce. Her test vakasının sonunda "(success = true)! = Null" ifadesini eklersiniz. Bu nedenle, "başarı" sadece test durumu geçtiyse doğru olacaktır. Her test vakasından sonra, cleanup() yöntemi "başarı" nın doğru olup olmadığını doğrular. Eğer bu yöntem bir yöntem değilse, bazı çağrılar() çağrılır.

0

Ben upvote veya user3074543 cevabı üzerine yorum, ancak bir uzantıyı oluşturmak daha basittir olamaz. Ben kolay istiyorum. Bu yüzden kısaltıldım kullanıcı * biraz (Ben 1-satır yöntemleri demek istemiyorum). Başarı yerine başarısızlık kaydederek mantığı basitleştirebilir ve bir done() yardımcı ile yazmayı azaltabilirsiniz.

class Test extends spock.lang.Specification { 
    def fail 
    def setup(){ fail = true } 
    def done(){ !(fail = false) } 
    def cleanup(){ fail && doStuffWhenFail() } 
    def 'test things'(){ 
     expect: 
     stuff 
     done() 
    } 
}