2011-05-23 14 views
30

TestNG'de @Rule gibi bir şey var mı? Ben yaklaşık Özellikle düşünüyorum:TestNG, JUnit4 @Rule gibi bir şeyi destekliyor mu?

@Rule public TemporaryFolder folder = ... 

Hatta

@Rule public MethodRule globalTimeout = new Timeout(20); 

ben elle setUp() ve tearDown() eşdeğerleri kullanarak bunları uygulayabilirsiniz farkındayım, ama bunlar bana olsun kolaylık vermeyin @Rule kullanarak.

+0

Testng-dev google grubuyla ilgili bir tartışma buldum ve birisi bu özelliği uyguladı. Tartışma: https://groups.google.com/forum/#!topic/testng-dev/RounLOTz_UU ve özellikli github repo: https://github.com/wolfs/testng-rules –

cevap

4

Kurallar süper sınıfları ile, örneğin taklit etmek oldukça kolaydır: Eğer Base uzatırsanız, geçici dizin her zaman otomatik olarak

public void Base { 
    @BeforeMethod 
    public void createTempDir() { ... } 

    @AfterMethod 
    public void deleteTempDir() { ... } 
} 

public void MyTest extends Base { 
    @Test 
    ... 
} 

oluşturulan ve daha sonra silinecektir.

Kurallar üzerindeki bu yaklaşımın avantajı, Kuralların her zaman sınıf kapsamıdır, TestNG ile, bunları yöntemleri, testleri, sınıfları, grupları ve hatta süitleri uygulayabilirsiniz. TestNG ait

+14

Cevap için çok teşekkürler. Ama ondan aldığım şey _TestNG'nin eşdeğer bir yapıyı desteklememesi. Her bir metodu açıklayarak, her bir test için bir geçici bir Düzenleyici oluşturmak veya bir zaman aşımı ayarlamak için _setUp() _- like ve _tearDown() _- like yöntemlerini kullanabileceğimi biliyorum, ancak bu, bu sorunların her birini çözmenin kolaylığını kaçırıyor. tek bir parametre beyanı. – Francisco

+10

... alanlara zıt olarak sadece bir süper sınıfınız olabileceğinden bahsetmiyoruz. Kurallar paylaşılabilir ve paylaşılabilir, miras kalmaz. – whiskeysierra

+15

Bu çok saf. TestNG gibi popüler bir test çerçevesi daha fazlasını sunmalıdır! Sorunlarınız çok fazla kaynağa sahip olduğunuzda gelir ve * hepsinin temiz bir şekilde kapatılmasını istersiniz. @Rule ile, bir kaynak kapatılırken atılan istisnalar otomatik olarak yakalanır (JUnit 4.12'de denenir), böylece tüm kaynak kapatıcıları çalıştırılabilir. @AfterMethod ile kendiniz, örneğin bir try/catch zinciri ile yapmanız gerekir. Http://git.io/vUNnM sonucundaki kod örneğine bakın. Sonuç: '@ Rule' ve' AfterMethod' eşdeğer DEĞİLDİR. BTW, JUnit'in TestNG üzerinde tercih edilmesinin neden olduğunu düşünüyorum nedenlerinden biridir. –

0

BeforeClass/AfterClass JUnit rule/ruleClass gibi bir şey taklit, ancak gibi bazı fonksiyonları ve bu sınıflar çoğaltmak olamayacağını etkileri vardır: vb

Ancak, orada tekrar, filtre, TestNG tarafından sağlanan ve bu fonksiyonları simüle etmek için kullanılabilecek bazı arayüzler IAnnotationTransformer, IMethodInterceptor.