2016-02-02 36 views
3

考慮以下黃瓜情形: -異步步驟執行與黃瓜-JVM

Scenario: Test payment 
Given I login to terminal 
When POS token is generated asynchronously 
Then user generates mobile token 
And payment is successful 

的步驟「POS令牌被異步生成」需要異步執行,不應該阻止後它的下游步驟的執行。我可以用Java中的FutureTask完成它。但是如果發生故障,我無法斷言失敗。下面是代碼片段

@When("^POS token is generated asynchronously$") 
public void gs_Consumer() throws Throwable { 

    HashMap<String, Object> m = DataContainer.getDataMap(); 

    ExecutorService executor = Executors.newFixedThreadPool(2); 
    FutureTask<Object> futureTask1 = null; 

    futureTask1 = new FutureTask<Object>(new Callable<Object>() { 

     public Object call() throws Exception { 

      DataContainer.setDataMap(m); 

      try { 
       retrieve_consumer_information(); 
      } catch (Throwable e) { 
       DataContainer.getDataMap().put("exception", e); 
       throw new Exception(e); 
      } 
      return null; 
     } 
    }); 

    executor.execute(futureTask1); 

    DataContainer.getDataMap().put("response", futureTask1); 
    // Shutdown the ExecutorService 
    executor.shutdown(); 
} 

然後我得到的響應的方法,因爲我不能做futureTask1.get()此方法內,因爲它會阻擋來自執行其它下游步驟的執行後。

public void afterAsynchMethod() { 

    try { 
     ((FutureTask<Object>) DataContainer.getDataMap().get("response")).get(); 
    } catch (InterruptedException | ExecutionException e) { 
     // TODO Auto-generated catch block 
     Assert.fail(e.getMessage()); 
    } 

} 

現在,如果在After方法中發生異常,該方案仍不會反映爲失敗方案。在這種情況下我怎麼會失敗呢?

+0

當使用黃瓜創建系統集成測試時,我們有非常相似的用例,因此我們創建了一個小型庫,使得測試中對異步事件的反應更容易:https://github.com/zalando/switchboard –

+0

@JörnHorstmannyour ghthub鏈接現在是404,你可以檢查項目是否已經移到其他地方了嗎? – Eddy

+0

@Eddy最初的開發者仍然在https://github.com/whiskeysierra/switchboard上的github帳戶中有一個分支 - 看起來該項目對於更廣泛的觀衆來說並不那麼有趣,因此被刪除以減少混亂。 –

回答

2

這種情況下有很多細節。我會考慮在堆棧中壓低細節。我可以在步驟將要使用的助手類中隱藏儘可能多的東西。

一個可能性是

Scenario: Thomas pays for a yearly support subscription 
Given Thomas has payed 150 EUR with his credit card 
When the payment is confirmed 
Then he should get a receipt 

這更多地談論預期的行爲,而不是執行。托馬斯並不關心該服務是否是異步的。

但是那麼執行呢?實施應該關心問題的異步性。但不是這種情況。該方案只應描述所需的行爲。

對我來說,這聽起來像你連接到外部服務。這個程序不能控制的服務。可能是網絡電話。

我會創建一個作爲給定調用的實際服務響應的存根。存根將立即作出迴應,並且永遠不會有破損的網絡阻止它。這將消除在這裏處理異步行爲的需要。

然後,我會實現一個集成測試,該測試使用與存根調用相同的參數來調用真實服務。並且期望與外部服務非常相似的原因,因爲存根被硬編碼爲響應。這不會是一個面向業務的測試,因此我不會使用小黃瓜來描述。我可能會使用JUnit或類似的測試框架來實現它。

這可能有點多些工作,但它會提供更可靠的測試設置。你也可以使用Gherkin中描述的場景作爲開發和業務利益相關者之間的溝通工具。如果付款是異步的,利益相關者可能不在乎。他們關心托馬斯可以付款並獲得收據的事實。

+0

謝謝托馬斯的答案!我在這裏要做的是在POC上將SOAPUI測試轉換爲一個更靈活的框架。我選擇黃瓜的原因是我們需要一種更好的方式來表示測試案例的流程,這些測試案例在Soapui中不是很清楚,甚至測試案例的可重用性似乎還有很多工作要做,更不用說新的ReadyApi軟件了。一場噩夢導致了很多崩潰。 – Ani

+0

嗨,托馬斯,我同意你對黃瓜文本的分析,但是如果我不想將外部服務剔除,但將其包含在驗證中(我們是否使用了正確和當前的API進行通信?是否有任何改變? ) – Eddy