2011-12-19 9 views
10

JUnit 4.8.2'yi kullanarak bir dizi Selenium testi (aslında WebDriver destekli Selenium) kullanıyorum. Testin bir onaylama işlemini başarısız olduğu anda testlerin otomatik olarak tarayıcının ekran görüntüsünü almasını istiyorum. Tüm testler SeleniumBaseTestCase'dan devralınır ve çoğunluk daha sonra SeleniumBastTestCaseWithCompany'dan (Selenyum yoluyla ortak test verilerini oluşturmak ve temizlemek için @Before ve @After yöntemlerini kullanır) daha fazla devralır.JUnit 4.8 çalıştırma kodunu, başarısız bir sınamadan sonra, ancak @After yöntemlerinden önce nasıl yapabilirim?

Ben ekran görüntüsü almak için TestWatchman 'ın failed yöntemi geçersiz kılmasını, SeleniumBaseTestCase bir @Rule olarak TestWatchman bir alt sınıfını ekleyerek denedim. Sorun şu ki, test verilerini temizleyen @After metodu TestWatchman'un failed yönteminden önce çalıştırıldığından, ekran görüntüleri temizleme işleminin son adımıdır, başarısız olan test değil. İçine biraz Looking

Öyle görülüyor ki, TestWatchman bırakarak @After yöntemlerini çağırır TestWatchman 'ın apply yöntem sadece geçti Statement çağırır' ın yöntemini değerlendirmek (sadece maruz yöntemi), (veya başka Rule) şansı Söyleyebildiğim kadarıyla, testin yürütülmesi ile @After yöntemlerinin arasına herhangi bir kod eklemek.

Ben de özel @AfterFailure ile açıklamalı yöntemleri (böylece ekran görüntüsü böyle bir @AfterFailure yöntemde alınabilir) @After yöntemlerle önce çalıştırılır, böylece yaratılan Statement s değiştirmek için özel bir Runner oluşturmak yaklaşımlar gördük, ama bu ettik BlockJUnit4ClassRunner 'un withAfters yöntemini geçersiz kılmakta, bu yöntem kullanımdan kaldırılmıştır ve özel hale gelmesi nedeniyle documentation uyarınca Kurallar'ın kullanılmasını önerir.

SO hakkında @Rule lifecycle hakkında başka bir cevap buldum, bu da JUnit 4.8'de mümkün olmayabilir, ancak JUnit 4.10'da mümkün olmayabilir. Eğer bu doğruysa o zaman yeterince adil olursa, sadece ondan bir onay isterim.

İstediğim şeyi başarabileceğim zarif ve geleceğe dönük bir yol hakkında herhangi bir düşünce çok takdir edilecektir!

cevap

7

Analizinizde haklısınız, @Befores ve @Afters, herhangi bir Kuraldan önceki İfadeler listesine eklenir. @Before, @Rule'dan sonra çalıştırılır ve @After, @Rule'dan önce çalıştırılır. Bunu nasıl düzelttiğiniz, SeleniumBaseTestCaseWithCompany ile ne kadar esnek olabileceğinize bağlıdır.

En kolay yolu, @Before/@After yöntemlerinizi kaldırmak ve bunları bir ExternalResource ile değiştirmek olacaktır.

externalResource before 
testHere 
externalResource after 

Bu alan temel sınıf içine konabilir, bu yüzden/geçersiz kılınan miras alır: Bu verir

public class BeforeAfterTest { 
    @Rule public TestRule rule = new ExternalResource() { 
     protected void before() throws Throwable { System.out.println("externalResource before"); } 
     protected void after() { System.out.println("externalResource after"); } 
    }; 

    @Test public void testHere() { System.out.println("testHere"); } 
} 

: Bu gibi bir şey olabilir. @After ve kurallarınız arasında sipariş vermenizle ilgili sorununuz ortadan kalkar, çünkü kurallarınızı nasıl sipariş verebilirsiniz, @RuleChain (4.10, 4.8 değil).

SeleniumBaseTestCaseWithCompany'u değiştiremezseniz, BlockJUnit4ClassRunner'u genişletebilirsiniz, ancak After'lerle geçersiz kılmayın, ancak BlockJUnit4ClassRunner#methodBlock()'u geçersiz kılın. Sonra süper arayabilirsin.yöntemBlock ve gerekli şekilde [*] ifadelerini yeniden sıralayın.

[*] Sadece kodu kopyalayabilir ve satırları yeniden sıralayabilirsiniz, ancak withRules özeldir ve bu nedenle bir alt sınıftan kalınabilir değildir.

+0

Evet, JUnit'i yükseltmenin yol olduğunu düşünüyorum - 4.8.2'de özellikle tatmin edici bir çözüm göremiyorum. Ekran görüntüleri almak için 'SeleniumBaseTestCase' üzerinde korumalı bir TestWatcher'ım ve bununla tek kural olarak bir RuleChain var. Daha sonra, “SeleniumBaseTestCaseWithCompany” içinde şirket oluşturmak/silmek için bir ExternalResource var ve süper sınıfın RuleChain'i hem ekran görüntüsünü hem de oluşturma/silme kuralını emrediyorum. Güzel çalışıyor, teşekkürler. – Rowan

+0

Sadece bir not. 4.11'de, bir yöntemde @Rule belirtebilirsiniz, böylece bir alanı gölgelemek yerine bu yöntemi geçersiz kılabilirsiniz. Ama 4.11 henüz serbest bırakılmadı. –

+0

Ah, bilmesi iyi - değişkenleri gölgelemek, benim için huzursuz olduğum tek şeydi ... – Rowan

İlgili konular