2009-05-01 69 views
1

第一次海報和TDD採用者。 :-)我會有點冗長,所以請耐心等待。Webservices的端到端測試

我最近開始使用Apache CXF框架Spring和Commons Chain開發基於SOAP的Web服務來實現業務流。我在這裏面臨的問題是測試Web服務 - 像單元測試和功能測試一樣進行測試。

我在單元測試中的第一次嘗試是完全失敗。爲了保持單元測試的靈活性,我使用了一個Spring XML文件來保存測試數據。另外,我沒有創建要測試的「組件」實例,而是從我的Spring應用程序上下文中檢索它們。包含數據的XML文件很快就失控了;用XML創建對象圖變成了一場噩夢。由於要測試的「組件」是從Spring應用程序上下文中選取的,因此每個測試運行都會加載我應用程序中涉及的組件,使用的DAO對象等。此外,與單元測試案例集中或專注於測試組件,單元測試開始觸及數據庫,與郵件服務器進行通信等。糟糕,非常糟糕。

我知道我做錯了什麼,並開始想辦法糾正它。根據本主板的其中一篇帖子的建議,我查閱了Java嘲笑框架Mockito,以便我可以不使用真正的DAO類和郵件服務器,只是模擬功能。由於單元測試有點受到控制,這引起了我的第二個問題;對數據的依賴。我一直在開發的Web服務幾乎沒有邏輯,但對數據依賴性很強。作爲一個例子,考慮我的組件之一:

public class PaymentScheduleRetrievalComponent implements Command { 
    public boolean execute(Context ctx) { 
    Policy policy = (Policy)ctx.get("POLICY"); 
    List<PaymentSchedule> list = billingDAO.getPaymentStatementForPolicy(policy); 
    ctx.put("PAYMENT_SCHEDULE_LIST", list); 
    return false; 
    } 
} 

大多數我的組件都遵循同樣的路線 - 從上下文選擇一個域對象,打DAO [我們正在使用iBATIS的SQL映射在這裏]並檢索結果。

所以,現在的問題:
- 如何在DAO類ESP測試時,一個插入或更新用可能會留下一個「不穩定」狀態的數據庫[在情況下,假設3插入到不同的表實際上形成一個單一交易]?
- 功能測試Web服務的事實標準是什麼,它圍繞着大量數據移動,即從數據存儲區無意識插入/檢索?

您的個人經驗/評論將不勝感激。請讓我知道,以防我在解釋手邊的問題時遺漏了一些細節。

-sasuke

回答

1

我會建議的內存數據庫針對運行單元測試,如HSQL。您可以使用它來即時創建模式(例如,如果您使用的是Hibernate,則可以使用XML映射文件),然後在單元測試結束之前銷燬數據庫之前根據需要插入/更新/刪除。您的測試在任何時候都不會干擾您的實際數據庫。

對於第二個問題(Web服務的端到端測試),我已經成功地單元測試過基於CXF的服務。訣竅是在測試開始時使用輕量級Web服務器發佈您的Web服務(Jetty是理想的),然後使用CXF將客戶端指向您的Web服務端點,運行您的調用,然後關閉Jetty實例在您的單元測試完成後託管您的Web服務。

爲了實現這一目標,您可以使用JaxWsServerFactoryBean(服務器端)和JaxWsProxyFactoryBean(客戶端)提供了CXF班,看到這個頁面的示例代碼:

http://cwiki.apache.org/CXF20DOC/a-simple-jax-ws-service.html#AsimpleJAX-WSservice-Publishingyourservice

我也給對SOAP UI進行功能測試的重要工具。 JMeter對於Web服務的壓力測試也非常有用,這對於那些進行數據庫查詢的服務來說是特別重要的。

+0

使用JaxWsServerFactoryBean的簡單Junit規則:https:/ /github.com/skjolber/mockito-soap-cxf – ThomasRS 2016-11-24 12:56:01

1

首先:有沒有你要檢索的Spring應用程序上下文中測試(SUT)這個問題的原因是什麼?對於高效的單元測試,您應該能夠在沒有上下文的情況下創建SUT。聽起來你在某處有一些隱藏的依賴關係。這可能是你頭痛的根源。

如何DAO類ESP測試時 單個插入或更新用可能 留下一個「不穩定」 狀態的數據庫[在情況下,假設3 插入到不同的表 實際上形成一個單一的交易] ?

在運行測試後,您似乎很擔心數據庫的一致性。如果可能的話,使用自己的數據庫進行測試,在那裏你不需要關心它。如果你有這樣的沙箱數據庫,你可以根據需要刪除數據。在這種情況下,我會執行以下操作:

  1. 用一些通用標識符標記所有假數據,例如爲字段添加特殊前綴。
  2. 在運行測試之前,刪除刪除語句,刪除標記的數據。如果沒有,那麼沒有什麼不好的事情發生。
  3. 運行您的單個DAO測試。之後重複步驟2.進行下一個測試。

什麼是 功能測試的Web服務, 移動的事實上的標準各地大量的數據,即 盲目插入/從 數據存儲檢索?

