2013-04-17 40 views
13

您如何使用Karma Runner(前Testacular)e2e場景運行器在e2e測試中集成場外/應用外/外部資源工作流程?Can Angular場景e2e測試集成了一個外部資源工作流程

基本情況:

  1. App有按鈕。
  2. 點擊按鈕發送數據到服務提供商X(例如提交到http://service/submit或其他)。
  3. 提供者X需要在此URL上點擊/提交/操作
  4. 供應商X然後發送回我們的應用程序。

我不是在問「你如何存根提供者X」。我在問你如何實際上端到端測試這個 - 所以我們的測試實際上可以捕獲第三方服務API中斷的變化。我基本上是希望能夠推出一個應用外網站,類似於您可以使用諸如Selenium's Webdriver之類的東西。

目前我的問題是使用element(ref).click()來嘗試第2步,它似乎沒有加載所需的站點,所以沒有DOM的行爲,沒有辦法完成e2e。

回答

17

可能無法使用Karma執行此方案。我會理解Karma是如何工作的,它如何與Webdriver相比,以及實現這種情況需要做什麼。

首先,重要的是要記住,噶瑪和角度場景不是一回事。 Karma是運行基於瀏覽器的測試的通用shell。它啓動瀏覽器進程,啓動節點以提供包含測試工具的網頁,通過在WebSocket上發送命令來運行測試,然後收集結果。關於運行測試的實際線束/框架是不可知的。它具有Angular場景運行器(用於Angular e2e測試),Jasmine(常用於Angular單元測試)和其他流行的JavaScript測試框架的適配器。

測試運行程序(如Jasmine)在與測試代碼相同的窗口上下文中執行,這就是爲什麼它對單元測試有用。相反,Angular情景分析人員與被測試系統有着密切的關係。它將整個應用程序加載到一個iframe中,然後在大多數情況下模擬用戶事件並測試暴露的DOM元素的斷言。

由於場景跑步者通過iframe邊界與應用程序交互,因此受瀏覽器的同域策略限制。無法爲http://localhost:8000上的場景運行者提供服務,然後在iframe中加載http://yourapp,然後在該iframe內觸發事件。

解決此問題的一種方法是將場景運行器簡單託管在與應用程序相同的服務器上。下面是一個簡單的例子:

http://plnkr.co/edit/rfqpSq?p=preview

臨時抱佛腳一個測試運行到應用程序中不是很令人滿意,雖然。 Karma通過內置的HTTP代理爲您解決這個問題。您可以將Karma配置爲代理任意數量的不同服務器,以使它們看起來都來自同一個來源。簡單地將它們添加到配置文件的proxies部分:

proxies = { 
    '/': 'http://yourapp/', 
    '/service/': 'http://service/' 
} 

這使您的端對端測試跨域,但美中不足的是,當域的傳送通過表單提交時或重定向,它有請訪問代理網址。否則,場景運行者將失去對iframe的控制,並且將無法繼續測試。

請注意,Selenium Webdriver不具備此限制。它運行於以上的個別瀏覽器窗口的級別,所以它不受同一域名政策的約束。

讓我們來看看您的具體情況。在實際的HTTP請求和響應方面,我假定這是要鍛鍊流量:

  1. http://yoursite/yourapp.html
  2. 用戶負載的應用程序提交表單,看起來像:
<form method="POST" action="http://service/remotesubmission"> 
    ...your form... 
    <input type="submit"> 
</form> 
  1. 提供商X處理遠程POST,然後在重定向到一種形式:
<form method="POST" action="http://service/nextsubmission"> 
    ...provider's form... 
    <input type="submit"> 
</form> 
  1. Provider X處理表單POST,然後重定向回您的appp。

如果這是實際的情況,那麼我認爲,只有這樣,你能與噶和角場景亞軍這項工作將是:

  1. 條件化表單中的操作URL等等它在測試時指向外部服務的代理URL。
  2. 確保提供程序流中的重定向和操作URL保持在代理路徑中。我不認爲目前是可行的,但也許可以通過一種方式來設置代理內容的替代模式。
+0

很好的答案卡爾,謝謝。我們得出了類似的結論,只是希望有一個更簡單的選擇。將這個開放一兩天,否則將接受這個答案。 – papercowboy