2010-05-28 42 views
3

全部,在Ruby中,使用Cucumber,我應該嘲笑調用web服務嗎?

我正在使用Cucumber驗收測試Ruby命令行實用程序。該實用程序從web服務中提取數據。

我明白黃瓜是驗收測試和測試整個堆棧,但我仍然需要提供從web服務的一致的答覆。

我應該嘲笑web服務嗎?如果是,如何?這裏最好的方法是什麼?

乾杯, 戈登

+0

+1;我和你一樣,除了「測試」Web服務並不總是「起來」,我當然不會對「生產」Web服務測試我的代碼。 – Pretzel 2010-05-28 11:23:43

回答

2

所以經過一番思考!然後,我發現FakeWeb有點Google。正是我需要的!

退房Dr Nic's slides - 特別是滑動17

,很容易 - 在不到2小時內,我已經成功地建立起來,重寫我的測試中,得到的一切經過,並檢查它都回來到git的樞紐!

HTH others!

+1

非常好,你得到它的工作!我一定要檢查FakeWeb。 – ponzao 2010-05-28 13:47:07

1

我不是很熟悉Ruby或黃瓜,所以我只能給你關於你的問題非常普遍的答案,它實際上有問題多於答案。

  • Web服務的可靠性如何?如果他們失敗了很多,它會讓你的測試不時失敗,沒有什麼比追逐失敗測試的原因僅僅意識到它再次成爲一個月的時間更令人厭煩了。
  • 您的Web服務能否從測試中獲得重擊?如果您有幾個開發人員經常運行這些測試,並且您的Web服務位於合作伙伴公司的服務器上,他們可能不喜歡您正在測試它們的事實。
  • 你相信他們的輸出嗎?對我來說,不嘲笑依賴關係的最大原因是如果我不知道我準備從服務中獲得什麼樣的數據。如果我使用的服務有充分文件記錄且易於理解,我通常不會嘲笑他們,但如果他們不完全清楚,或者他們經常改變,我建議您對他們進行測試。
  • 嘲笑依賴關係有多難?替換依賴並不總是很容易,特別是如果之後添加測試代碼。幸運的是,在動態語言中,它通常比讓我們說Java更容易。我仍然會考慮構建一個模擬服務需要做多少工作,並以您真正想要的答案作爲響應。
  • 我從嘲笑中獲得多少速度收益?集成測試很慢,嘲笑Web服務依賴性會讓你的測試運行得更快,速度更快嗎?我不知道,但它可能確實很重要。

這些只是幾個點,但至少最後三個我總是考慮之前,選擇嘲笑或不嘲笑。

+1

感謝您的指導ponzao。非常有用的決定是否模擬或不。但它看起來像有人已經爲我做了艱苦的工作。有關詳細信息,請參閱我自己的有關FakeWeb的答案。 – 2010-05-28 13:30:27

0

嘲笑Webservice的

的我會寫周圍的調用應用程序中的web服務的包裝。
實例僞碼

CallWebService (action, options,...) { 
    // Code for connectiong to Webservice 
} 

然後你只需模擬該函數的只是你想其他任何功能

CallWebService (action, options,...) { 
    return true; 
} 

這樣你可以不用理會它是一個web服務嘲笑的WebService的或數據庫連接或其他。你可以讓它返回真實或任何其他。

測試你的代碼是如何從WebService處理響應

要採取這樣的想法一步,讓你的測試更加強大,你可以使用某種測試參數或環境參數來控制會發生什麼嘲笑web服務方法。然後,您可以成功測試您的代碼如何處理來自Web服務的不同響應。
再次在僞代碼:

CallWebService (action, options,...) { 
    if TEST_WEBSERVICE_PARAMETER == CORRUPT_XML 
     return "<xml><</xmy>"; 
    else if TEST_WEBSERVICE_PARAMETER == TIME_OUT 
     return wait(5000); 
    else if TEST_WEBSERVICE_PARAMETER == EMPTY_XML 
     return ""; 
    else if TEST_WEBSERVICE_PARAMETER == REALLY_LONG_XML_RESPONSE 
     return generate_xml_response(1000000); 
} 

並測試匹配:

should_raise_error_on_empty_xml_response_from_webservice() { 
    TEST_WEBSERVICE_PARAMETER = EMPTY_XML; 
    CallWebService(action, option, ...); 
    assert_error_was_raised(EMPTY_RESPONSE_FROM_WEBSERVICE); 
    assert_written_in_log(EMPTY_RESPONSE_LOG_MESSAGE); 
} 
... 

等等,你明白了吧。
請注意,即使我所有的例子都是負面測試用例,這當然也可以用來測試正面測試用例。

請注意,這是一個答案我到類似的問題作出的副本: Mockup webservice for iPhone

好運