我不知道任何。從你所問的問題中,我可以推斷出你有一方面是Web服務,另一方是數據庫。分解責任。爲每一方都有獨立的測試套件。一方只是測試數據庫訪問(如上所述)。另一方面只是測試Web服務請求和響應。在這種情況下,它支付存根/僞造/模擬與網絡交談的層。或考慮https://wsunit.dev.java.net/

如果程序只是推進數據進出,我認爲沒有太多的行爲。如果是這種情況,那麼最難的工作是單元測試數據庫端和Web服務端。關鍵是你可以做單元測試,而不需要「現實」的數據。對於功能測試,您將需要手寫的數據,這接近實際。這可能很麻煩,但如果您已經單元測試了數據庫和Web服務部件,這應該大大減少對「實際」測試用例的需求。

0

我必須說我並不真正瞭解 您確切的問題。問題 在運行 測試後,數據庫是否處於 更改的狀態?

是的,這裏實際存在兩個問題。首先是運行測試用例後數據庫處於不一致狀態的問題。第二個是我正在尋找一個優雅的Web服務端到端測試解決方案。

對於高效的單元測試,您應該能夠在沒有 上下文的情況下創建SUT。這聽起來像你在某處有一些隱藏的依賴關係 。那 可能是你頭痛的一些根源。

這確實是我頭痛的根本原因,現在我正要用一個嘲諷框架的幫助來消除這個問題。

看來你是擔心 數據庫的constistency你有 運行測試後。如果可能,請使用 自己的數據庫進行測試,其中 不需要關心它。如果您有 這樣的沙盒數據庫,您可以根據需要刪除 數據。

這的確是解決我在以前的文章中提到的問題之一,但在其數據庫/數據是不是在你的控制遺留系統集成時,這可能不是在所有情況下工作ESP以及在某些DAO方法要求某些數據已經存在於給定的一組表中的情況下。我應該看看像DBUnit這樣的數據庫單元測試框架嗎?

在這種情況下,它支付 存根/假/嘲笑交談 網絡層。或考慮 https://wsunit.dev.java.net/

啊,看起來很有趣。我也聽說過SOAPUI等可用於功能測試的工具。這裏有人有這種工具的成功嗎?

感謝所有的解答和道歉模棱兩可的解釋;英語不是我的第一語言。

-sasuke

1

首先,把事情弄清楚。

在一個理想的世界,你正在構建軟件的生命週期是這樣的: - SY使得與客戶的報告,這樣你就得到了一個用戶故事有關程序應該如何工作 例子 - 你概括用戶故事,所以你有規則,你稱爲用例 - 你開始寫一個功能(端到端)測試,並失敗... - 之後,你建立用戶界面和模擬出服務,所以你得到了一個綠色的功能測試和一個關於你的服務應該如何工作的規範...... - 你的工作是保持功能測試爲綠色,並逐步實現服務,編寫集成測試,並嘲笑依賴直到達到單位t的水平ests - 之後,您將對用例進行下一次迭代,編寫下一個功能測試,直到項目結束 - 之後,您將與接受該產品的客戶進行驗收測試,並支付一個很多

那麼,爲什麼我們從中學到了:

  • 有許多類型的測試(不互相混淆)
    • 功能測試 - 用於測試使用情況(模擬出沒有)
    • 集成測試 - 用於測試應用程序,組件,模塊,類交互(模擬出不相關的組件)
    • 單元測試 - 用於測試與其環境隔離的單個類(模擬出所有內容)
    • 用戶驗收測試 - 她接受產品(手動功能測試或自動功能測試在工作中的演示)
  • 您不需要通過功能測試和集成測試來測試所有內容,因爲這是不可能的。通過功能和集成測試只測試相關部分,並通過單元測試測試所有內容!熟悉testing pyramid
  • 使用TDD,它使生活更輕鬆!
  • 如何DAO類ESP測試時,一個插入或更新用可能使數據庫處於「不穩定」狀態[在情況下,讓我們 說3插入到不同的表實際上形成一個 交易]?

您不必測試數據庫事務。假設它們工作正常,因爲數據庫開發人員已經對它們進行了測試,並且我相信您不想編寫併發性測試... Db是外部組件,因此您不必親自測試它。您可以編寫數據訪問層以使數據存儲適應您的系統,並僅爲這些適配器編寫集成測試。在數據庫遷移的情況下,這些測試也可以通過新數據庫的適配器工作,因爲您編寫它們以實現特定的接口...通過任何其他測試(功能測試除外),您可以嘲笑數據訪問層。對所有其他外部組件也一樣,寫適配器並將它們模擬出來。將這些集成測試放到與其他測試不同的測試套件中,因爲它們由於數據庫訪問,文件系統訪問等而速度很慢......

  • 什麼是它周圍很多從數據存儲中的數據,即無意識的插入/檢索 的移動功能測試Web服務的事實標準?

你可以模擬出你的數據存儲與中實現相同的存儲適配器內存數據庫,直到你實現一切,除了數據庫的人。之後,您將實現數據庫的數據訪問層,並使用功能測試對其進行測試。它會很慢,但它只能運行一次,例如每次發佈新版本......如果您需要通過開發來進行功能測試,那麼您可以再次使用內存解決方案進行嘲諷...另一種方法是僅運行受影響的功能測試,通過開發或修改測試數據庫的設置以使事情更快,等等......我確信有很多測試優化解決方案......