2013-12-09 95 views
7

我想重新使用一些集成測試來進行負載測試。我實現它通過註解參數化的規則:在@Rule中並行執行測試

@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Parallel { 

    int invocations() default 1; 

    int rampUpTime() default 0; 
} 

在我的規則實現註釋進行評估和語句成立,其中有一個評價方法類似:

@Override 
public void evaluate() throws Throwable { 
    ScheduledExecutorService exe = Executors.newScheduledThreadPool(invocations); 

    for (int i = 0; i < invocations; i++) { 
     ScheduledFuture<?> scheduledFuture = exe.schedule(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        invocated++; 

        // Request test = Request.method(description.getTestClass(), description.getMethodName()); 
        // new JUnitCore().run(test); 

        statement.evaluate(); 
       } catch (Throwable e) { 
        e.printStackTrace(); 
       } 
      } 
     }, i * rampUpTime, this.timeUnit); 
     futures.add(scheduledFuture); 
    } 
} 

所以,呼叫evaluate被包裝在Runnable()中,並如註釋中所述進行調度。問題是:在我的規則中,只有調度發生,跑步者不知道(或關心)所有隻需要設置整個測試套件即可運行的runables。所以我正嘗試將evalute()的調用添加到測試運行器。首先嚐試使用JUnitCore.run(...),這當然以遞歸結束。

接下來的嘗試是收集所有的期貨並等待它們完成。這在每個測試的基礎上都可以正常工作,但我想要並行執行一個完整的測試套件。而且,在我的測試報告中,我只看到測試正在執行一次。

所以我想我使用帶上下文(一個收集所有測試中所有未來的對象)的參數化套件作爲參數,但是我沒有找到一種方法將這個上下文對象提升到測試,每個測試必須有自己的參數。

我現在要求一種方法來將我的規則中的多個執行添加到執行它的測試運行器中。

+0

http://www.clarkware.com/software/JUnitPerf.html中的'LoadTest'可能有幫助 – 2013-12-09 14:53:25

+1

爲什麼不使用專用壓力工具?像jMeter或加特林? – Chiron

+0

爲什麼不簡單地重複使用現有的集成測試?我知道可以在JMeter中運行JUnit測試,但這很痛苦。集成測試是Eclipse Plugin單元測試,可以在包含eclipse測試框架的情況下構建應用程序,並在JMeter中使用它。 – CodeSeavers

回答

2

如果我正確理解你,你試圖控制測試跑步者的執行行爲。 A TestRule可能會被限制以實現該目標。但是如何編寫自己的控制單元測試執行流程的Runner?只需看看 ParentRunner of JUnit。從那裏,你應該明白基本調度的工作原理,也許你可以實現你自己的版本org.junit.experimental.ParallelComputer

+0

我會這樣做的。 – CodeSeavers