Spock testi başarısız olduğunda bazı eylemleri uygulamak istiyorum. Özellikle, bir ekran görüntüsü alın. Mümkün mü? Nasıl yapılır?Spock testi başarısız olduğunda bazı eylemleri gerçekleştirin
cevap
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
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.)
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
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.
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()
}
}
Hizmetler dizinindeki paketin adını içeren bir dosya oluşturmanın ardındaki mantık nedir? – eddyrokr