2013-12-04 2 views
1

Я использую правило сборщика ошибок в своем приложении (веб-драйвер селена). Я могу исключить исключение и продолжить следующую строку кода с помощью правила сборщика ошибок. Но прямо сейчас я хочу снова запустить неудачный тест (3 раза), чтобы убедиться, что они действительно потерпели неудачу. поэтому я использую правило Retry. Но это правило, когда оно применяется индивидуально, выполняется (правило повтора с командой Assert) `, но при написании с помощью сборщика ошибок не получается выполнить никакую причину .... Пожалуйста, помогите мне с образцом кода.Как использовать правило повтора вместе с правилом Errorcollector в junit

TestBase.java:

public class TestBase { 

    @Rule 
    public ErrorCollector collector = new ErrorCollector(); 

    private boolean fatal; 

    public TestBase() { 
      fatal=true; 
    } 

    public void assertEquals(String msg, Object expected, Object actual) { 
      if(getFatal()) { 
       Assert.assertEquals(msg,expected, actual); 
      } else { 
       collector.checkThat(msg, actual, CoreMatchers.is(expected));    
      } 
    } 


    public void setFatal(boolean fatalFlag) { 
      fatal = fatalFlag; 
    } 

    public boolean getFatal() { 
      return fatal; 
    } 

} 

BFMNew.java

public class BFMNew extends TestBase { 

    @Rule 
    public Retry retry = new Retry(3); 
    @Rule 
    public ErrorCollector errocol = new ErrorCollector(); 

    @Before 
    public void setUp() throws Exception { 
     System.out.println(" in before"); 
    }  

    // ===========Re run fail test custom==== 

    public class Retry implements TestRule { 
     private int retryCount; 

     public Retry(int retryCount) { 
      this.retryCount = retryCount; 
     } 

     public Statement apply(Statement base, Description description) { 
      return statement(base, description); 
     } 

     private Statement statement(final Statement base, 
       final Description description) {    
      return new Statement() { 
       @Override 
       public void evaluate() throws Throwable { 
        Throwable caughtThrowable = null; 

        // implement retry logic here 
        for (int i = 0; i < retryCount; i++) { 
         try {       
          base.evaluate(); 
          return; 
         } catch (Throwable t) { 
          caughtThrowable = t; 
          System.err.println(description.getDisplayName() 
            + ": run " + (i + 1) + " failed"); 
         } 
        }     
        System.err.println(description.getDisplayName() 
          + ": giving up after " + retryCount + " failures"); 
        throw caughtThrowable; 
       } 
      }; 
     } 
    } 

    @Test 
    public void one() { 
     setFatal(false); 
     Boolean IsLogin = true; //Here function will come for login 
     Boolean IsPost = null; 
     Boolean IsStnComment = null; 
     Boolean IsPhotoUpload = false; 

     if(IsLogin) {    
      IsPost = false;   
      assertEquals("Failed to Insert Post", true, IsPost);    
     } 

     System.out.println(" After Post "); 
     assertEquals("Failed to upload photo", true, IsPhotoUpload);  

     if(IsPost) { 
      IsStnComment = false; 
      //assertEquals("Failed to Insert Comment", true, IsStnComment); 
     } 

     System.out.println("After comment"); 

    } 

ответ

0

Проблема с правилами заказа. Вы должны сделать ErrorCollector наружным правилом и Retry внутреннее правило. Начиная с junit 4.10 используйте это

class YourTest { 

    private ErrorCollector collector = new ErrorCollector(); 

    private Retry retry = Retry(3); 
    @Rule 
    public TestRule chain= RuleChain 
         .outerRule(collector) 
         .around(retry); 

    // tests using collector go here 
} 
Смежные вопросы