2016-08-17 52 views
7
paralel

testleri yürütülürken sıralı günlükleri alınıyor.Bizim kodu için entegrasyon testleri yürütmek için <code>java</code> ile <code>testng</code> kullanıyoruz

public class TestExecutionListener implements IInvokedMethodListener { 

    @Override 
    public void beforeInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) { 
     System.out.println("Testing : " + iInvokedMethod.getTestMethod().getMethodName()); 
    } 

    @Override 
    public void afterInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) { 
     System.out.println("Successfully Tested : " + iInvokedMethod.getTestMethod().getMethodName()); 
    } 
} 

Bizim testng.xml olarak tanımlanır: - -:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 

<suite name="TestSuite" verbose="1" parallel="classes" thread-count="10"> 
    <listeners> 
     <listener class-name="core.TestExecutionListener"/> 
    </listeners> 

    <test name="IntegrationTests"> 
     <classes> 
      <class name="test.SomeTest1"/> 
      <class name="test.SomeTest2"/> 
      <class name="test.SomeTest3"/> 
      <class name="test.SomeTest4"/> 
      ... There are more than 20 classes 
     </classes> 
    </test> 
</suite> 

biz testleri yürütmek gibi

, şöyle testi yürütülmesi için bir dinleyici uygulayan aşağıdaki gibi olsun çıktısı:

Testing : SomeTest1Method1 
Testing : SomeTest2Method2 
Testing : SomeTest4Method5 
Successfully Tested : SomeTest2Method2 
Successfully Tested : SomeTest4Method5 

ne olmasını çıkışını bekliyor olacak iken: -

Testing : SomeTest1Method1 
Successfully Tested : SomeTest1Method1 
Testing : SomeTest2Method2 
Successfully Tested : SomeTest2Method2 
Testing : SomeTest4Method5 
Successfully Tested : SomeTest4Method5 

false değiştirmeyi beri, çünkü xml parallel="classes" özelliğinin bu Tahmin istenen sağlar çıktı. Ancak, açıkça görüldüğü gibi, değiştirilmiş yürütme, paralel yürütme ile karşılaştırıldığında çok daha fazla zaman harcar.

Bu testleri paralel olarak çalıştırmanın bir yolu var mı, ancak yine de bu çıkışı sırayla alsın mı?

+0

Günlüğü farklı kaydedicilerinin sonra çıktı? –

+0

@PaulHicks - O lütfen ilgili daha fazla ipuçları. Farklı günlük kayıtlarına giriş yapamadım. – nullpointer

+0

log4j gibi bir giriş programı kullanın. Testinize özel bir şey kullanarak bir logger alın (yeterli olacak IInvokedMethod arayüzü var; daha uygun bir şey olabilir).'System.out' yerine, oturum açın. İsteğe bağlı olarak, tüm kaydedicilerden okuyun ve 'System.out' ile birleştirin. –

cevap

3

Paralel açmayı etkinleştirdiğinizde, fark ettiğiniz gibi günlüklerde beforeInvocation ve afterInvocation arasında bir süre olacaktır ve bu fark zaman içinde sınanmış çıktıyı sınamak için sınamadan farklılık gösterir. aşağıdaki gibi basitçe afterInvocation yöntemini kullanarak beforeInvocation mesaj ekleyebilirsiniz temelde zaman faktörünü göz atma ve bu şekilde daha sonra yanyana ne istediğinizi başlangıç ​​ve bitiş mesajları ise

:

public class TestExecutionListener implements IInvokedMethodListener { 

    @Override 
    public void beforeInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) { 
    } 

    @Override 
    public void afterInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) { 
     System.out.println("Testing : " + iInvokedMethod.getTestMethod().getMethodName()); 
     System.out.println("Successfully Tested : " + iInvokedMethod.getTestMethod().getMethodName()); 
    } 
} 

IMO bu sizin spekleriniz uyarınca bunu yapmanın tek yoludur. Ancak testler sırasında toplanan gereken diğer bilgiler daha sonra belki örneğin TestExecutionListener bazı günlükleri tampon olabilir varsa: Bir afterall blokta

public class TestExecutionListener implements IInvokedMethodListener { 
    private Map<Integer, Deque<String>> logsMap = new HashMap<Integer, Deque<String>>(); 

    public void log(IInvokedMethod iInvokedMethod, String log) { 
     if(!logsMap.containsKey(iInvokedMethod.getId())) { 
      logsMap.put(iInvokedMethod.getId(), new ArrayDeque<String>()); 
     } 

     logsMap.get(iInvokedMethod.getId()).add(log); 
    } 

    @Override 
    public void beforeInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) { 
     log(iInvokedMethod, "Testing : " + iInvokedMethod.getTestMethod().getMethodName()); 
    } 

    @Override 
    public void afterInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) { 
     log(iInvokedMethod, "Successfully Tested : " + iInvokedMethod.getTestMethod().getMethodName()); 

     Deque<String> logs = logsMap.get(iInvokedMethod.getId()); 
     while(!logs.isEmpty()) { 
      System.out.println(logs.poll()); 
     } 
    } 
} 
0

Birinci ve ben zarif log4j veya benzeri logger araçları, & esnek seçenekler çok sağlar modüler kullanmanızı öneriyoruz önde gelen şey. Bu aynı zamanda çeşitli şekillerde & sap mekanizması günlüğü tasarlamak yolunu ortaya koymaktadır. ayrı ayrı her bir dişin günlükleri izlemek için sana ihtiyacı bir iş gereksinimi varsa

, farklı dosyalara bu günlüklerin akışı göz önünde bulundurmalıdır. Log4j türdeki araçlar, birden fazla dosyaya yazma gereksinimini destekler. Sadece google arama yapabilirsiniz, çok bilgi alacaksınız.

+0

Sorunun tekrarı - "Sorun bildirimi yeterince açık. Sadece temizlemek için - Daha önce yapılmış olana daha uygun bir çözüm aramak Farklı loggerlarda günlüğe kaydetme ve daha sonra günlükleri birleştirerek yorumlar bölümünde bahsedilen " – nullpointer